[ONOS-5151] type cloning bug fix

Change-Id: I23371a6422048e79eda1ec7d4a60df84bdf72aa6
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
index d4e3065..3f56140 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
@@ -46,7 +46,7 @@
  */
 public class YangIdentityRef
         extends YangNode
-        implements Parsable, Resolvable, Serializable, LocationInfo {
+        implements Cloneable, Parsable, Resolvable, Serializable, LocationInfo {
 
     private static final long serialVersionUID = 806201692L;
 
@@ -261,4 +261,10 @@
         isIdentityForInterFileGroupingResolution = identityForInterFileGroupingResolution;
     }
 
+    @Override
+    public YangIdentityRef clone()
+            throws CloneNotSupportedException {
+        YangIdentityRef identityRef = (YangIdentityRef) super.clone();
+        return identityRef;
+    }
 }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafRef.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafRef.java
index e29a84f..764e37c 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafRef.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafRef.java
@@ -16,18 +16,18 @@
 
 package org.onosproject.yangutils.datamodel;
 
-import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
-import org.onosproject.yangutils.datamodel.utils.Parsable;
-import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
-import org.onosproject.yangutils.datamodel.utils.YangConstructType;
-import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
-
 import java.io.Serializable;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.datamodel.utils.Parsable;
+import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
+import org.onosproject.yangutils.datamodel.utils.YangConstructType;
+import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
+
 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED;
 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED;
 import static org.onosproject.yangutils.datamodel.utils.YangErrMsgConstants.DATA_MISSING_ERROR_TAG;
@@ -47,7 +47,8 @@
  *
  * @param <T> YANG leafref info
  */
-public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangIfFeatureHolder,
+public class YangLeafRef<T>
+        implements Cloneable, Parsable, Resolvable, Serializable, YangIfFeatureHolder,
         YangXPathResolver, YangAppErrorHolder, LocationInfo {
 
     private static final long serialVersionUID = 286201644L;
@@ -155,6 +156,7 @@
     public void setParentNodeOfLeafref(YangNode parentNodeOfLeafref) {
         this.parentNodeOfLeafref = parentNodeOfLeafref;
     }
+
     /**
      * YANG application error information.
      */
@@ -320,12 +322,14 @@
     }
 
     @Override
-    public void validateDataOnEntry() throws DataModelException {
+    public void validateDataOnEntry()
+            throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
 
     @Override
-    public void validateDataOnExit() throws DataModelException {
+    public void validateDataOnExit()
+            throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
 
@@ -350,7 +354,8 @@
     }
 
     @Override
-    public Object resolve() throws DataModelException {
+    public Object resolve()
+            throws DataModelException {
 
         if (getReferredLeafOrLeafList() == null) {
             throw new DataModelException("Linker Error: The leafref does not refer to any leaf/leaf-list.");
@@ -371,7 +376,8 @@
      * @return status of resolution
      * @throws DataModelException a violation of data model rules
      */
-    private ResolvableStatus getResolution() throws DataModelException {
+    private ResolvableStatus getResolution()
+            throws DataModelException {
 
         if (getReferredLeafOrLeafList() instanceof YangLeaf) {
             YangLeaf yangLeaf = ((YangLeaf) getReferredLeafOrLeafList());
@@ -516,4 +522,11 @@
     public void setCharPosition(int charPositionInLine) {
         this.charPositionInLine = charPositionInLine;
     }
+
+    @Override
+    public YangLeafRef<T> clone()
+            throws CloneNotSupportedException {
+        YangLeafRef<T> clonedLeafRef = (YangLeafRef<T>) super.clone();
+        return clonedLeafRef;
+    }
 }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
index 1696893..0a5177d 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
@@ -17,6 +17,7 @@
 
 import java.io.Serializable;
 import java.util.Map;
+
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.datamodel.utils.Parsable;
 
@@ -322,7 +323,7 @@
      * @param childSchemaMapHolder child schema map holder
      */
     private void processAdditionOfSchemaNodeToMap(String name, String namespace, YangSchemaNode yangSchemaNode,
-                                                  YangNode childSchemaMapHolder) {
+            YangNode childSchemaMapHolder) {
         // Addition of node to schema node map.
         // Create YANG schema node identifier with child node name.
         YangSchemaNodeIdentifier yangSchemaNodeIdentifier = new YangSchemaNodeIdentifier();
@@ -583,7 +584,7 @@
      * @throws DataModelException a violation in data model rule
      */
     public abstract void addToChildSchemaMap(YangSchemaNodeIdentifier schemaNodeIdentifier,
-                                             YangSchemaNodeContextInfo yangSchemaNodeContextInfo)
+            YangSchemaNodeContextInfo yangSchemaNodeContextInfo)
             throws DataModelException;
 
     /**
@@ -607,7 +608,7 @@
      * @param yangSchemaNode           YANG schema node
      */
     public abstract void addToDefaultChildMap(YangSchemaNodeIdentifier yangSchemaNodeIdentifier,
-                                              YangSchemaNode yangSchemaNode);
+            YangSchemaNode yangSchemaNode);
 
     /**
      * Returns default child map.
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
index 80c53ec..ecc9184 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
@@ -64,7 +64,7 @@
  * @param <T> YANG data type info
  */
 public class YangType<T>
-        implements Parsable, Resolvable, Serializable, LocationInfo {
+        implements Cloneable, Parsable, Resolvable, Serializable, LocationInfo {
 
     private static final long serialVersionUID = 8062016054L;
 
@@ -561,4 +561,12 @@
     public void setTypeNotResolvedTillRootNode(boolean typeNotResolvedTillRootNode) {
         isTypeNotResolvedTillRootNode = typeNotResolvedTillRootNode;
     }
+
+    @Override
+    public YangType<T> clone()
+            throws CloneNotSupportedException {
+        YangType<T> clonedNode = (YangType<T>) super.clone();
+        return clonedNode;
+    }
+
 }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
index 5acbc60..fd38fa5 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
@@ -423,6 +423,7 @@
         int charPosition;
         YangDataTypes dataTypes = clonedLeaf.getDataType().getDataType();
         YangEntityToResolveInfoImpl yangEntityToResolveInfo = new YangEntityToResolveInfoImpl();
+
         switch (dataTypes) {
             case LEAFREF:
                 YangLeafRef leafRefForCloning = (YangLeafRef) clonedLeaf.getDataType().getDataTypeExtendedInfo();
@@ -433,6 +434,7 @@
                 lineNumber = leafRefForCloning.getCharPosition();
                 charPosition = leafRefForCloning.getLineNumber();
                 break;
+
             case IDENTITYREF:
                 YangIdentityRef identityRef = (YangIdentityRef) clonedLeaf.getDataType().getDataTypeExtendedInfo();
                 if (identityRef.isIdentityForInterFileGroupingResolution()) {
@@ -442,6 +444,7 @@
                 lineNumber = identityRef.getCharPosition();
                 charPosition = identityRef.getLineNumber();
                 break;
+
             case DERIVED:
                 YangType type = clonedLeaf.getDataType();
                 if (type.isTypeForInterFileGroupingResolution()) {
@@ -451,9 +454,11 @@
                 lineNumber = type.getCharPosition();
                 charPosition = type.getLineNumber();
                 break;
+
             default:
                 return null;
         }
+
         yangEntityToResolveInfo.setHolderOfEntityToResolve((YangNode) leafParentHolder);
         yangEntityToResolveInfo.setCharPosition(charPosition);
         yangEntityToResolveInfo.setLineNumber(lineNumber);
@@ -583,9 +588,14 @@
                 if (leaf.getDataType().getDataType() == YangDataTypes.ENUMERATION
                         || leaf.getDataType().getDataType() == YangDataTypes.UNION) {
                     try {
-                        updateClonedTypeRef(leaf.getDataType(), leavesHolder);
+                        YangType<?> clonedType = leaf.getDataType().clone();
+                        updateClonedTypeRef(clonedType, leavesHolder);
+                        leaf.setDataType(clonedType);
                     } catch (DataModelException e) {
                         throw e;
+                    } catch (CloneNotSupportedException e) {
+                        e.printStackTrace();
+                        throw new DataModelException("Could not clone Type node");
                     }
                 }
             }
@@ -598,9 +608,14 @@
                 if (leafList.getDataType().getDataType() == YangDataTypes.ENUMERATION
                         || leafList.getDataType().getDataType() == YangDataTypes.UNION) {
                     try {
-                        updateClonedTypeRef(leafList.getDataType(), leavesHolder);
+                        YangType<?> clonedType = leafList.getDataType().clone();
+                        updateClonedTypeRef(clonedType, leavesHolder);
+                        leafList.setDataType(clonedType);
                     } catch (DataModelException e) {
                         throw e;
+                    } catch (CloneNotSupportedException e) {
+                        e.printStackTrace();
+                        throw new DataModelException("Could not clone Type node");
                     }
                 }
             }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
index 74dec9d..334a92d 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
@@ -21,6 +21,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+
 import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
index 8f7a08a..31e4c3e 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
@@ -21,6 +21,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Stack;
+
 import org.onosproject.yangutils.datamodel.Resolvable;
 import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.TraversalType;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangXpathLinker.java b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangXpathLinker.java
index 82301a2..89d2dbe 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangXpathLinker.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangXpathLinker.java
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Stack;
+
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangCase;