[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;