[ONOS-4894][ONOS-4890][ONOS-4887][ONOS-4923]extension and argument
datamodel and listener + defect fix

Change-Id: Icefe046d9848935bb6c40a6d7688feb084edd65d
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
index bb3c3cc..6677a8c 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
@@ -354,7 +354,7 @@
     @Override
     public void detectCollidingChild(String identifierName, YangConstructType dataType)
             throws DataModelException {
-        if (!(getParent() instanceof YangChoice)) {
+        if (!(getParent() instanceof YangChoice || getParent() instanceof YangAugment)) {
             throw new DataModelException("Internal Data Model Tree Error: Invalid/Missing holder in case " +
                     getName());
         }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangExtension.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangExtension.java
new file mode 100644
index 0000000..b22f6d1
--- /dev/null
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangExtension.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.datamodel;
+
+import java.io.Serializable;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.datamodel.utils.Parsable;
+import org.onosproject.yangutils.datamodel.utils.YangConstructType;
+
+/*-
+ * Reference RFC 6020.
+ *
+ * The "extension" statement allows the definition of new statements
+ * within the YANG language.  This new statement definition can be
+ * imported and used by other modules.
+ *
+ * The statement's argument is an identifier that is the new keyword for
+ * the extension and must be followed by a block of sub-statements that
+ * holds detailed extension information.  The purpose of the "extension"
+ * statement is to define a keyword, so that it can be imported and used
+ * by other modules.
+ *
+ * The extension can be used like a normal YANG statement, with the
+ * statement name followed by an argument if one is defined by the
+ * extension, and an optional block of sub-statements.  The statement's
+ * name is created by combining the prefix of the module in which the
+ * extension was defined, a colon (":"), and the extension's keyword,
+ * with no interleaving whitespace.  The sub-statements of an extension
+ * are defined by the extension, using some mechanism outside the scope
+ * of this specification.  Syntactically, the sub-statements MUST be YANG
+ * statements, or also defined using "extension" statements.
+ *
+ * The extension's Sub-statements
+ *
+ *                +--------------+---------+-------------+------------------+
+ *                | substatement | section | cardinality |data model mapping|
+ *                +--------------+---------+-------------+------------------+
+ *                | description  | 7.19.3  | 0..1        | -string          |
+ *                | reference    | 7.19.4  | 0..1        | -string          |
+ *                | status       | 7.19.2  | 0..1        | -YangStatus      |
+ *                | argument     | 7.17.2  | 0..1        | -string          |
+ *                +--------------+---------+-------------+------------------+
+ */
+
+/**
+ * Represents data model node to maintain information defined in YANG extension.
+ */
+public class YangExtension
+        implements YangCommonInfo, Serializable, Parsable {
+
+    private static final long serialVersionUID = 806201605L;
+
+    /**
+     * Name of the extension.
+     */
+    private String name;
+
+    /**
+     * Name of the argument.
+     */
+    private String argumentName;
+
+    /**
+     * Description of extension.
+     */
+    private String description;
+
+    /**
+     * Reference of the extension.
+     */
+    private String reference;
+
+    /**
+     * Status of the extension.
+     */
+    private YangStatusType status = YangStatusType.CURRENT;
+
+    /**
+     * Returns the YANG name of extension.
+     *
+     * @return the name of extension as defined in YANG file
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Sets the YANG name of extension.
+     *
+     * @param name the name of extension as defined in YANG file
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Returns the YANG argument name of extension.
+     *
+     * @return the name of argument as defined in YANG file
+     */
+    public String getArgumentName() {
+        return argumentName;
+    }
+
+    /**
+     * Sets the YANG argument name of extension.
+     *
+     * @param argumentName the name of argument as defined in YANG file
+     */
+    public void setArgumentName(String argumentName) {
+        this.argumentName = argumentName;
+    }
+
+    /**
+     * Returns the description.
+     *
+     * @return the description
+     */
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Sets the description.
+     *
+     * @param description set the description
+     */
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Returns the textual reference.
+     *
+     * @return the reference
+     */
+    @Override
+    public String getReference() {
+        return reference;
+    }
+
+    /**
+     * Sets the textual reference.
+     *
+     * @param reference the reference to set
+     */
+    @Override
+    public void setReference(String reference) {
+        this.reference = reference;
+    }
+
+    /**
+     * Returns the status.
+     *
+     * @return the status
+     */
+    @Override
+    public YangStatusType getStatus() {
+        return status;
+    }
+
+    /**
+     * Sets the status.
+     *
+     * @param status the status to set
+     */
+    @Override
+    public void setStatus(YangStatusType status) {
+        this.status = status;
+    }
+
+    /**
+     * Returns the type of the data.
+     *
+     * @return returns EXTENSION_DATA
+     */
+    @Override
+    public YangConstructType getYangConstructType() {
+        return YangConstructType.EXTENSION_DATA;
+    }
+
+    /**
+     * Validates the data on entering the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules
+     */
+    @Override
+    public void validateDataOnEntry()
+            throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /**
+     * Validates the data on exiting the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules
+     */
+    @Override
+    public void validateDataOnExit()
+            throws DataModelException {
+        // TODO : to be implemented
+    }
+}
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 81bbd41..f9b1e87 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
@@ -231,6 +231,11 @@
     private List<YangResolutionInfo> augmentResolutionList;
 
     /**
+     * extension list.
+     */
+    private List<YangExtension> extensionList;
+
+    /**
      * Creates a YANG node of module type.
      */
     public YangModule() {
@@ -247,6 +252,7 @@
         includeList = new LinkedList<YangInclude>();
         listOfLeaf = new LinkedList<YangLeaf>();
         listOfLeafList = new LinkedList<YangLeafList>();
+        extensionList = new LinkedList<YangExtension>();
     }
 
     /**
@@ -557,6 +563,33 @@
     }
 
     /**
+     * Adds extension in extension list.
+     *
+     * @param extension the extension to be added
+     */
+    public void addExtension(YangExtension extension) {
+        getExtensionList().add(extension);
+    }
+
+    /**
+     * Returns the extension list.
+     *
+     * @return the extension list
+     */
+    public List<YangExtension> getExtensionList() {
+        return extensionList;
+    }
+
+    /**
+     * Sets the extension list.
+     *
+     * @param extensionList the list of extension
+     */
+    public void setExtensionList(List<YangExtension> extensionList) {
+        this.extensionList = extensionList;
+    }
+
+    /**
      * Returns the type of the parsed data.
      *
      * @return returns MODULE_DATA
@@ -639,7 +672,7 @@
             leafrefResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_BASE) {
             baseResolutionList.add(resolutionInfo);
-        } else if (type ==  ResolvableType.YANG_AUGMENT) {
+        } else if (type == ResolvableType.YANG_AUGMENT) {
             augmentResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_IDENTITYREF) {
             identityrefResolutionList.add(resolutionInfo);
@@ -659,7 +692,7 @@
             leafrefResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_BASE) {
             baseResolutionList = resolutionList;
-        } else if (type ==  ResolvableType.YANG_AUGMENT) {
+        } else if (type == ResolvableType.YANG_AUGMENT) {
             augmentResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_IDENTITYREF) {
             identityrefResolutionList = resolutionList;
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
index 438dc1f..f8bec7c 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
@@ -224,6 +224,11 @@
     private List<YangResolutionInfo> identityrefResolutionList;
 
     /**
+     * extension list.
+     */
+    private List<YangExtension> extensionList;
+
+    /**
      * Augment resolution list.
      */
     private List<YangResolutionInfo> augmentResolutionList;
@@ -244,6 +249,7 @@
         includeList = new LinkedList<YangInclude>();
         listOfLeaf = new LinkedList<YangLeaf>();
         listOfLeafList = new LinkedList<YangLeafList>();
+        extensionList = new LinkedList<YangExtension>();
     }
 
     /**
@@ -601,7 +607,7 @@
             leafrefResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_BASE) {
             baseResolutionList.add(resolutionInfo);
-        } else if (type ==  ResolvableType.YANG_AUGMENT) {
+        } else if (type == ResolvableType.YANG_AUGMENT) {
             augmentResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_IDENTITYREF) {
             identityrefResolutionList.add(resolutionInfo);
@@ -621,7 +627,7 @@
             leafrefResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_BASE) {
             baseResolutionList = resolutionList;
-        } else if (type ==  ResolvableType.YANG_AUGMENT) {
+        } else if (type == ResolvableType.YANG_AUGMENT) {
             augmentResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_IDENTITYREF) {
             identityrefResolutionList = resolutionList;
@@ -684,4 +690,31 @@
     public void setListOfFeature(List<YangFeature> listOfFeature) {
         this.listOfFeature = listOfFeature;
     }
+
+    /**
+     * Adds extension in extension list.
+     *
+     * @param extension the extension to be added
+     */
+    public void addExtension(YangExtension extension) {
+        getExtensionList().add(extension);
+    }
+
+    /**
+     * Returns the extension list.
+     *
+     * @return the extension list
+     */
+    public List<YangExtension> getExtensionList() {
+        return extensionList;
+    }
+
+    /**
+     * Sets the extension list.
+     *
+     * @param extensionList the list of extension
+     */
+    public void setExtensionList(List<YangExtension> extensionList) {
+        this.extensionList = extensionList;
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/YangConstructType.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/YangConstructType.java
index efe5620..e0dd8e3 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/YangConstructType.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/YangConstructType.java
@@ -382,7 +382,12 @@
     /**
      * Identifies the YANG anyxml element parsed data.
      */
-    ANYXML_DATA;
+    ANYXML_DATA,
+
+    /**
+     * Identifies the YANG argument element parsed data.
+     */
+    ARGUMENT_DATA;
 
     /**
      * Returns the YANG construct keyword corresponding to enum values.
@@ -539,6 +544,8 @@
                 return "deviation";
             case ANYXML_DATA:
                 return "anyxml";
+            case ARGUMENT_DATA:
+                return "argument";
             default:
                 return "yang";
         }