[ONOS-4650][ONOS-4726][ONOS-4727] [ONOS-4728]Implement must parser + when parser + feature + if-feature + revision defect fix

Change-Id: I0a3aee6c1c6b72ef7da7f7f565fd0f149fe3fd42
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
index f14cfeb..16348e5 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
@@ -74,7 +74,7 @@
 public class YangModule
         extends YangNode
         implements YangLeavesHolder, YangDesc, YangReference, Parsable, CollisionDetector, YangReferenceResolver,
-        RpcNotificationContainer {
+        RpcNotificationContainer, YangFeatureHolder {
 
     private static final long serialVersionUID = 806201610L;
 
@@ -85,7 +85,7 @@
 
     /**
      * Reference:RFC 6020.
-     * <p>
+     *
      * The "contact" statement provides contact information for the module. The
      * argument is a string that is used to specify contact information for the
      * person or persons to whom technical queries concerning this module should
@@ -96,7 +96,7 @@
 
     /**
      * Reference:RFC 6020.
-     * <p>
+     *
      * The "description" statement takes as an argument a string that contains a
      * human-readable textual description of this definition. The text is
      * provided in a language (or languages) chosen by the module developer; for
@@ -125,13 +125,18 @@
     private List<YangLeafList> listOfLeafList;
 
     /**
+     * List of feature at root level in the module.
+     */
+    private List<YangFeature> listOfFeature;
+
+    /**
      * Name space of the module.
      */
     private YangNameSpace nameSpace;
 
     /**
      * Reference:RFC 6020.
-     * <p>
+     *
      * The "organization" statement defines the party responsible for this
      * module. The argument is a string that is used to specify a textual
      * description of the organization(s) under whose auspices this module was
@@ -201,6 +206,11 @@
     private List<YangResolutionInfo> usesResolutionList;
 
     /**
+     * if-feature resolution list.
+     */
+    private List<YangResolutionInfo> ifFeatureResolutionList;
+
+    /**
      * Creates a YANG node of module type.
      */
     public YangModule() {
@@ -208,6 +218,7 @@
         super(YangNodeType.MODULE_NODE);
         derivedTypeResolutionList = new LinkedList<>();
         usesResolutionList = new LinkedList<>();
+        ifFeatureResolutionList = new LinkedList<>();
         importList = new LinkedList<YangImport>();
         includeList = new LinkedList<YangInclude>();
         listOfLeaf = new LinkedList<YangLeaf>();
@@ -373,6 +384,24 @@
         getListOfLeafList().add(leafList);
     }
 
+    @Override
+    public List<YangFeature> getFeatureList() {
+        return listOfFeature;
+    }
+
+    @Override
+    public void addFeatureList(YangFeature feature) {
+        if (getFeatureList() == null) {
+            setListOfFeature(new LinkedList<>());
+        }
+        getFeatureList().add(feature);
+    }
+
+    @Override
+    public void setListOfFeature(List<YangFeature> listOfFeature) {
+        this.listOfFeature = listOfFeature;
+    }
+
     /**
      * Returns the name space of module elements.
      *
@@ -558,10 +587,11 @@
     public List<YangResolutionInfo> getUnresolvedResolutionList(ResolvableType type) {
         if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) {
             return derivedTypeResolutionList;
-        } else {
+        } else if (type == ResolvableType.YANG_USES) {
             return usesResolutionList;
+        } else {
+            return ifFeatureResolutionList;
         }
-
     }
 
     @Override
@@ -571,6 +601,8 @@
             derivedTypeResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_USES) {
             usesResolutionList.add(resolutionInfo);
+        } else if (type == ResolvableType.YANG_IF_FEATURE) {
+            ifFeatureResolutionList.add(resolutionInfo);
         }
     }
 
@@ -581,6 +613,8 @@
             derivedTypeResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_USES) {
             usesResolutionList = resolutionList;
+        } else if (type == ResolvableType.YANG_IF_FEATURE) {
+            ifFeatureResolutionList.add((YangResolutionInfo) resolutionList);
         }
 
     }