From 2ee9e7e892456543e0e5532f7b0de3774d42e561 Mon Sep 17 00:00:00 2001 From: VinodKumarS-Huawei Date: Wed, 1 Jun 2016 14:30:22 +0530 Subject: [PATCH] [ONOS-4636]YANG Grouping linking bug fix + YANG Code review comment fix Change-Id: I68ee8dd08266a02593e217cef1a9bb010037d673 --- .../yangutils/datamodel/YangAugment.java | 21 +- .../yangutils/datamodel/YangCase.java | 22 +- .../yangutils/datamodel/YangContainer.java | 24 +- .../yangutils/datamodel/YangDerivedInfo.java | 30 +- .../yangutils/datamodel/YangEnumeration.java | 23 +- .../yangutils/datamodel/YangGrouping.java | 21 +- .../yangutils/datamodel/YangInput.java | 26 +- .../yangutils/datamodel/YangLeaf.java | 31 +- .../yangutils/datamodel/YangLeafList.java | 31 +- .../yangutils/datamodel/YangLeavesHolder.java | 14 + .../yangutils/datamodel/YangList.java | 30 +- .../yangutils/datamodel/YangModule.java | 84 +- .../yangutils/datamodel/YangNode.java | 181 -- .../yangutils/datamodel/YangNotification.java | 25 +- .../yangutils/datamodel/YangOutput.java | 26 +- .../yangutils/datamodel/YangSubModule.java | 77 +- .../yangutils/datamodel/YangType.java | 7 +- .../yangutils/datamodel/YangUses.java | 234 ++- .../datamodel/utils/DataModelUtils.java | 36 +- .../linker/{impl => }/Resolvable.java | 2 +- .../linker/{impl => }/ResolvableStatus.java | 2 +- .../yangutils/linker/ResolvableType.java | 33 + .../yangutils/linker/YangLinkingPhase.java | 34 + .../{impl => }/YangReferenceResolver.java | 29 +- .../linker/impl/YangLinkerManager.java | 16 +- .../linker/impl/YangResolutionInfo.java | 44 +- .../impl/listeners/AugmentListener.java | 22 +- .../impl/listeners/LeafListListener.java | 7 +- .../parser/impl/listeners/LeafListener.java | 7 +- .../parser/impl/listeners/ModuleListener.java | 11 +- .../listeners/PatternRestrictionListener.java | 2 +- .../impl/listeners/SubModuleListener.java | 11 +- .../parser/impl/listeners/TypeListener.java | 2 +- .../impl/parserutils/AugmentListenerUtil.java | 2 +- .../plugin/manager/YangFileInfo.java | 2 +- .../plugin/manager/YangUtilManager.java | 12 +- .../tojava/JavaCodeGeneratorUtil.java | 42 +- .../translator/tojava/JavaImportData.java | 44 +- .../tojava/JavaQualifiedTypeInfo.java | 18 +- .../tojava/TempJavaFragmentFiles.java | 276 +-- .../tojava/TempJavaServiceFragmentFiles.java | 78 +- .../tojava/TempJavaTypeFragmentFiles.java | 4 +- .../tojava/javamodel/YangJavaGrouping.java | 40 +- .../tojava/javamodel/YangJavaRpc.java | 280 ++- .../tojava/javamodel/YangJavaUses.java | 81 +- .../tojava/utils/AttributesJavaDataType.java | 127 +- .../tojava/utils/JavaExtendsListHolder.java | 14 +- .../tojava/utils/JavaFileGeneratorUtils.java | 170 +- .../utils/TempJavaCodeFragmentFilesUtils.java | 62 +- .../tojava/utils/YangJavaModelUtils.java | 35 +- .../yangutils/utils/UtilConstants.java | 16 + .../yangutils/utils/io/impl/YangIoUtils.java | 43 +- .../linker/InterFileLinkingTest.java | 147 +- .../linker/IntraFileTypeLinkingTest.java | 4 +- .../linker/IntraFileUsesLinkingTest.java | 335 ++-- .../linker/RestrictionResolutionTest.java | 2 +- .../parser/impl/TreeWalkListenerTest.java | 1 + .../PatternRestrictionListenerTest.java | 1 + .../ietf-inet-types.yang | 12 + .../ietf-network-topology.yang | 34 + .../ietf-te-topology.yang | 17 + .../groupingNodeSameAsModule/portpair.yang | 29 + .../interfileietf/ietf-inet-types.yang | 454 +++++ .../interfileietf/ietf-network-topology.yang | 260 +++ .../resources/interfileietf/ietf-network.yang | 200 ++ .../interfileietf/ietf-schedule.yang | 64 + .../interfileietf/ietf-te-topology.yang | 1730 +++++++++++++++++ .../interfileietf/ietf-te-types.yang | 853 ++++++++ .../interfileietf/ietf-yang-types.yang | 490 +++++ .../ietf-network.yang | 14 + .../ietf-te-topology.yang | 51 + .../usesInContainer/GroupingError.yang | 64 + 72 files changed, 6164 insertions(+), 1109 deletions(-) rename utils/yangutils/src/main/java/org/onosproject/yangutils/linker/{impl => }/Resolvable.java (97%) rename utils/yangutils/src/main/java/org/onosproject/yangutils/linker/{impl => }/ResolvableStatus.java (96%) create mode 100644 utils/yangutils/src/main/java/org/onosproject/yangutils/linker/ResolvableType.java create mode 100644 utils/yangutils/src/main/java/org/onosproject/yangutils/linker/YangLinkingPhase.java rename utils/yangutils/src/main/java/org/onosproject/yangutils/linker/{impl => }/YangReferenceResolver.java (80%) create mode 100644 utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-inet-types.yang create mode 100644 utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-network-topology.yang create mode 100644 utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-te-topology.yang create mode 100644 utils/yangutils/src/test/resources/groupingNodeSameAsModule/portpair.yang create mode 100644 utils/yangutils/src/test/resources/interfileietf/ietf-inet-types.yang create mode 100644 utils/yangutils/src/test/resources/interfileietf/ietf-network-topology.yang create mode 100644 utils/yangutils/src/test/resources/interfileietf/ietf-network.yang create mode 100644 utils/yangutils/src/test/resources/interfileietf/ietf-schedule.yang create mode 100644 utils/yangutils/src/test/resources/interfileietf/ietf-te-topology.yang create mode 100644 utils/yangutils/src/test/resources/interfileietf/ietf-te-types.yang create mode 100644 utils/yangutils/src/test/resources/interfileietf/ietf-yang-types.yang create mode 100644 utils/yangutils/src/test/resources/interfilewithusesreferringtype/ietf-network.yang create mode 100644 utils/yangutils/src/test/resources/interfilewithusesreferringtype/ietf-te-topology.yang create mode 100644 utils/yangutils/src/test/resources/usesInContainer/GroupingError.yang diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java index adac64034e..bd160d1166 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java @@ -79,7 +79,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol /** * Representation of data model node to maintain information defined in YANG augment. */ -public class YangAugment extends YangNode +public class YangAugment + extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector { /** @@ -163,13 +164,15 @@ public class YangAugment extends YangNode } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (this.getName().equals(identifierName)) { throw new DataModelException("YANG file error: Duplicate input identifier detected, same as input \"" + this.getName() + "\""); @@ -191,7 +194,8 @@ public class YangAugment extends YangNode * * @param leafsList the list of leaf to set */ - private void setListOfLeaf(List leafsList) { + @Override + public void setListOfLeaf(List leafsList) { listOfLeaf = leafsList; } @@ -224,7 +228,8 @@ public class YangAugment extends YangNode * * @param listOfLeafList the list of leaf-list to set */ - private void setListOfLeafList(List listOfLeafList) { + @Override + public void setListOfLeafList(List listOfLeafList) { this.listOfLeafList = listOfLeafList; } @@ -298,7 +303,8 @@ public class YangAugment extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @@ -308,7 +314,8 @@ public class YangAugment extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java index 6787dc9ca6..abe4b1afa1 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java @@ -88,10 +88,12 @@ import static org.onosproject.yangutils.utils.YangConstructType.CASE_DATA; * | when | 7.19.5 | 0..1 |-TODO | * +--------------+---------+-------------+------------------+ */ + /** * Represents data model node to maintain information defined in YANG case. */ -public class YangCase extends YangNode +public class YangCase + extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { /** @@ -188,7 +190,8 @@ public class YangCase extends YangNode * * @param leafsList the list of leaf to set */ - private void setListOfLeaf(List leafsList) { + @Override + public void setListOfLeaf(List leafsList) { listOfLeaf = leafsList; } @@ -221,7 +224,8 @@ public class YangCase extends YangNode * * @param listOfLeafList the list of leaf-list to set */ - private void setListOfLeafList(List listOfLeafList) { + @Override + public void setListOfLeafList(List listOfLeafList) { this.listOfLeafList = listOfLeafList; } @@ -295,7 +299,8 @@ public class YangCase extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @@ -305,12 +310,14 @@ public class YangCase extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { if (!(getParent() instanceof YangChoice)) { throw new DataModelException("Internal Data Model Tree Error: Invalid/Missing holder in case " + getName()); @@ -320,7 +327,8 @@ public class YangCase extends YangNode } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (dataType == CASE_DATA) { if (getName().equals(identifierName)) { diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java index 39304338d0..ccb824be91 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java @@ -87,7 +87,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol /** * Represents data model node to maintain information defined in YANG container. */ -public class YangContainer extends YangNode +public class YangContainer + extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { /** @@ -211,7 +212,8 @@ public class YangContainer extends YangNode * * @param leafsList the list of leaf to set */ - private void setListOfLeaf(List leafsList) { + @Override + public void setListOfLeaf(List leafsList) { listOfLeaf = leafsList; } @@ -245,7 +247,8 @@ public class YangContainer extends YangNode * * @param listOfLeafList the list of leaf-list to set */ - private void setListOfLeafList(List listOfLeafList) { + @Override + public void setListOfLeafList(List listOfLeafList) { this.listOfLeafList = listOfLeafList; } @@ -338,7 +341,8 @@ public class YangContainer extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @@ -348,7 +352,8 @@ public class YangContainer extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { List leaves = getListOfLeaf(); List leafLists = getListOfLeafList(); @@ -397,7 +402,8 @@ public class YangContainer extends YangNode * @param leafLists list of leaf-list attributes of container * @throws DataModelException a violation of data model rules */ - private void validateConfig(List leaves, List leafLists) throws DataModelException { + private void validateConfig(List leaves, List leafLists) + throws DataModelException { /* * If a node has "config" set to "false", no node underneath it can have @@ -423,13 +429,15 @@ public class YangContainer extends YangNode } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Asks helper to detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (getName().equals(identifierName)) { throw new DataModelException("YANG file error: Duplicate input identifier detected, same as container \"" + getName() + "\""); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangDerivedInfo.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangDerivedInfo.java index 613237afc2..3cfdc38772 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangDerivedInfo.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangDerivedInfo.java @@ -17,7 +17,8 @@ package org.onosproject.yangutils.datamodel; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; -import org.onosproject.yangutils.linker.impl.ResolvableStatus; +import org.onosproject.yangutils.linker.ResolvableStatus; + import com.google.common.base.Strings; import static org.onosproject.yangutils.datamodel.YangDataTypes.BINARY; @@ -30,8 +31,8 @@ import static org.onosproject.yangutils.datamodel.YangDataTypes.IDENTITYREF; import static org.onosproject.yangutils.datamodel.YangDataTypes.LEAFREF; import static org.onosproject.yangutils.datamodel.YangDataTypes.STRING; import static org.onosproject.yangutils.datamodel.YangDataTypes.UNION; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.INTRA_FILE_RESOLVED; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.RESOLVED; +import static org.onosproject.yangutils.linker.ResolvableStatus.INTRA_FILE_RESOLVED; +import static org.onosproject.yangutils.linker.ResolvableStatus.RESOLVED; import static org.onosproject.yangutils.utils.RestrictionResolver.isOfRangeRestrictedType; import static org.onosproject.yangutils.utils.RestrictionResolver.processLengthRestriction; import static org.onosproject.yangutils.utils.RestrictionResolver.processRangeRestriction; @@ -41,7 +42,8 @@ import static org.onosproject.yangutils.utils.RestrictionResolver.processRangeRe * * @param extended information. */ -public class YangDerivedInfo implements LocationInfo { +public class YangDerivedInfo + implements LocationInfo, Cloneable { /** * YANG typedef reference. @@ -224,8 +226,11 @@ public class YangDerivedInfo implements LocationInfo { * @return resolution status * @throws DataModelException a violation in data mode rule */ - public ResolvableStatus resolve() throws DataModelException { + public ResolvableStatus resolve() + throws DataModelException { + YangType baseType = getReferredTypeDef().getTypeDefBaseType(); + /* * Checks the data type of the referred typedef, if it's derived, * obtain effective built-in type and restrictions from it's derived @@ -238,6 +243,7 @@ public class YangDerivedInfo implements LocationInfo { if (baseType.getResolvableStatus() != INTRA_FILE_RESOLVED && baseType.getResolvableStatus() != RESOLVED) { throw new DataModelException("Linker Error: Referred typedef is not resolved for type."); } + /* * Check if the referred typedef is intra file resolved, if yes sets * current status also to intra file resolved . @@ -401,6 +407,7 @@ public class YangDerivedInfo implements LocationInfo { } } } + /* * Check if the data type is the one which can't be restricted, in * this case check whether no self restrictions should be present. @@ -414,6 +421,7 @@ public class YangDerivedInfo implements LocationInfo { throw new DataModelException("YANG file error: Restrictions can't be applied to a given type"); } } + // Throw exception for unsupported types throw new DataModelException("Linker error: Unable to process the derived type."); } @@ -424,7 +432,8 @@ public class YangDerivedInfo implements LocationInfo { * @param refStringRestriction referred string restriction of typedef * @throws DataModelException a violation in data model rule */ - private void resolveStringRestriction(YangStringRestriction refStringRestriction) throws DataModelException { + private void resolveStringRestriction(YangStringRestriction refStringRestriction) + throws DataModelException { YangStringRestriction curStringRestriction = null; YangRangeRestriction refRangeRestriction = null; YangPatternRestriction refPatternRestriction = null; @@ -522,7 +531,8 @@ public class YangDerivedInfo implements LocationInfo { * @return resolved length restriction * @throws DataModelException a violation in data model rule */ - private YangRangeRestriction resolveLengthRestriction(YangRangeRestriction refLengthRestriction) throws + private YangRangeRestriction resolveLengthRestriction(YangRangeRestriction refLengthRestriction) + throws DataModelException { /* @@ -572,7 +582,8 @@ public class YangDerivedInfo implements LocationInfo { * @param curRestriction self restriction */ private void resolveLengthAndRangeRestriction(YangRangeRestriction refRestriction, - YangRangeRestriction curRestriction) throws DataModelException { + YangRangeRestriction curRestriction) + throws DataModelException { for (Object curInterval : curRestriction.getAscendingRangeIntervals()) { if (!(curInterval instanceof YangRangeInterval)) { throw new DataModelException("Linker error: Current range intervals not processed correctly."); @@ -594,7 +605,8 @@ public class YangDerivedInfo implements LocationInfo { * @param refRangeRestriction referred range restriction of typedef * @throws DataModelException a violation in data model rule */ - private void resolveRangeRestriction(YangRangeRestriction refRangeRestriction) throws DataModelException { + private void resolveRangeRestriction(YangRangeRestriction refRangeRestriction) + throws DataModelException { /* * Check that string restriction should be null when built-in type is diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangEnumeration.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangEnumeration.java index 9bf924a7fb..38b8266994 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangEnumeration.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangEnumeration.java @@ -31,7 +31,9 @@ import org.onosproject.yangutils.utils.YangConstructType; /** * Represents the enumeration data type information. */ -public class YangEnumeration extends YangNode implements Parsable, CollisionDetector { +public class YangEnumeration + extends YangNode + implements Parsable, CollisionDetector { // Enumeration info set. private SortedSet enumSet; @@ -71,7 +73,8 @@ public class YangEnumeration extends YangNode implements Parsable, CollisionDete * @param enumInfo the ENUM information to be added * @throws DataModelException due to violation in data model rules */ - public void addEnumInfo(YangEnum enumInfo) throws DataModelException { + public void addEnumInfo(YangEnum enumInfo) + throws DataModelException { if (!getEnumSet().add(enumInfo)) { throw new DataModelException("YANG ENUM already exists"); } @@ -113,7 +116,8 @@ public class YangEnumeration extends YangNode implements Parsable, CollisionDete * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @@ -123,21 +127,24 @@ public class YangEnumeration extends YangNode implements Parsable, CollisionDete * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { /* - Do nothing.The implementation for this is not required. + Do nothing, since it is not part of the schema tree, it is only type of an existing node in schema tree. */ } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { /* - Do nothing.The implementation for this is not required. + Do nothing, since it is not part of the schema tree, it is only type of an existing node in schema tree. */ } } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangGrouping.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangGrouping.java index 47abdca113..68f75879a8 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangGrouping.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangGrouping.java @@ -77,7 +77,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol /** * Represents data model node to maintain information defined in YANG grouping. */ -public class YangGrouping extends YangNode +public class YangGrouping + extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector { /** @@ -174,7 +175,8 @@ public class YangGrouping extends YangNode * * @param leafsList the list of leaf to set */ - private void setListOfLeaf(List leafsList) { + @Override + public void setListOfLeaf(List leafsList) { listOfLeaf = leafsList; } @@ -203,7 +205,8 @@ public class YangGrouping extends YangNode * * @param listOfLeafList the list of leaf-list to set */ - private void setListOfLeafList(List listOfLeafList) { + @Override + public void setListOfLeafList(List listOfLeafList) { this.listOfLeafList = listOfLeafList; } @@ -273,7 +276,8 @@ public class YangGrouping extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @@ -283,7 +287,8 @@ public class YangGrouping extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @@ -299,13 +304,15 @@ public class YangGrouping extends YangNode * module. */ @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Asks helper to detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (getName().equals(identifierName)) { throw new DataModelException("YANG file error: Duplicate input identifier detected, same as grouping \"" + getName() + "\""); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangInput.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangInput.java index 4d7f2dfb74..8aceaa49b0 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangInput.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangInput.java @@ -68,7 +68,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol /** * Represents data model node to maintain information defined in YANG input. */ -public class YangInput extends YangNode +public class YangInput + extends YangNode implements YangLeavesHolder, Parsable, CollisionDetector, YangAugmentationHolder { /** @@ -96,13 +97,15 @@ public class YangInput extends YangNode } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (this.getName().equals(identifierName)) { throw new DataModelException("YANG file error: Duplicate input identifier detected, same as input \"" + this.getName() + "\""); @@ -115,12 +118,14 @@ public class YangInput extends YangNode } @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { //TODO: implement the method. } @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { //TODO: implement the method. } @@ -129,6 +134,12 @@ public class YangInput extends YangNode return listOfLeaf; } + @Override + public void setListOfLeaf(List leafsList) { + listOfLeaf = leafsList; + } + + @Override public void addLeaf(YangLeaf leaf) { getListOfLeaf().add(leaf); @@ -139,6 +150,11 @@ public class YangInput extends YangNode return listOfLeafList; } + @Override + public void setListOfLeafList(List listOfLeafList) { + this.listOfLeafList = listOfLeafList; + } + @Override public void addLeafList(YangLeafList leafList) { getListOfLeafList().add(leafList); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java index f59cdcc356..9adeff7813 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java @@ -58,7 +58,7 @@ import org.onosproject.yangutils.utils.YangConstructType; * Represents leaf data represented in YANG. */ public class YangLeaf - implements YangCommonInfo, Parsable { + implements YangCommonInfo, Parsable, Cloneable { /** * Name of leaf. @@ -106,6 +106,11 @@ public class YangLeaf */ private String defaultValueInString; + /** + * YANG Node in which the leaf is contained. + */ + YangLeavesHolder containedIn; + /** * Creates a YANG leaf. */ @@ -280,6 +285,30 @@ public class YangLeaf this.dataType = dataType; } + /** + * Retrieves the YANG node in which the leaf is defined. + * + * @return the YANG node in which the leaf is defined + */ + public YangLeavesHolder getContainedIn() { + return containedIn; + } + + /** + * Assigns the YANG node in which the leaf is defined. + * + * @param containedIn the YANG node in which the leaf is defined + */ + public void setContainedIn(YangLeavesHolder containedIn) { + this.containedIn = containedIn; + } + + @Override + public YangLeaf clone() + throws CloneNotSupportedException { + return (YangLeaf) super.clone(); + } + /** * Returns the type of the parsed data. * diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java index 0e0bc3e7fe..5794420373 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java @@ -54,7 +54,7 @@ import org.onosproject.yangutils.utils.YangConstructType; * Represents leaf-list data represented in YANG. */ public class YangLeafList - implements YangCommonInfo, Parsable { + implements YangCommonInfo, Parsable, Cloneable { /** * Name of leaf-list. @@ -123,6 +123,11 @@ public class YangLeafList */ private YangType dataType; + /** + * YANG Node in which the leaf is contained. + */ + YangLeavesHolder containedIn; + /** * Creates a YANG leaf-list. */ @@ -297,6 +302,30 @@ public class YangLeafList this.dataType = dataType; } + /** + * Retrieves the YANG node in which the leaf is defined. + * + * @return the YANG node in which the leaf is defined + */ + public YangLeavesHolder getContainedIn() { + return containedIn; + } + + /** + * Assigns the YANG node in which the leaf is defined. + * + * @param containedIn the YANG node in which the leaf is defined + */ + public void setContainedIn(YangLeavesHolder containedIn) { + this.containedIn = containedIn; + } + + @Override + public YangLeafList clone() + throws CloneNotSupportedException { + return (YangLeafList) super.clone(); + } + /** * Returns the type of the parsed data. * diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeavesHolder.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeavesHolder.java index 37ecc8fae9..a21ed34baf 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeavesHolder.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangLeavesHolder.java @@ -32,6 +32,13 @@ public interface YangLeavesHolder { */ List getListOfLeaf(); + /** + * Sets the list of leaves. + * + * @param leafsList the list of leaf to set + */ + void setListOfLeaf(List leafsList); + /** * Adds leaf in data holder like container / list. * @@ -46,6 +53,13 @@ public interface YangLeavesHolder { */ List getListOfLeafList(); + /** + * Sets the list of leaf-list. + * + * @param listOfLeafList the list of leaf-list to set + */ + void setListOfLeafList(List listOfLeafList); + /** * Adds leaf-list in data holder like container / list. * diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangList.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangList.java index cd45bdce3e..834a0ad618 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangList.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangList.java @@ -67,7 +67,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol /** * Represents list data represented in YANG. */ -public class YangList extends YangNode +public class YangList + extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { /** @@ -254,7 +255,8 @@ public class YangList extends YangNode * @param key key field name. * @throws DataModelException a violation of data model rules */ - public void addKey(String key) throws DataModelException { + public void addKey(String key) + throws DataModelException { if (getKeyList() == null) { setKeyList(new LinkedList()); } @@ -282,7 +284,8 @@ public class YangList extends YangNode * * @param leafsList the list of leaf to set */ - private void setListOfLeaf(List leafsList) { + @Override + public void setListOfLeaf(List leafsList) { listOfLeaf = leafsList; } @@ -315,7 +318,8 @@ public class YangList extends YangNode * * @param listOfLeafList the list of leaf-list to set */ - private void setListOfLeafList(List listOfLeafList) { + @Override + public void setListOfLeafList(List listOfLeafList) { this.listOfLeafList = listOfLeafList; } @@ -425,7 +429,8 @@ public class YangList extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @@ -435,7 +440,8 @@ public class YangList extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { List keys = getKeyList(); List leaves = getListOfLeaf(); List leafLists = getListOfLeafList(); @@ -493,7 +499,8 @@ public class YangList extends YangNode * @param leafLists list of leaf-list attributes of YANG list * @throws DataModelException a violation of data model rules */ - private void validateConfig(List leaves, List leafLists) throws DataModelException { + private void validateConfig(List leaves, List leafLists) + throws DataModelException { /* * If a node has "config" set to "false", no node underneath it can have @@ -526,7 +533,8 @@ public class YangList extends YangNode * @param keys list of key attributes of list * @throws DataModelException a violation of data model rules */ - private void validateKey(List leaves, List leafLists, List keys) throws + private void validateKey(List leaves, List leafLists, List keys) + throws DataModelException { boolean leafFound = false; List keyLeaves = new LinkedList<>(); @@ -595,13 +603,15 @@ public class YangList extends YangNode } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Asks helper to detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (getName().equals(identifierName)) { throw new DataModelException("YANG file error: Duplicate input identifier detected, same as list \"" + getName() + "\""); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java index 26df1f5eee..11b089d27c 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java @@ -19,9 +19,11 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; + import org.onosproject.yangutils.datamodel.exceptions.DataModelException; import org.onosproject.yangutils.linker.exceptions.LinkerException; -import org.onosproject.yangutils.linker.impl.YangReferenceResolver; +import org.onosproject.yangutils.linker.ResolvableType; +import org.onosproject.yangutils.linker.YangReferenceResolver; import org.onosproject.yangutils.linker.impl.YangResolutionInfo; import org.onosproject.yangutils.parser.Parsable; import org.onosproject.yangutils.plugin.manager.YangFileInfo; @@ -74,7 +76,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLi /** * Represents data model node to maintain information defined in YANG module. */ -public class YangModule extends YangNode +public class YangModule + extends YangNode implements YangLeavesHolder, YangDesc, YangReference, Parsable, CollisionDetector, YangReferenceResolver, RpcNotificationContainer { @@ -85,7 +88,7 @@ public class YangModule extends YangNode /** * Reference:RFC 6020. - *

+ * * 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 +99,7 @@ public class YangModule extends YangNode /** * Reference:RFC 6020. - *

+ * * 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 @@ -131,7 +134,7 @@ public class YangModule extends YangNode /** * Reference:RFC 6020. - *

+ * * 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 @@ -193,7 +196,12 @@ public class YangModule extends YangNode * matching "typedef" or "grouping" statement among the immediate * sub-statements of each ancestor statement. */ - private List unresolvedResolutionList; + private List derivedTypeResolutionList; + + /** + * uses resolution list. + */ + private List usesResolutionList; /** * Creates a YANG node of module type. @@ -201,7 +209,8 @@ public class YangModule extends YangNode public YangModule() { super(YangNodeType.MODULE_NODE); - unresolvedResolutionList = new LinkedList(); + derivedTypeResolutionList = new LinkedList(); + usesResolutionList = new LinkedList(); importList = new LinkedList(); includeList = new LinkedList(); listOfLeaf = new LinkedList(); @@ -326,6 +335,11 @@ public class YangModule extends YangNode return listOfLeaf; } + @Override + public void setListOfLeaf(List leafsList) { + listOfLeaf = leafsList; + } + /** * Adds a leaf in module. * @@ -346,6 +360,12 @@ public class YangModule extends YangNode return listOfLeafList; } + @Override + public void setListOfLeafList(List listOfLeafList) { + this.listOfLeafList = listOfLeafList; + } + + /** * Adds a leaf-list in module. * @@ -413,17 +433,19 @@ public class YangModule extends YangNode } @Override - public void resolveSelfFileLinking() throws DataModelException { + public void resolveSelfFileLinking(ResolvableType type) + throws DataModelException { // Get the list to be resolved. - List resolutionList = getUnresolvedResolutionList(); + List resolutionList = getUnresolvedResolutionList(type); // Resolve linking for a resolution list. resolveLinkingForResolutionList(resolutionList, this); } @Override - public void resolveInterFileLinking() throws DataModelException { + public void resolveInterFileLinking(ResolvableType type) + throws DataModelException { // Get the list to be resolved. - List resolutionList = getUnresolvedResolutionList(); + List resolutionList = getUnresolvedResolutionList(type); // Resolve linking for a resolution list. linkInterFileReferences(resolutionList, this); } @@ -500,7 +522,8 @@ public class YangModule extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { /* * Module is root in the data model tree, hence there is no entry * validation @@ -513,7 +536,8 @@ public class YangModule extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { /* * TODO: perform symbol linking for the imported or included YANG info. * TODO: perform symbol resolution for referred YANG entities. @@ -521,29 +545,47 @@ public class YangModule extends YangNode } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Asks helper to detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { // Not required as module doesn't have any parent. } @Override - public List getUnresolvedResolutionList() { - return unresolvedResolutionList; + public List getUnresolvedResolutionList(ResolvableType type) { + if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) { + return derivedTypeResolutionList; + } else { + return usesResolutionList; + } + } @Override - public void addToResolutionList(YangResolutionInfo resolutionInfo) { - unresolvedResolutionList.add(resolutionInfo); + public void addToResolutionList(YangResolutionInfo resolutionInfo, + ResolvableType type) { + if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) { + derivedTypeResolutionList.add(resolutionInfo); + } else if (type == ResolvableType.YANG_USES) { + usesResolutionList.add(resolutionInfo); + } } @Override - public void setResolutionList(List resolutionList) { - unresolvedResolutionList = resolutionList; + public void setResolutionList(List resolutionList, + ResolvableType type) { + if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) { + derivedTypeResolutionList = resolutionList; + } else if (type == ResolvableType.YANG_USES) { + usesResolutionList = resolutionList; + } + } @Override diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java index 811c76e4e8..f9d5b2680d 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java @@ -16,12 +16,6 @@ package org.onosproject.yangutils.datamodel; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; -import org.onosproject.yangutils.parser.Parsable; -import org.onosproject.yangutils.translator.tojava.TraversalType; - -import static org.onosproject.yangutils.translator.tojava.TraversalType.CHILD; -import static org.onosproject.yangutils.translator.tojava.TraversalType.PARENT; -import static org.onosproject.yangutils.translator.tojava.TraversalType.SIBILING; /** * Represents base class of a node in data model tree. @@ -229,179 +223,4 @@ public abstract class YangNode newChild.setPreviousSibling(curNode); } } - - /** - * Clone the current node contents and create a new node. - * - * @return cloned node - * @throws CloneNotSupportedException clone is not supported by the referred - * node - */ - @Override - public YangNode clone() - throws CloneNotSupportedException { - YangNode clonedNode = (YangNode) super.clone(); - clonedNode.setParent(null); - clonedNode.setChild(null); - clonedNode.setNextSibling(null); - clonedNode.setPreviousSibling(null); - return clonedNode; - } - - /** - * Clone the subtree from the specified source node to the mentioned target - * node. The source and target root node cloning is carried out by the - * caller. - * - * @param srcRootNode source node for sub tree cloning - * @param dstRootNode destination node where the sub tree needs to be cloned - * @throws DataModelException data model error - */ - public static void cloneSubTree(YangNode srcRootNode, YangNode dstRootNode) - throws DataModelException { - - YangNode nextNodeToClone = srcRootNode; - TraversalType curTraversal; - - YangNode clonedTreeCurNode = dstRootNode; - YangNode newNode = null; - - nextNodeToClone = nextNodeToClone.getChild(); - if (nextNodeToClone == null) { - return; - } else { - /** - * Root level cloning is taken care in the caller. - */ - curTraversal = CHILD; - } - - /** - * Caller ensures the cloning of the root nodes - */ - try { - while (nextNodeToClone != srcRootNode) { - if (nextNodeToClone == null) { - throw new DataModelException("Internal error: Cloning failed, source tree null pointer reached"); - } - if (curTraversal != PARENT) { - newNode = nextNodeToClone.clone(); - detectCollisionWhileCloning(clonedTreeCurNode, newNode, curTraversal); - } - - if (curTraversal == CHILD) { - - /** - * add the new node to the cloned tree. - */ - clonedTreeCurNode.addChild(newNode); - - /** - * update the cloned tree's traversal current node as the - * new node. - */ - clonedTreeCurNode = newNode; - } else if (curTraversal == SIBILING) { - - clonedTreeCurNode.addNextSibling(newNode); - clonedTreeCurNode = newNode; - } else if (curTraversal == PARENT) { - clonedTreeCurNode = clonedTreeCurNode.getParent(); - } - - if (curTraversal != PARENT && nextNodeToClone.getChild() != null) { - curTraversal = CHILD; - - /** - * update the traversal's current node. - */ - nextNodeToClone = nextNodeToClone.getChild(); - - } else if (nextNodeToClone.getNextSibling() != null) { - - curTraversal = SIBILING; - - nextNodeToClone = nextNodeToClone.getNextSibling(); - } else { - curTraversal = PARENT; - nextNodeToClone = nextNodeToClone.getParent(); - } - } - } catch (CloneNotSupportedException e) { - throw new DataModelException("Failed to clone the tree"); - } - - } - - /** - * Detects collision when the grouping is deep copied to the uses's parent. - * - * @param currentNode parent/previous sibling node for the new node - * @param newNode node which has to be added - * @param addAs traversal type of the node - * @throws DataModelException data model error - */ - private static void detectCollisionWhileCloning(YangNode currentNode, YangNode newNode, TraversalType addAs) - throws DataModelException { - if (!(currentNode instanceof CollisionDetector) - || !(newNode instanceof Parsable)) { - throw new DataModelException("Node in data model tree does not support collision detection"); - } - - CollisionDetector collisionDetector = (CollisionDetector) currentNode; - Parsable parsable = (Parsable) newNode; - if (addAs == TraversalType.CHILD) { - collisionDetector.detectCollidingChild(newNode.getName(), parsable.getYangConstructType()); - } else if (addAs == TraversalType.SIBILING) { - currentNode = currentNode.getParent(); - if (!(currentNode instanceof CollisionDetector)) { - throw new DataModelException("Node in data model tree does not support collision detection"); - } - collisionDetector = (CollisionDetector) currentNode; - collisionDetector.detectCollidingChild(newNode.getName(), parsable.getYangConstructType()); - } else { - throw new DataModelException("Errored tree cloning"); - } - - } - - /** - * Add a new next sibling. - * - * @param newSibling new sibling to be added - * @throws DataModelException data model error - */ - private void addNextSibling(YangNode newSibling) - throws DataModelException { - - if (newSibling.getNodeType() == null) { - throw new DataModelException("Cloned abstract node cannot be inserted into a tree"); - } - - if (newSibling.getParent() == null) { - /** - * Since the siblings needs to have a common parent, set the parent - * as the current node's parent - */ - newSibling.setParent(getParent()); - - } else { - throw new DataModelException("Node is already part of a tree, and cannot be added as a sibling"); - } - - if (newSibling.getPreviousSibling() == null) { - newSibling.setPreviousSibling(this); - setNextSibling(newSibling); - } else { - throw new DataModelException("New sibling to be added is not atomic, it already has a previous sibling"); - } - - if (newSibling.getChild() != null) { - throw new DataModelException("Sibling to be added is not atomic, it already has a child"); - } - - if (newSibling.getNextSibling() != null) { - throw new DataModelException("Sibling to be added is not atomic, it already has a next sibling"); - } - } } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangNotification.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangNotification.java index 5e81f64b8c..e70261f744 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangNotification.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangNotification.java @@ -74,7 +74,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol /** * Represents data model node to maintain information defined in YANG notification. */ -public class YangNotification extends YangNode +public class YangNotification + extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { /** @@ -117,13 +118,15 @@ public class YangNotification extends YangNode } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (this.getName().equals(identifierName)) { throw new DataModelException("YANG file error: Duplicate input identifier detected, same as notification \"" + this.getName() + "\""); @@ -136,12 +139,14 @@ public class YangNotification extends YangNode } @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { //TODO: implement the method. } @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { //TODO: implement the method. } @@ -160,6 +165,11 @@ public class YangNotification extends YangNode return listOfLeaf; } + @Override + public void setListOfLeaf(List leafsList) { + listOfLeaf = leafsList; + } + @Override public void addLeaf(YangLeaf leaf) { getListOfLeaf().add(leaf); @@ -170,6 +180,11 @@ public class YangNotification extends YangNode return listOfLeafList; } + @Override + public void setListOfLeafList(List listOfLeafList) { + this.listOfLeafList = listOfLeafList; + } + @Override public void addLeafList(YangLeafList leafList) { getListOfLeafList().add(leafList); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java index 97072cf07a..2cb4c34ed9 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java @@ -67,7 +67,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol /** * Represents data model node to maintain information defined in YANG output. */ -public class YangOutput extends YangNode +public class YangOutput + extends YangNode implements YangLeavesHolder, Parsable, CollisionDetector, YangAugmentationHolder { /** @@ -95,13 +96,15 @@ public class YangOutput extends YangNode } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (this.getName().equals(identifierName)) { throw new DataModelException("YANG file error: Duplicate identifier detected, same as output \"" + this.getName() + "\""); @@ -114,12 +117,14 @@ public class YangOutput extends YangNode } @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { //TODO: implement the method. } @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { //TODO: implement the method. } @@ -133,11 +138,22 @@ public class YangOutput extends YangNode getListOfLeaf().add(leaf); } + @Override + public void setListOfLeaf(List leafsList) { + listOfLeaf = leafsList; + } + @Override public List getListOfLeafList() { return listOfLeafList; } + @Override + public void setListOfLeafList(List listOfLeafList) { + this.listOfLeafList = listOfLeafList; + } + + @Override public void addLeafList(YangLeafList leafList) { getListOfLeafList().add(leafList); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java index 7a54aaf192..89c49dd4fb 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java @@ -19,9 +19,11 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; + import org.onosproject.yangutils.datamodel.exceptions.DataModelException; import org.onosproject.yangutils.linker.exceptions.LinkerException; -import org.onosproject.yangutils.linker.impl.YangReferenceResolver; +import org.onosproject.yangutils.linker.ResolvableType; +import org.onosproject.yangutils.linker.YangReferenceResolver; import org.onosproject.yangutils.linker.impl.YangResolutionInfo; import org.onosproject.yangutils.parser.Parsable; import org.onosproject.yangutils.plugin.manager.YangFileInfo; @@ -82,7 +84,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLi /** * Represents data model node to maintain information defined in YANG sub-module. */ -public class YangSubModule extends YangNode +public class YangSubModule + extends YangNode implements YangLeavesHolder, YangDesc, YangReference, Parsable, CollisionDetector, YangReferenceResolver, RpcNotificationContainer { @@ -156,6 +159,7 @@ public class YangSubModule extends YangNode * Prefix of parent module. */ private String prefix; + /*- * Reference RFC 6020. * @@ -190,14 +194,20 @@ public class YangSubModule extends YangNode * matching "typedef" or "grouping" statement among the immediate * sub-statements of each ancestor statement. */ - private List unresolvedResolutionList; + private List derivedTypeResolutionList; + + /** + * uses resolution list. + */ + private List usesResolutionList; /** * Creates a sub module node. */ public YangSubModule() { super(YangNodeType.SUB_MODULE_NODE); - unresolvedResolutionList = new LinkedList(); + derivedTypeResolutionList = new LinkedList(); + usesResolutionList = new LinkedList(); importList = new LinkedList(); includeList = new LinkedList(); listOfLeaf = new LinkedList(); @@ -341,17 +351,19 @@ public class YangSubModule extends YangNode } @Override - public void resolveSelfFileLinking() throws DataModelException { + public void resolveSelfFileLinking(ResolvableType type) + throws DataModelException { // Get the list to be resolved. - List resolutionList = getUnresolvedResolutionList(); + List resolutionList = getUnresolvedResolutionList(type); // Resolve linking for a resolution list. resolveLinkingForResolutionList(resolutionList, this); } @Override - public void resolveInterFileLinking() throws DataModelException { + public void resolveInterFileLinking(ResolvableType type) + throws DataModelException { // Get the list to be resolved. - List resolutionList = getUnresolvedResolutionList(); + List resolutionList = getUnresolvedResolutionList(type); // Resolve linking for a resolution list. linkInterFileReferences(resolutionList, this); } @@ -366,6 +378,11 @@ public class YangSubModule extends YangNode return listOfLeaf; } + @Override + public void setListOfLeaf(List leafsList) { + listOfLeaf = leafsList; + } + /** * Adds a leaf. * @@ -386,6 +403,11 @@ public class YangSubModule extends YangNode return listOfLeafList; } + @Override + public void setListOfLeafList(List listOfLeafList) { + this.listOfLeafList = listOfLeafList; + } + /** * Adds a leaf-list. * @@ -486,7 +508,8 @@ public class YangSubModule extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnEntry() throws DataModelException { + public void validateDataOnEntry() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @@ -496,34 +519,52 @@ public class YangSubModule extends YangNode * @throws DataModelException a violation of data model rules */ @Override - public void validateDataOnExit() throws DataModelException { + public void validateDataOnExit() + throws DataModelException { // TODO auto-generated method stub, to be implemented by parser } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { // Asks helper to detect colliding child. detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { // Not required as module doesn't have any parent. } @Override - public List getUnresolvedResolutionList() { - return unresolvedResolutionList; + public List getUnresolvedResolutionList(ResolvableType type) { + if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) { + return derivedTypeResolutionList; + } else { + return usesResolutionList; + } } @Override - public void addToResolutionList(YangResolutionInfo resolutionInfo) { - this.unresolvedResolutionList.add(resolutionInfo); + public void addToResolutionList(YangResolutionInfo resolutionInfo, + ResolvableType type) { + if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) { + derivedTypeResolutionList.add(resolutionInfo); + } else if (type == ResolvableType.YANG_USES) { + usesResolutionList.add(resolutionInfo); + } } @Override - public void setResolutionList(List resolutionList) { - this.unresolvedResolutionList = resolutionList; + public void setResolutionList(List resolutionList, + ResolvableType type) { + if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) { + derivedTypeResolutionList = resolutionList; + } else if (type == ResolvableType.YANG_USES) { + usesResolutionList = resolutionList; + } + } /** diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangType.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangType.java index 44216197ef..41e07e4916 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangType.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangType.java @@ -17,9 +17,9 @@ package org.onosproject.yangutils.datamodel; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; +import org.onosproject.yangutils.linker.Resolvable; +import org.onosproject.yangutils.linker.ResolvableStatus; import org.onosproject.yangutils.linker.exceptions.LinkerException; -import org.onosproject.yangutils.linker.impl.Resolvable; -import org.onosproject.yangutils.linker.impl.ResolvableStatus; import org.onosproject.yangutils.parser.Parsable; import org.onosproject.yangutils.utils.YangConstructType; @@ -247,7 +247,8 @@ public class YangType } @Override - public void resolve() throws LinkerException { + public void resolve() + throws LinkerException { /* * Check whether the data type is derived. */ diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java index 4eae3a20fb..d2d8bc285e 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java @@ -15,10 +15,13 @@ */ package org.onosproject.yangutils.datamodel; +import java.util.LinkedList; +import java.util.List; + import org.onosproject.yangutils.datamodel.exceptions.DataModelException; +import org.onosproject.yangutils.linker.Resolvable; +import org.onosproject.yangutils.linker.ResolvableStatus; import org.onosproject.yangutils.linker.exceptions.LinkerException; -import org.onosproject.yangutils.linker.impl.Resolvable; -import org.onosproject.yangutils.linker.impl.ResolvableStatus; import org.onosproject.yangutils.parser.Parsable; import org.onosproject.yangutils.utils.YangConstructType; @@ -95,6 +98,21 @@ public class YangUses */ private ResolvableStatus resolvableStatus; + /** + * Effective list of nodes of grouping that needs to replicated at YANG uses. + */ + List resolvedGroupingNodes; + + /** + * Effective list of leaves of grouping that needs to replicated at YANG uses. + */ + List> resolvedGroupingLeaves; + + /** + * Effective list of leaf lists of grouping that needs to replicated at YANG uses. + */ + List> resolvedGroupingLeafLists; + /** * Creates an YANG uses node. */ @@ -102,6 +120,9 @@ public class YangUses super(YangNodeType.USES_NODE); nodeIdentifier = new YangNodeIdentifier(); resolvableStatus = ResolvableStatus.UNRESOLVED; + resolvedGroupingNodes = new LinkedList(); + resolvedGroupingLeaves = new LinkedList>(); + resolvedGroupingLeafLists = new LinkedList>(); } /** @@ -277,36 +298,132 @@ public class YangUses } YangLeavesHolder usesParentLeavesHolder = (YangLeavesHolder) usesParentNode; - if (referredGrouping.getListOfLeaf() != null) { - for (YangLeaf leaf : referredGrouping.getListOfLeaf()) { - try { - ((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leaf.getName(), - YangConstructType.LEAF_DATA); - } catch (DataModelException e) { - throw new LinkerException(e.getMessage()); - } - usesParentLeavesHolder.addLeaf(leaf); - } - } - if (referredGrouping.getListOfLeafList() != null) { - for (YangLeafList leafList : referredGrouping.getListOfLeafList()) { - try { - ((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leafList.getName(), - YangConstructType.LEAF_LIST_DATA); - } catch (DataModelException e) { - throw new LinkerException(e.getMessage()); - } - usesParentLeavesHolder.addLeafList(leafList); - } + if (referredGrouping.getListOfLeaf() != null + && referredGrouping.getListOfLeaf().size() != 0) { + addLeavesOfGrouping( + cloneLeavesList(referredGrouping.getListOfLeaf(), + usesParentLeavesHolder)); } - try { - YangNode.cloneSubTree(getRefGroup(), usesParentNode); - } catch (DataModelException e) { - throw new LinkerException(e.getMessage()); + if (referredGrouping.getListOfLeafList() != null + && referredGrouping.getListOfLeafList().size() != 0) { + addListOfLeafListOfGrouping( + cloneListOfLeafList(referredGrouping.getListOfLeafList(), + usesParentLeavesHolder)); + } + + YangNode childInGrouping = referredGrouping.getChild(); + + while (childInGrouping != null) { + if ((childInGrouping instanceof YangEnumeration) + || (childInGrouping instanceof YangUnion) + || (childInGrouping instanceof YangTypeDef)) { + + /* + * No need to copy the leaves, union / enum class, + * as these will be generated in the scope of grouping + */ + childInGrouping = childInGrouping.getNextSibling(); + continue; + } else if ((childInGrouping instanceof YangUses)) { + addResolvedUsesInfoOfGrouping((YangUses) childInGrouping, + usesParentLeavesHolder); + } else { + addNodeOfGrouping(childInGrouping); + } + + childInGrouping = childInGrouping.getNextSibling(); } } + /** + * Clone the resolved uses contained in grouping to the uses of grouping. + * + * @param usesInGrouping resolved uses in grouping + * @param usesHolder holder of uses + */ + private void addResolvedUsesInfoOfGrouping(YangUses usesInGrouping, + YangLeavesHolder usesHolder) { + for (YangNode usesResolvedNode : + usesInGrouping.getUsesResolvedNodeList()) { + addNodeOfGrouping(usesResolvedNode); + } + + for (List leavesList : + usesInGrouping.getUsesResolvedLeavesList()) { + addLeavesOfGrouping(cloneLeavesList(leavesList, usesHolder)); + } + + for (List listOfLeafLists : + usesInGrouping.getUsesResolvedListOfLeafList()) { + addListOfLeafListOfGrouping( + cloneListOfLeafList(listOfLeafLists, usesHolder)); + } + } + + /** + * Clone the list of leaves and return the cloned list leaves. + * + * @param listOfLeaves list of leaves to be cloned + * @param usesParentNode parent of the cloned location + * @return cloned list of leaves + */ + private List cloneLeavesList(List listOfLeaves, + YangLeavesHolder usesParentNode) { + if ((listOfLeaves == null) || listOfLeaves.size() == 0) { + throw new LinkerException("No leaves to clone"); + } + + List newLeavesList = new LinkedList(); + for (YangLeaf leaf : listOfLeaves) { + YangLeaf clonedLeaf; + try { + ((CollisionDetector) usesParentNode).detectCollidingChild(leaf.getName(), + YangConstructType.LEAF_DATA); + clonedLeaf = leaf.clone(); + } catch (CloneNotSupportedException | DataModelException e) { + throw new LinkerException(e.getMessage()); + } + + clonedLeaf.setContainedIn(usesParentNode); + newLeavesList.add(clonedLeaf); + } + + return newLeavesList; + } + + /** + * Clone the list of leaf list. + * + * @param listOfLeafList list of leaf list that needs to be cloned + * @param usesParentNode parent of uses + * @return cloned list of leaf list + */ + private List cloneListOfLeafList(List listOfLeafList, + YangLeavesHolder usesParentNode) { + if ((listOfLeafList == null) || listOfLeafList.size() == 0) { + throw new LinkerException("No leaf lists to clone"); + } + + List newListOfLeafList = new LinkedList(); + for (YangLeafList leafList : listOfLeafList) { + YangLeafList clonedLeafList; + try { + ((CollisionDetector) usesParentNode).detectCollidingChild(leafList.getName(), + YangConstructType.LEAF_LIST_DATA); + clonedLeafList = leafList.clone(); + } catch (CloneNotSupportedException | DataModelException e) { + throw new LinkerException(e.getMessage()); + } + + clonedLeafList.setContainedIn(usesParentNode); + newListOfLeafList.add(clonedLeafList); + } + + return newListOfLeafList; + } + + @Override public ResolvableStatus getResolvableStatus() { return resolvableStatus; @@ -318,12 +435,14 @@ public class YangUses } @Override - public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectCollidingChild(String identifierName, YangConstructType dataType) + throws DataModelException { detectCollidingChildUtil(identifierName, dataType, this); } @Override - public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException { + public void detectSelfCollision(String identifierName, YangConstructType dataType) + throws DataModelException { if (getName().equals(identifierName)) { throw new DataModelException("YANG file error: Duplicate input identifier detected, same as uses \"" @@ -331,4 +450,61 @@ public class YangUses } } + + /** + * Adds the node under grouping to the effective uses resolved info. + * + * @param nodeInGrouping node defined under grouping which needs to be copied in + * the context of uses + */ + public void addNodeOfGrouping(YangNode nodeInGrouping) { + resolvedGroupingNodes.add(nodeInGrouping); + } + + /** + * Returns the effective list of nodes added due to uses linking. + * + * @return effective list of nodes added due to uses linking + */ + public List getUsesResolvedNodeList() { + return resolvedGroupingNodes; + } + + /** + * Adds the leaves under grouping to the effective uses resolved info. + * + * @param leavesInGrouping Leaves defined under grouping which needs to be copied in + * the context of uses + */ + public void addLeavesOfGrouping(List leavesInGrouping) { + resolvedGroupingLeaves.add(leavesInGrouping); + } + + /** + * Returns the effective list of Leaves added due to uses linking. + * + * @return effective list of Leaves added due to uses linking + */ + public List> getUsesResolvedLeavesList() { + return resolvedGroupingLeaves; + } + + /** + * Adds the leaf-lists under grouping to the effective uses resolved info. + * + * @param leafListsInGrouping leaf-lists defined under grouping which needs to be copied in + * the context of uses + */ + public void addListOfLeafListOfGrouping(List leafListsInGrouping) { + resolvedGroupingLeafLists.add(leafListsInGrouping); + } + + /** + * Returns the effective list of Leaves added due to uses linking. + * + * @return effective list of Leaves added due to uses linking + */ + public List> getUsesResolvedListOfLeafList() { + return resolvedGroupingLeafLists; + } } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java index ea1789132e..29d384b8f5 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java @@ -18,15 +18,18 @@ package org.onosproject.yangutils.datamodel.utils; import java.util.List; import java.util.Set; + import org.onosproject.yangutils.datamodel.CollisionDetector; import org.onosproject.yangutils.datamodel.YangLeaf; import org.onosproject.yangutils.datamodel.YangLeafList; import org.onosproject.yangutils.datamodel.YangLeavesHolder; import org.onosproject.yangutils.datamodel.YangNode; -import org.onosproject.yangutils.linker.impl.YangReferenceResolver; -import org.onosproject.yangutils.linker.impl.YangResolutionInfo; import org.onosproject.yangutils.datamodel.YangRpc; +import org.onosproject.yangutils.datamodel.YangType; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; +import org.onosproject.yangutils.linker.ResolvableType; +import org.onosproject.yangutils.linker.YangReferenceResolver; +import org.onosproject.yangutils.linker.impl.YangResolutionInfo; import org.onosproject.yangutils.parser.Parsable; import org.onosproject.yangutils.plugin.manager.YangFileInfo; import org.onosproject.yangutils.utils.YangConstructType; @@ -45,8 +48,7 @@ public final class DataModelUtils { /** * Detects the colliding identifier name in a given YANG node and its child. * - * @param identifierName name for which collision detection is to be - * checked + * @param identifierName name for which collision detection is to be checked * @param dataType type of YANG node asking for detecting collision * @param node instance of calling node * @throws DataModelException a violation of data model rules @@ -77,8 +79,7 @@ public final class DataModelUtils { /** * Detects colliding of uses and grouping only with uses and grouping respectively. * - * @param identifierName name for which collision detection is to be - * checked + * @param identifierName name for which collision detection is to be checked * @param dataType type of YANG node asking for detecting collision * @param node node instance of calling node * @throws DataModelException a violation of data model rules @@ -101,8 +102,7 @@ public final class DataModelUtils { * Detects the colliding identifier name in a given leaf node. * * @param listOfLeaf List of leaves to detect collision - * @param identifierName name for which collision detection is to be - * checked + * @param identifierName name for which collision detection is to be checked * @throws DataModelException a violation of data model rules */ private static void detectCollidingLeaf(List listOfLeaf, String identifierName) @@ -123,8 +123,7 @@ public final class DataModelUtils { * Detects the colliding identifier name in a given leaf-list node. * * @param listOfLeafList list of leaf-lists to detect collision - * @param identifierName name for which collision detection is to be - * checked + * @param identifierName name for which collision detection is to be checked * @throws DataModelException a violation of data model rules */ private static void detectCollidingLeafList(List listOfLeafList, String identifierName) @@ -144,8 +143,7 @@ public final class DataModelUtils { /** * Add a resolution information. * - * @param resolutionInfo information about the YANG construct which has to - * be resolved + * @param resolutionInfo information about the YANG construct which has to be resolved * @throws DataModelException a violation of data model rules */ public static void addResolutionInfo(YangResolutionInfo resolutionInfo) @@ -162,7 +160,15 @@ public final class DataModelUtils { } YangReferenceResolver resolutionNode = (YangReferenceResolver) curNode; - resolutionNode.addToResolutionList(resolutionInfo); + if (resolutionInfo.getEntityToResolveInfo() + .getEntityToResolve() instanceof YangType) { + resolutionNode.addToResolutionList(resolutionInfo, + ResolvableType.YANG_DERIVED_DATA_TYPE); + } else { + resolutionNode.addToResolutionList(resolutionInfo, + ResolvableType.YANG_USES); + } + } /** @@ -173,7 +179,7 @@ public final class DataModelUtils { * @throws DataModelException a violation of data model rules */ public static void resolveLinkingForResolutionList(List resolutionList, - YangReferenceResolver dataModelRootNode) + YangReferenceResolver dataModelRootNode) throws DataModelException { for (YangResolutionInfo resolutionInfo : resolutionList) { @@ -189,7 +195,7 @@ public final class DataModelUtils { * @throws DataModelException a violation of data model rules */ public static void linkInterFileReferences(List resolutionList, - YangReferenceResolver dataModelRootNode) + YangReferenceResolver dataModelRootNode) throws DataModelException { /* * Run through the resolution list, find type/uses referring to diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/Resolvable.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/Resolvable.java similarity index 97% rename from utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/Resolvable.java rename to utils/yangutils/src/main/java/org/onosproject/yangutils/linker/Resolvable.java index f384dc564c..975c3f411e 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/Resolvable.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/Resolvable.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.onosproject.yangutils.linker.impl; +package org.onosproject.yangutils.linker; import org.onosproject.yangutils.linker.exceptions.LinkerException; diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/ResolvableStatus.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/ResolvableStatus.java similarity index 96% rename from utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/ResolvableStatus.java rename to utils/yangutils/src/main/java/org/onosproject/yangutils/linker/ResolvableStatus.java index cd43c184a3..0ff5da5d4f 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/ResolvableStatus.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/ResolvableStatus.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.onosproject.yangutils.linker.impl; +package org.onosproject.yangutils.linker; /** * Represents the status of resolvable entity. diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/ResolvableType.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/ResolvableType.java new file mode 100644 index 0000000000..ff0778fe4d --- /dev/null +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/ResolvableType.java @@ -0,0 +1,33 @@ +/* + * 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.linker; + +/** + * Type of the resolvable info. + */ +public enum ResolvableType { + + /** + * Identifies the derived data type. + */ + YANG_DERIVED_DATA_TYPE, + + /** + * Identifies the uses. + */ + YANG_USES +} diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/YangLinkingPhase.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/YangLinkingPhase.java new file mode 100644 index 0000000000..23020df3e5 --- /dev/null +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/YangLinkingPhase.java @@ -0,0 +1,34 @@ +/* + * 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.linker; + +/** + * Represents the phase of YANG file reference linking. + */ +public enum YangLinkingPhase { + + /** + * Linking the reference within the files. + */ + INTRA_FILE, + + /** + * Linking the reference across the files. + */ + INTER_FILE + +} diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangReferenceResolver.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/YangReferenceResolver.java similarity index 80% rename from utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangReferenceResolver.java rename to utils/yangutils/src/main/java/org/onosproject/yangutils/linker/YangReferenceResolver.java index 4681985d18..307675dbd4 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangReferenceResolver.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/YangReferenceResolver.java @@ -14,14 +14,16 @@ * limitations under the License. */ -package org.onosproject.yangutils.linker.impl; +package org.onosproject.yangutils.linker; import java.util.List; import java.util.Set; + import org.onosproject.yangutils.datamodel.YangImport; import org.onosproject.yangutils.datamodel.YangInclude; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; import org.onosproject.yangutils.linker.exceptions.LinkerException; +import org.onosproject.yangutils.linker.impl.YangResolutionInfo; import org.onosproject.yangutils.plugin.manager.YangFileInfo; /** @@ -33,23 +35,26 @@ public interface YangReferenceResolver { /** * Returns unresolved resolution list. * - * @return unresolved resolution list + * @param type resolvable type + * @return list of resolution information objects */ - List getUnresolvedResolutionList(); + List getUnresolvedResolutionList(ResolvableType type); /** * Adds to the resolution list. * * @param resolutionInfo resolution information + * @param type resolvable type */ - void addToResolutionList(YangResolutionInfo resolutionInfo); + void addToResolutionList(YangResolutionInfo resolutionInfo, ResolvableType type); /** * Creates resolution list. * * @param resolutionList resolution list + * @param type resolvable type */ - void setResolutionList(List resolutionList); + void setResolutionList(List resolutionList, ResolvableType type); /** * Returns unresolved imported list. @@ -110,16 +115,20 @@ public interface YangReferenceResolver { /** * Resolves self file linking. * + * @param type resolvable type * @throws DataModelException a violation in data model rule */ - void resolveSelfFileLinking() throws DataModelException; + void resolveSelfFileLinking(ResolvableType type) + throws DataModelException; /** * Resolves inter file linking. * + * @param type resolvable type * @throws DataModelException a violation in data model rule */ - void resolveInterFileLinking() throws DataModelException; + void resolveInterFileLinking(ResolvableType type) + throws DataModelException; /** * Adds references to include. @@ -127,7 +136,8 @@ public interface YangReferenceResolver { * @param yangFileInfoSet YANG file info set * @throws LinkerException a violation of linker rules */ - void addReferencesToIncludeList(Set yangFileInfoSet) throws LinkerException; + void addReferencesToIncludeList(Set yangFileInfoSet) + throws LinkerException; /** * Adds references to import. @@ -135,5 +145,6 @@ public interface YangReferenceResolver { * @param yangFileInfoSet YANG file info set * @throws LinkerException a violation of linker rules */ - void addReferencesToImportList(Set yangFileInfoSet) throws LinkerException; + void addReferencesToImportList(Set yangFileInfoSet) + throws LinkerException; } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java index 0fc3d99c7a..deaebb2a99 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java @@ -17,10 +17,13 @@ package org.onosproject.yangutils.linker.impl; import java.util.Set; + import org.onosproject.yangutils.datamodel.YangNode; import org.onosproject.yangutils.datamodel.YangSubModule; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; +import org.onosproject.yangutils.linker.ResolvableType; import org.onosproject.yangutils.linker.YangLinker; +import org.onosproject.yangutils.linker.YangReferenceResolver; import org.onosproject.yangutils.linker.exceptions.LinkerException; import org.onosproject.yangutils.plugin.manager.YangFileInfo; @@ -29,7 +32,8 @@ import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE; /** * Representation of entity which provides linking service of YANG files. */ -public class YangLinkerManager implements YangLinker { +public class YangLinkerManager + implements YangLinker { @Override public void resolveDependencies(Set yangFileInfoSet) { @@ -54,7 +58,8 @@ public class YangLinkerManager implements YangLinker { * @param yangFileInfoSet set of YANG files info * @throws LinkerException fails to link sub-module to parent module */ - public void linkSubModulesToParentModule(Set yangFileInfoSet) throws LinkerException { + public void linkSubModulesToParentModule(Set yangFileInfoSet) + throws LinkerException { for (YangFileInfo yangFileInfo : yangFileInfoSet) { YangNode yangNode = yangFileInfo.getRootNode(); if (yangNode instanceof YangSubModule) { @@ -106,10 +111,13 @@ public class YangLinkerManager implements YangLinker { * @param yangFileInfoSet set of YANG files info * @throws LinkerException a violation in linker execution */ - public void processInterFileLinking(Set yangFileInfoSet) throws LinkerException { + public void processInterFileLinking(Set yangFileInfoSet) + throws LinkerException { for (YangFileInfo yangFileInfo : yangFileInfoSet) { try { - ((YangReferenceResolver) yangFileInfo.getRootNode()).resolveInterFileLinking(); + ((YangReferenceResolver) yangFileInfo.getRootNode()).resolveInterFileLinking(ResolvableType.YANG_USES); + ((YangReferenceResolver) yangFileInfo.getRootNode()) + .resolveInterFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); } catch (DataModelException e) { String errorInfo = "Error in file: " + yangFileInfo.getYangFileName() + " at line: " + e.getLineNumber() + " at position: " + e.getCharPositionInLine() + NEW_LINE + e.getMessage(); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java index 26d4cb6b11..83b11c4d13 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java @@ -17,6 +17,7 @@ package org.onosproject.yangutils.linker.impl; import java.util.Stack; + import org.onosproject.yangutils.datamodel.LocationInfo; import org.onosproject.yangutils.datamodel.YangDataTypes; import org.onosproject.yangutils.datamodel.YangDerivedInfo; @@ -28,12 +29,18 @@ import org.onosproject.yangutils.datamodel.YangType; import org.onosproject.yangutils.datamodel.YangTypeDef; import org.onosproject.yangutils.datamodel.YangUses; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; +import org.onosproject.yangutils.linker.Resolvable; +import org.onosproject.yangutils.linker.ResolvableStatus; +import org.onosproject.yangutils.linker.YangLinkingPhase; +import org.onosproject.yangutils.linker.YangReferenceResolver; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.INTER_FILE_LINKED; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.INTRA_FILE_RESOLVED; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.LINKED; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.RESOLVED; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.UNRESOLVED; +import static org.onosproject.yangutils.linker.ResolvableStatus.INTER_FILE_LINKED; +import static org.onosproject.yangutils.linker.ResolvableStatus.INTRA_FILE_RESOLVED; +import static org.onosproject.yangutils.linker.ResolvableStatus.LINKED; +import static org.onosproject.yangutils.linker.ResolvableStatus.RESOLVED; +import static org.onosproject.yangutils.linker.ResolvableStatus.UNRESOLVED; +import static org.onosproject.yangutils.linker.YangLinkingPhase.INTER_FILE; +import static org.onosproject.yangutils.linker.YangLinkingPhase.INTRA_FILE; import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_LINKER_ERROR; import static org.onosproject.yangutils.utils.UtilConstants.GROUPING_LINKER_ERROR; @@ -42,7 +49,8 @@ import static org.onosproject.yangutils.utils.UtilConstants.GROUPING_LINKER_ERRO * * @param type of resolution entity uses / type */ -public class YangResolutionInfo implements LocationInfo { +public class YangResolutionInfo + implements LocationInfo { /** * Information about the entity that needs to be resolved. @@ -164,7 +172,7 @@ public class YangResolutionInfo implements LocationInfo { * resolve the references and pop the entity and * continue with remaining stack elements to resolve. */ - resolveTopOfStack(); + resolveTopOfStack(INTRA_FILE); getPartialResolvedStack().pop(); break; } @@ -213,7 +221,7 @@ public class YangResolutionInfo implements LocationInfo { /** * Resolves the current entity in the stack. */ - private void resolveTopOfStack() + private void resolveTopOfStack(YangLinkingPhase linkingPhase) throws DataModelException { ((Resolvable) getCurrentEntityToResolveFromStack()).resolve(); if (((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() @@ -280,7 +288,8 @@ public class YangResolutionInfo implements LocationInfo { * @return true if self file reference, false otherwise * @throws DataModelException a violation of data model rules */ - private boolean isCandidateForSelfFileReference() throws DataModelException { + private boolean isCandidateForSelfFileReference() + throws DataModelException { String prefix = getRefPrefix(); return prefix == null || prefix.contentEquals(getCurReferenceResolver().getPrefix()); } @@ -598,7 +607,8 @@ public class YangResolutionInfo implements LocationInfo { * @return referenced prefix of entity under resolution * @throws DataModelException a violation in data model rule */ - private String getRefPrefix() throws DataModelException { + private String getRefPrefix() + throws DataModelException { String refPrefix; if (getCurrentEntityToResolveFromStack() instanceof YangType) { refPrefix = ((YangType) getCurrentEntityToResolveFromStack()).getPrefix(); @@ -643,7 +653,7 @@ public class YangResolutionInfo implements LocationInfo { * resolve the references and pop the entity and * continue with remaining stack elements to resolve */ - resolveTopOfStack(); + resolveTopOfStack(INTER_FILE); getPartialResolvedStack().pop(); break; } @@ -679,7 +689,8 @@ public class YangResolutionInfo implements LocationInfo { * * @throws DataModelException data model error */ - private void linkInterFileTopOfStackRefUpdateStack() throws DataModelException { + private void linkInterFileTopOfStackRefUpdateStack() + throws DataModelException { /* * Obtain the referred node of top of stack entity under resolution @@ -727,7 +738,8 @@ public class YangResolutionInfo implements LocationInfo { * @return true if resolved, false otherwise * @throws DataModelException a violation in data model rule */ - private boolean resolveWithInclude() throws DataModelException { + private boolean resolveWithInclude() + throws DataModelException { /* * Run through all the nodes in include list and search for referred * typedef/grouping at the root level. @@ -762,7 +774,8 @@ public class YangResolutionInfo implements LocationInfo { * @return true if resolved, false otherwise * @throws DataModelException a violation in data model rule */ - private boolean resolveWithImport() throws DataModelException { + private boolean resolveWithImport() + throws DataModelException { /* * Run through import list to find the referred typedef/grouping. */ @@ -808,7 +821,8 @@ public class YangResolutionInfo implements LocationInfo { * @return referred typedef/grouping node * @throws DataModelException a violation in data model rule */ - private T getRefNode() throws DataModelException { + private T getRefNode() + throws DataModelException { if (getCurrentEntityToResolveFromStack() instanceof YangType) { YangDerivedInfo derivedInfo = (YangDerivedInfo) ((YangType) getCurrentEntityToResolveFromStack()).getDataTypeExtendedInfo(); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/AugmentListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/AugmentListener.java index b3b22ae3e3..f9042fa3f8 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/AugmentListener.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/AugmentListener.java @@ -39,8 +39,10 @@ import static org.onosproject.yangutils.parser.impl.parserutils.AugmentListenerU import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT; -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage; -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction + .constructExtendedListenerErrorMessage; +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction + .constructListenerErrorMessage; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; @@ -98,7 +100,7 @@ public final class AugmentListener { * @param ctx context object of the grammar rule */ public static void processAugmentEntry(TreeWalkListener listener, - GeneratedYangParser.AugmentStatementContext ctx) { + GeneratedYangParser.AugmentStatementContext ctx) { // Check for stack to be non empty. checkStackIsNotEmpty(listener, MISSING_HOLDER, AUGMENT_DATA, ctx.augment().getText(), ENTRY); @@ -120,7 +122,8 @@ public final class AugmentListener { YangNode curNode = (YangNode) curData; YangAugment yangAugment = getYangAugmentNode(JAVA_GENERATION); - validateTargetNodePath(targetNodes, curNode, ctx); + //validateTargetNodePath(targetNodes, curNode, ctx); + // TODO: handle in linker. yangAugment.setTargetNode(targetNodes); yangAugment.setName(generateNameForAugmentNode(curData, targetNodes, listener)); @@ -147,7 +150,7 @@ public final class AugmentListener { * @param ctx context object of the grammar rule */ public static void processAugmentExit(TreeWalkListener listener, - GeneratedYangParser.AugmentStatementContext ctx) { + GeneratedYangParser.AugmentStatementContext ctx) { //Check for stack to be non empty. checkStackIsNotEmpty(listener, MISSING_HOLDER, AUGMENT_DATA, ctx.augment().getText(), EXIT); @@ -170,15 +173,15 @@ public final class AugmentListener { validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA, AUGMENT_DATA, ctx.augment().getText()); validateCardinalityMaxOne(ctx.whenStatement(), WHEN_DATA, AUGMENT_DATA, ctx.augment().getText()); validateMutuallyExclusiveChilds(ctx.dataDefStatement(), DATA_DEF_DATA, ctx.caseStatement(), - CASE_DATA, AUGMENT_DATA, ctx.augment().getText()); + CASE_DATA, AUGMENT_DATA, ctx.augment().getText()); } /** * Validates whether the current target node path is correct or not. * * @param targetNodes list of target nodes - * @param line line in YANG file - * @param charPositionInLine char position in YANG file + * @param curNode current Node + * @param ctx augment context * @param curNode current YANG node */ private static void validateTargetNodePath(List targetNodes, YangNode curNode, @@ -189,7 +192,8 @@ public final class AugmentListener { if (!moduleId.getName().equals(curNode.getName())) { throw parserException(ctx); } else { - validateNodeInTargetPath(curNode, targetNodes, ctx); + //validateNodeInTargetPath(curNode, targetNodes, ctx); + // TODO: handle in linker. } } else { String parentPrefix = getParentsPrefix(curNode); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java index 4a2481a903..f478e8acbe 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java @@ -113,11 +113,12 @@ public final class LeafListListener { leafList.setLeafName(identifier); Parsable tmpData = listener.getParsedDataStack().peek(); - YangLeavesHolder leaves; + YangLeavesHolder leavesHolder; if (tmpData instanceof YangLeavesHolder) { - leaves = (YangLeavesHolder) tmpData; - leaves.addLeafList(leafList); + leavesHolder = (YangLeavesHolder) tmpData; + leavesHolder.addLeafList(leafList); + leafList.setContainedIn(leavesHolder); } else { throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAF_LIST_DATA, ctx.identifier().getText(), ENTRY)); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListener.java index b8e3b2d7c0..0a648af207 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListener.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListener.java @@ -115,11 +115,12 @@ public final class LeafListener { leaf.setLeafName(identifier); Parsable tmpData = listener.getParsedDataStack().peek(); - YangLeavesHolder leaves; + YangLeavesHolder leavesHolder; if (tmpData instanceof YangLeavesHolder) { - leaves = (YangLeavesHolder) tmpData; - leaves.addLeaf(leaf); + leavesHolder = (YangLeavesHolder) tmpData; + leavesHolder.addLeaf(leaf); + leaf.setContainedIn(leavesHolder); } else { throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAF_DATA, ctx.identifier().getText(), ENTRY)); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java index a0005ba36a..afa9acd017 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java @@ -16,10 +16,11 @@ package org.onosproject.yangutils.parser.impl.listeners; -import org.onosproject.yangutils.linker.impl.YangReferenceResolver; import org.onosproject.yangutils.datamodel.YangModule; import org.onosproject.yangutils.datamodel.YangRevision; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; +import org.onosproject.yangutils.linker.ResolvableType; +import org.onosproject.yangutils.linker.YangReferenceResolver; import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; import org.onosproject.yangutils.parser.exceptions.ParserException; import org.onosproject.yangutils.parser.impl.TreeWalkListener; @@ -28,7 +29,8 @@ import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_G import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangModuleNode; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT; -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction + .constructListenerErrorMessage; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; @@ -116,7 +118,10 @@ public final class ModuleListener { ctx.identifier().getText(), EXIT)); } try { - ((YangReferenceResolver) listener.getParsedDataStack().peek()).resolveSelfFileLinking(); + ((YangReferenceResolver) listener.getParsedDataStack() + .peek()).resolveSelfFileLinking(ResolvableType.YANG_USES); + ((YangReferenceResolver) listener.getParsedDataStack() + .peek()).resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); } catch (DataModelException e) { ParserException parserException = new ParserException(e.getMessage()); parserException.setLine(e.getLineNumber()); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListener.java index 4f0ce8ec75..bd65855c2b 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListener.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListener.java @@ -151,7 +151,7 @@ public final class PatternRestrictionListener { * @param ctx context object of the grammar rule */ public static void processPatternRestrictionExit(TreeWalkListener listener, - GeneratedYangParser.PatternStatementContext ctx) { + GeneratedYangParser.PatternStatementContext ctx) { // Check for stack to be non empty. checkStackIsNotEmpty(listener, MISSING_HOLDER, PATTERN_DATA, ctx.string().getText(), EXIT); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java index 2c97f30e8e..048e635e5c 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java @@ -16,10 +16,11 @@ package org.onosproject.yangutils.parser.impl.listeners; -import org.onosproject.yangutils.linker.impl.YangReferenceResolver; import org.onosproject.yangutils.datamodel.YangRevision; import org.onosproject.yangutils.datamodel.YangSubModule; import org.onosproject.yangutils.datamodel.exceptions.DataModelException; +import org.onosproject.yangutils.linker.ResolvableType; +import org.onosproject.yangutils.linker.YangReferenceResolver; import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; import org.onosproject.yangutils.parser.exceptions.ParserException; import org.onosproject.yangutils.parser.impl.TreeWalkListener; @@ -28,7 +29,8 @@ import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_G import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangSubModuleNode; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT; -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction + .constructListenerErrorMessage; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; @@ -121,7 +123,10 @@ public final class SubModuleListener { ctx.identifier().getText(), EXIT)); } try { - ((YangReferenceResolver) listener.getParsedDataStack().peek()).resolveSelfFileLinking(); + ((YangReferenceResolver) listener.getParsedDataStack().peek()) + .resolveSelfFileLinking(ResolvableType.YANG_USES); + ((YangReferenceResolver) listener.getParsedDataStack().peek()) + .resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); } catch (DataModelException e) { ParserException parserException = new ParserException(e.getMessage()); parserException.setLine(e.getLineNumber()); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java index 6e25f1b0b5..6e386dac22 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java @@ -35,7 +35,7 @@ import org.onosproject.yangutils.parser.impl.TreeWalkListener; import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.addResolutionInfo; import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION; import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangType; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.UNRESOLVED; +import static org.onosproject.yangutils.linker.ResolvableStatus.UNRESOLVED; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT; import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage; diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/AugmentListenerUtil.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/AugmentListenerUtil.java index 764cef4903..7aae767922 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/AugmentListenerUtil.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/AugmentListenerUtil.java @@ -247,7 +247,7 @@ public final class AugmentListenerUtil { /** * Validates whether nodes in target node list are valid or not. * - * @param targetNodeName current target node + * @param targetNodes target node * @param curNode YANG node * @return true or false */ diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangFileInfo.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangFileInfo.java index a92ca68d1f..4c6147a58d 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangFileInfo.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangFileInfo.java @@ -17,7 +17,7 @@ package org.onosproject.yangutils.plugin.manager; import java.util.Objects; -import org.onosproject.yangutils.linker.impl.ResolvableStatus; +import org.onosproject.yangutils.linker.ResolvableStatus; import org.onosproject.yangutils.datamodel.YangNode; /** diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java index 0f6febeb8e..3eb1ea3d8b 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java @@ -62,7 +62,8 @@ import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getDirectory; */ @Mojo(name = "yang2java", defaultPhase = GENERATE_SOURCES, requiresDependencyResolution = COMPILE, requiresProject = true) -public class YangUtilManager extends AbstractMojo { +public class YangUtilManager + extends AbstractMojo { private YangNode rootNode; // YANG file information set. @@ -134,7 +135,8 @@ public class YangUtilManager extends AbstractMojo { private BuildContext context; @Override - public void execute() throws MojoExecutionException, MojoFailureException { + public void execute() + throws MojoExecutionException, MojoFailureException { try { @@ -204,7 +206,8 @@ public class YangUtilManager extends AbstractMojo { * * @throws MojoExecutionException a violation in mojo excecution */ - public void resolveDependenciesUsingLinker() throws MojoExecutionException { + public void resolveDependenciesUsingLinker() + throws MojoExecutionException { for (YangFileInfo yangFileInfo : getYangFileInfoSet()) { setCurYangFileInfo(yangFileInfo); try { @@ -220,7 +223,8 @@ public class YangUtilManager extends AbstractMojo { * * @throws IOException a violation in IO */ - public void parseYangFileInfoSet() throws IOException { + public void parseYangFileInfoSet() + throws IOException { for (YangFileInfo yangFileInfo : getYangFileInfoSet()) { setCurYangFileInfo(yangFileInfo); try { diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java index 64575962de..a6eb9d7132 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java @@ -64,10 +64,10 @@ public final class JavaCodeGeneratorUtil { /** * Generates Java code files corresponding to the YANG schema. * - * @param rootNode root node of the data model tree + * @param rootNode root node of the data model tree * @param yangPlugin YANG plugin config * @throws TranslatorException when fails to generate java code file the current - * node + * node */ public static void generateJavaCode(YangNode rootNode, YangPluginConfig yangPlugin) throws TranslatorException { @@ -77,18 +77,35 @@ public final class JavaCodeGeneratorUtil { while (codeGenNode != null) { if (curTraversal != PARENT) { + if (!(codeGenNode instanceof JavaCodeGenerator)) { + throw new TranslatorException("Unsupported node to generate code"); + } + setCurNode(codeGenNode); - generateCodeEntry(codeGenNode, yangPlugin); + try { + generateCodeEntry(codeGenNode, yangPlugin); + } catch (Exception e) { + throw new TranslatorException(e.getMessage()); + } + } if (curTraversal != PARENT && codeGenNode.getChild() != null) { curTraversal = CHILD; codeGenNode = codeGenNode.getChild(); } else if (codeGenNode.getNextSibling() != null) { - generateCodeExit(codeGenNode); + try { + generateCodeExit(codeGenNode); + } catch (Exception e) { + throw new TranslatorException(e.getMessage()); + } curTraversal = SIBILING; codeGenNode = codeGenNode.getNextSibling(); } else { - generateCodeExit(codeGenNode); + try { + generateCodeExit(codeGenNode); + } catch (Exception e) { + throw new TranslatorException(e.getMessage()); + } curTraversal = PARENT; codeGenNode = codeGenNode.getParent(); } @@ -99,10 +116,10 @@ public final class JavaCodeGeneratorUtil { * Generates the current nodes code snippet. * * @param codeGenNode current data model node for which the code needs to be - * generated - * @param yangPlugin YANG plugin config + * generated + * @param yangPlugin YANG plugin config * @throws TranslatorException when fails to generate java code file the current - * node + * node */ private static void generateCodeEntry(YangNode codeGenNode, YangPluginConfig yangPlugin) throws TranslatorException { @@ -119,11 +136,12 @@ public final class JavaCodeGeneratorUtil { * Generates the current nodes code target code from the snippet. * * @param codeGenNode current data model node for which the code needs to be - * generated + * generated * @throws TranslatorException when fails to generate java code file the current - * node + * node */ - private static void generateCodeExit(YangNode codeGenNode) throws TranslatorException { + private static void generateCodeExit(YangNode codeGenNode) + throws TranslatorException { if (codeGenNode instanceof JavaCodeGenerator) { ((JavaCodeGenerator) codeGenNode).generateCodeExit(); @@ -188,7 +206,7 @@ public final class JavaCodeGeneratorUtil { * Delete Java code files corresponding to the YANG schema. * * @param rootNode root node of data-model tree - * @throws IOException when fails to delete java code file the current node + * @throws IOException when fails to delete java code file the current node */ public static void translatorErrorHandler(YangNode rootNode) throws IOException { diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java index 5ccf0b3c27..b1c36ecb70 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java @@ -20,8 +20,6 @@ import java.util.List; import java.util.SortedSet; import java.util.TreeSet; -import static java.util.Collections.sort; - import static org.onosproject.yangutils.utils.UtilConstants.ABSTRACT_EVENT; import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST; import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION_HOLDER_CLASS_IMPORT_CLASS; @@ -45,6 +43,8 @@ import static org.onosproject.yangutils.utils.UtilConstants.PERIOD; import static org.onosproject.yangutils.utils.UtilConstants.PROVIDED_AUGMENTATION_CLASS_IMPORT_PKG; import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN; +import static java.util.Collections.sort; + /** * Represents that generated Java file can contain imports. */ @@ -116,20 +116,52 @@ public class JavaImportData { * a qualified manner. * * @param newImportInfo class/interface info being imported - * @return status of new addition of class/interface to the import set + * @param className name of the call being generated + * @param classPkg generated class package + * @return qualified access status of the import node being added */ - public boolean addImportInfo(JavaQualifiedTypeInfo newImportInfo) { + public boolean addImportInfo(JavaQualifiedTypeInfo newImportInfo, + String className, String classPkg) { + + if (newImportInfo.getClassInfo().contentEquals(className)) { + /* + * if the current class name is same as the attribute class name, + * then the attribute must be accessed in a qualified manner. + */ + return true; + } else if (newImportInfo.getPkgInfo() == null) { + /* + * If the package info is null, then it is not a candidate for import / qualified access + */ + return false; + } + + /* + * If the attribute type is having the package info, it is contender + * for import list and also need to check if it needs to be a + * qualified access. + */ + if (newImportInfo.getPkgInfo().contentEquals(classPkg)) { + /** + * Package of the referred attribute and the generated class is same, so no need import + * or qualified access. + */ + return false; + } for (JavaQualifiedTypeInfo curImportInfo : getImportSet()) { if (curImportInfo.getClassInfo() .contentEquals(newImportInfo.getClassInfo())) { - return curImportInfo.getPkgInfo() + return !curImportInfo.getPkgInfo() .contentEquals(newImportInfo.getPkgInfo()); } } + /* + * import is added, so it is a member for non qualified access + */ getImportSet().add(newImportInfo); - return true; + return false; } /** diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java index 2e6b43f90c..35ee6d52c7 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java @@ -134,10 +134,10 @@ public class JavaQualifiedTypeInfo * Returns the import info for an attribute, which needs to be used for code * generation for import or for qualified access. * - * @param curNode current data model node for which the java file is being - * generated + * @param curNode current data model node for which the java file is being + * generated * @param attributeName name of the attribute being added, it will used in - * import info for child class + * import info for child class * @return return the import info for this attribute */ public static JavaQualifiedTypeInfo getQualifiedTypeInfoOfCurNode(YangNode curNode, @@ -149,14 +149,10 @@ public class JavaQualifiedTypeInfo throw new TranslatorException("missing java file information to get the package details " + "of attribute corresponding to child node"); } - /* - * The scenario when we need to add the child class as an attribute in - * the current class. The child class is in the package of the current - * classes package with current classes name. - */ + importInfo.setClassInfo(attributeName); - importInfo.setPkgInfo((((JavaFileInfoContainer) curNode).getJavaFileInfo().getPackage() + "." - + ((JavaFileInfoContainer) curNode).getJavaFileInfo().getJavaName()).toLowerCase()); + importInfo.setPkgInfo(((JavaFileInfoContainer) curNode) + .getJavaFileInfo().getPackage()); return importInfo; } @@ -165,7 +161,7 @@ public class JavaQualifiedTypeInfo * Returns the java qualified type information for the wrapper classes. * * @param referredTypesAttrInfo attribute of referred type - * @param conflictResolver plugin configurations + * @param conflictResolver plugin configurations * @return return the import info for this attribute */ public static JavaQualifiedTypeInfo getQualifiedInfoOfFromString(JavaAttributeInfo referredTypesAttrInfo, diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java index 0820c07241..42438528a2 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java @@ -25,15 +25,13 @@ import org.onosproject.yangutils.datamodel.YangCase; import org.onosproject.yangutils.datamodel.YangLeaf; import org.onosproject.yangutils.datamodel.YangLeafList; import org.onosproject.yangutils.datamodel.YangLeavesHolder; +import org.onosproject.yangutils.datamodel.YangList; import org.onosproject.yangutils.datamodel.YangNode; import org.onosproject.yangutils.translator.exception.TranslatorException; import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer; import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGrouping; -import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaInput; import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule; -import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaOutput; import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule; -import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaUses; import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder; import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig; @@ -56,6 +54,7 @@ import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType. import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData; import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedInfoOfFromString; import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode; +import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.updateJavaFileInfo; import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefination; import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefClose; import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderClassFile; @@ -82,28 +81,36 @@ import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethod; import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.parseBuilderInterfaceBuildMethodString; import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.addArrayListImport; -import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.addAugmentationHoldersImport; +import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils + .addAugmentationHoldersImport; import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.addAugmentedInfoImport; import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.closeFile; -import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.detectCollisionBwParentAndChildForImport; -import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.isAugmentationHolderExtended; +import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils + .isAugmentationHolderExtended; import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.isAugmentedInfoExtended; import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.sortImports; +import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE; import static org.onosproject.yangutils.utils.UtilConstants.BUILDER; +import static org.onosproject.yangutils.utils.UtilConstants.COMPONENT; +import static org.onosproject.yangutils.utils.UtilConstants.DEACTIVATE; import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING; import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION; import static org.onosproject.yangutils.utils.UtilConstants.IMPL; import static org.onosproject.yangutils.utils.UtilConstants.IMPORT; import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE; +import static org.onosproject.yangutils.utils.UtilConstants.MANAGER; import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE; import static org.onosproject.yangutils.utils.UtilConstants.PERIOD; +import static org.onosproject.yangutils.utils.UtilConstants.REFERENCE; +import static org.onosproject.yangutils.utils.UtilConstants.REFERENCE_CARDINALITY; import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN; +import static org.onosproject.yangutils.utils.UtilConstants.SERVICE; import static org.onosproject.yangutils.utils.UtilConstants.SLASH; import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.createPackage; import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.readAppendFile; -import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.OF_METHOD; +import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc; import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath; import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile; import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.mergeJavaFiles; @@ -139,6 +146,7 @@ public class TempJavaFragmentFiles { * Contains all the interface(s)/class name which will be extended by generated files. */ private JavaExtendsListHolder javaExtendsListHolder; + /** * File type extension for java classes. */ @@ -294,12 +302,6 @@ public class TempJavaFragmentFiles { */ private boolean isAttributePresent; - /** - * Creates an instance of temp java fragment files. - */ - public TempJavaFragmentFiles() { - } - /** * Retrieves the absolute path where the file needs to be generated. * @@ -313,7 +315,7 @@ public class TempJavaFragmentFiles { * Sets absolute path where the file needs to be generated. * * @param absoluteDirPath absolute path where the file needs to be - * generated. + * generated. */ void setAbsoluteDirPath(String absoluteDirPath) { this.absoluteDirPath = absoluteDirPath; @@ -366,7 +368,7 @@ public class TempJavaFragmentFiles { /** * Sets generated file files. * - * @param generatedTempFile generated file + * @param fileType generated file type */ void setGeneratedTempFiles(int fileType) { generatedTempFiles = fileType; @@ -493,7 +495,7 @@ public class TempJavaFragmentFiles { * Sets from string method's temporary file handle. * * @param fromStringImplTempFileHandle from string method's temporary file - * handle + * handle */ private void setFromStringImplTempFileHandle(File fromStringImplTempFileHandle) { this.fromStringImplTempFileHandle = fromStringImplTempFileHandle; @@ -505,7 +507,8 @@ public class TempJavaFragmentFiles { * @param javaFileInfo generated java file information * @throws IOException when fails to create new file handle */ - TempJavaFragmentFiles(JavaFileInfo javaFileInfo) throws IOException { + TempJavaFragmentFiles(JavaFileInfo javaFileInfo) + throws IOException { setJavaExtendsListHolder(new JavaExtendsListHolder()); setJavaImportData(new JavaImportData()); setJavaFileInfo(javaFileInfo); @@ -801,8 +804,8 @@ public class TempJavaFragmentFiles { /** * Adds attribute for class. * - * @param attr attribute info - * @param pluginConfig plugin configurations + * @param attr attribute info + * @param yangPluginConfig plugin configurations * @throws IOException when fails to append to temporary file */ private void addAttribute(JavaAttributeInfo attr, YangPluginConfig yangPluginConfig) @@ -814,7 +817,7 @@ public class TempJavaFragmentFiles { /** * Adds getter for interface. * - * @param attr attribute info + * @param attr attribute info * @param pluginConfig plugin configurations * @throws IOException when fails to append to temporary file */ @@ -827,7 +830,7 @@ public class TempJavaFragmentFiles { /** * Adds setter for interface. * - * @param attr attribute info + * @param attr attribute info * @param pluginConfig plugin configurations * @throws IOException when fails to append to temporary file */ @@ -855,7 +858,7 @@ public class TempJavaFragmentFiles { /** * Adds getter method's impl for class. * - * @param attr attribute info + * @param attr attribute info * @param pluginConfig plugin configurations * @throws IOException when fails to append to temporary file */ @@ -875,8 +878,8 @@ public class TempJavaFragmentFiles { /** * Adds build method for interface. * - * @return build method for interface * @param pluginConfig plugin configurations + * @return build method for interface * @throws IOException when fails to append to temporary file */ String addBuildMethodForInterface(YangPluginConfig pluginConfig) @@ -898,8 +901,8 @@ public class TempJavaFragmentFiles { /** * Adds default constructor for class. * - * @param modifier modifier for constructor. - * @param toAppend string which need to be appended with the class name + * @param modifier modifier for constructor. + * @param toAppend string which need to be appended with the class name * @param pluginConfig plugin configurations * @return default constructor for class * @throws IOException when fails to append to file @@ -959,7 +962,7 @@ public class TempJavaFragmentFiles { /** * Adds from string method for union class. * - * @param javaAttributeInfo type attribute info + * @param javaAttributeInfo type attribute info * @param fromStringAttributeInfo from string attribute info * @throws IOException when fails to append to temporary file */ @@ -987,6 +990,8 @@ public class TempJavaFragmentFiles { File file = new File(path + fileName + TEMP_FILE_EXTENSION); if (!file.exists()) { file.createNewFile(); + } else { + throw new IOException(fileName + " is reused due to YANG naming"); } return file; } @@ -998,7 +1003,8 @@ public class TempJavaFragmentFiles { * @return temporary file handle * @throws IOException when fails to create new file handle */ - File getJavaFileHandle(String fileName) throws IOException { + File getJavaFileHandle(String fileName) + throws IOException { return getFileObject(getDirPath(), fileName, JAVA_FILE_EXTENSION, getJavaFileInfo()); } @@ -1034,7 +1040,7 @@ public class TempJavaFragmentFiles { /** * Parses attribute to get the attribute string. * - * @param attr attribute info + * @param attr attribute info * @param pluginConfig plugin configurations * @return attribute string */ @@ -1072,9 +1078,9 @@ public class TempJavaFragmentFiles { /** * Adds current node info as and attribute to the parent generated file. * - * @param curNode current node which needs to be added as an attribute in - * the parent generated code - * @param isList is list construct + * @param curNode current node which needs to be added as an attribute in + * the parent generated code + * @param isList is list construct * @param pluginConfig plugin configurations * @throws IOException IO operation exception */ @@ -1085,10 +1091,16 @@ public class TempJavaFragmentFiles { if (!(parent instanceof JavaCodeGenerator)) { throw new TranslatorException("missing parent node to contain current node info in generated file"); } - if (curNode instanceof YangJavaUses) { - curNode = ((YangJavaUses) curNode).getRefGroup(); + + if (parent instanceof YangJavaGrouping) { + /* + * In case of grouping, there is no need to add the information, it will be taken care in + * uses + */ + return; } - JavaAttributeInfo javaAttributeInfo = getCurNodeAsAttributeInParent(curNode, + + JavaAttributeInfo javaAttributeInfo = getCurNodeAsAttributeInTarget(curNode, parent, isList); if (!(parent instanceof TempJavaCodeFragmentFilesContainer)) { throw new TranslatorException("missing parent temp file handle"); @@ -1097,80 +1109,111 @@ public class TempJavaFragmentFiles { .addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfo, pluginConfig); } + + /** + * Adds current node info as and attribute to the parent generated file. + * + * @param curNode current node which needs to be added as an attribute in + * the parent generated code + * @param pluginConfig plugin configurations + * @param targetNode target node to add the attribute + * @throws IOException IO operation exception + */ + public static void addCurNodeAsAttributeInTargetTempFile(YangNode curNode, + YangPluginConfig pluginConfig, YangNode targetNode) + throws IOException { + + if (!(targetNode instanceof JavaCodeGenerator)) { + throw new TranslatorException("invalid target node to generated file"); + } + + if (targetNode instanceof YangJavaGrouping) { + /* + * In case of grouping, there is no need to add the information, it will be taken care in + * uses + */ + return; + } + + boolean isList = curNode instanceof YangList; + + JavaAttributeInfo javaAttributeInfo = getCurNodeAsAttributeInTarget(curNode, + targetNode, isList); + if (!(targetNode instanceof TempJavaCodeFragmentFilesContainer)) { + throw new TranslatorException("missing target node's temp file handle"); + } + getNodesInterfaceFragmentFiles(targetNode) + .addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfo, pluginConfig); + } + /** * Creates an attribute info object corresponding to a data model node and * return it. * - * @param curNode current data model node for which the java code generation - * is being handled - * @param parentNode parent node in which the current node is an attribute + * @param curNode current data model node for which the java code generation + * is being handled + * @param targetNode target node in which the current node is an attribute * @param isListNode is the current added attribute needs to be a list * @return AttributeInfo attribute details required to add in temporary * files */ - public static JavaAttributeInfo getCurNodeAsAttributeInParent( - YangNode curNode, YangNode parentNode, boolean isListNode) { - - YangPluginConfig pluginConfig = ((JavaFileInfoContainer) parentNode).getJavaFileInfo().getPluginConfig(); - JavaFileInfo curNodeJavaInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo(); - String curNodeName = null; - - if (curNodeJavaInfo.getJavaName() != null) { - curNodeName = curNodeJavaInfo.getJavaName(); - } else { - curNodeName = getCamelCase(curNode.getName(), pluginConfig.getConflictResolver()); - } - - if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) { - throw new TranslatorException("Parent node does not have file info"); - } - - TempJavaFragmentFiles tempJavaFragmentFiles = getNodesInterfaceFragmentFiles(parentNode); - boolean isQualified = true; - JavaImportData parentImportData = tempJavaFragmentFiles.getJavaImportData(); - if (isListNode) { - parentImportData.setIfListImported(true); + public static JavaAttributeInfo getCurNodeAsAttributeInTarget(YangNode curNode, + YangNode targetNode, boolean isListNode) { + String curNodeName = ((JavaFileInfoContainer) curNode).getJavaFileInfo().getJavaName(); + if (curNodeName == null) { + updateJavaFileInfo(curNode, null); + curNodeName = ((JavaFileInfoContainer) curNode).getJavaFileInfo().getJavaName(); } /* * Get the import info corresponding to the attribute for import in * generated java files or qualified access */ + JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode, + getCapitalCase(curNodeName)); + if (!(targetNode instanceof TempJavaCodeFragmentFilesContainer)) { + throw new TranslatorException("Parent node does not have file info"); + } + TempJavaFragmentFiles tempJavaFragmentFiles = getNodesInterfaceFragmentFiles(targetNode); + JavaImportData parentImportData = tempJavaFragmentFiles.getJavaImportData(); + JavaFileInfo fileInfo = ((JavaFileInfoContainer) targetNode).getJavaFileInfo(); - JavaQualifiedTypeInfo qualifiedTypeInfo = new JavaQualifiedTypeInfo(); - if (curNode instanceof YangJavaGrouping) { - qualifiedTypeInfo = resolveGroupingsQuailifiedInfo(curNode, pluginConfig); + boolean isQualified; + if ((targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule) + && (qualifiedTypeInfo.getClassInfo().contentEquals(SERVICE) + || qualifiedTypeInfo.getClassInfo().contentEquals(COMPONENT) + || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(ACTIVATE)) + || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(DEACTIVATE)) + || qualifiedTypeInfo.getClassInfo().contentEquals(REFERENCE_CARDINALITY) + || qualifiedTypeInfo.getClassInfo().contentEquals(REFERENCE)) + || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(fileInfo.getJavaName() + SERVICE)) + || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(fileInfo.getJavaName() + MANAGER))) { + + isQualified = true; } else { - qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(parentNode, - getCapitalCase(curNodeName)); + String className; + if (targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule) { + className = getCapitalCase(fileInfo.getJavaName()) + "Service"; + } else { + className = getCapitalCase(fileInfo.getJavaName()); + } + + isQualified = parentImportData.addImportInfo(qualifiedTypeInfo, + className, fileInfo.getPackage()); } - if (parentNode instanceof YangJavaModule - || parentNode instanceof YangJavaSubModule - || parentNode instanceof YangJavaInput - || parentNode instanceof YangJavaOutput) { - parentImportData.addImportInfo(qualifiedTypeInfo); - isQualified = false; - } else if (curNode instanceof YangJavaGrouping) { - JavaFileInfo parentsClassInfo = ((JavaFileInfoContainer) parentNode).getJavaFileInfo(); - if (qualifiedTypeInfo.getClassInfo().equals(parentsClassInfo.getJavaName())) { - isQualified = true; - } - if (!qualifiedTypeInfo.getPkgInfo().equals(parentsClassInfo.getPackage())) { - parentImportData.addImportInfo(qualifiedTypeInfo); - isQualified = false; - } - } else if (!detectCollisionBwParentAndChildForImport(curNode, qualifiedTypeInfo)) { - parentImportData.addImportInfo(qualifiedTypeInfo); - isQualified = false; + if (isListNode) { + parentImportData.setIfListImported(true); } + + return getAttributeInfoForTheData(qualifiedTypeInfo, curNodeName, null, isQualified, isListNode); } /** * Resolves groupings java qualified info. * - * @param curNode grouping node + * @param curNode grouping node * @param pluginConfig plugin configurations * @return groupings java qualified info */ @@ -1247,7 +1290,7 @@ public class TempJavaFragmentFiles { /** * Adds parent's info to current node import list. * - * @param curNode current node for which import list needs to be updated + * @param curNode current node for which import list needs to be updated * @param pluginConfig plugin configurations */ public void addParentInfoInCurNodeTempFile(YangNode curNode, YangPluginConfig pluginConfig) { @@ -1263,18 +1306,22 @@ public class TempJavaFragmentFiles { caseImportInfo.setClassInfo(getCapitalCase(getCamelCase(parent.getName(), pluginConfig.getConflictResolver()))); caseImportInfo.setPkgInfo(((JavaFileInfoContainer) parent).getJavaFileInfo().getPackage()); + + JavaFileInfo fileInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo(); + ((TempJavaCodeFragmentFilesContainer) curNode).getTempJavaCodeFragmentFiles() - .getBeanTempFiles().getJavaImportData().addImportInfo(caseImportInfo); + .getBeanTempFiles().getJavaImportData().addImportInfo(caseImportInfo, + getCapitalCase(fileInfo.getJavaName()), fileInfo.getPackage()); } /** * Adds leaf attributes in generated files. * - * @param listOfLeaves list of YANG leaf - * @param yangPluginConfig + * @param listOfLeaves list of YANG leaf + * @param yangPluginConfig plugin config * @throws IOException IO operation fail */ - private void addLeavesInfoToTempFiles(List listOfLeaves, + public void addLeavesInfoToTempFiles(List listOfLeaves, YangPluginConfig yangPluginConfig) throws IOException { if (listOfLeaves != null) { @@ -1299,11 +1346,11 @@ public class TempJavaFragmentFiles { /** * Adds leaf list's attributes in generated files. * - * @param listOfLeafList list of YANG leaves - * @param yangPluginConfig + * @param listOfLeafList list of YANG leaves + * @param yangPluginConfig plugin config * @throws IOException IO operation fail */ - private void addLeafListInfoToTempFiles(List listOfLeafList, YangPluginConfig yangPluginConfig) + public void addLeafListInfoToTempFiles(List listOfLeafList, YangPluginConfig yangPluginConfig) throws IOException { if (listOfLeafList != null) { for (YangLeafList leafList : listOfLeafList) { @@ -1329,7 +1376,7 @@ public class TempJavaFragmentFiles { * Adds all the leaves in the current data model node as part of the * generated temporary file. * - * @param curNode java file info of the generated file + * @param curNode java file info of the generated file * @param yangPluginConfig plugin config * @throws IOException IO operation fail */ @@ -1347,8 +1394,8 @@ public class TempJavaFragmentFiles { /** * Adds the new attribute info to the target generated temporary files. * - * @param newAttrInfo the attribute info that needs to be added to temporary - * files + * @param newAttrInfo the attribute info that needs to be added to temporary + * files * @param pluginConfig plugin configurations * @throws IOException IO operation fail */ @@ -1423,7 +1470,7 @@ public class TempJavaFragmentFiles { * Constructs java code exit. * * @param fileType generated file type - * @param curNode current YANG node + * @param curNode current YANG node * @throws IOException when fails to generate java files */ public void generateJavaFile(int fileType, YangNode curNode) @@ -1542,8 +1589,8 @@ public class TempJavaFragmentFiles { * Removes all temporary file handles. * * @param isErrorOccurred when translator fails to generate java files we - * need to close all open file handles include temporary files - * and java files. + * need to close all open file handles include temporary files + * and java files. * @throws IOException when failed to delete the temporary files */ public void freeTemporaryResources(boolean isErrorOccurred) @@ -1597,38 +1644,9 @@ public class TempJavaFragmentFiles { */ public boolean getIsQualifiedAccessOrAddToImportList( JavaQualifiedTypeInfo importInfo) { - boolean isImportPkgEqualCurNodePkg; - if (importInfo.getClassInfo().contentEquals( - getGeneratedJavaClassName())) { - /* - * if the current class name is same as the attribute class name, - * then the attribute must be accessed in a qualified manner. - */ - return true; - } else if (importInfo.getPkgInfo() != null) { - /* - * If the attribute type is having the package info, it is contender - * for import list and also need to check if it needs to be a - * qualified access. - */ - isImportPkgEqualCurNodePkg = isImportPkgEqualCurNodePkg(importInfo); - if (!isImportPkgEqualCurNodePkg) { - /* - * If the package of the attribute added is not same as the - * current class package, then it must either be imported for - * access or it must be a qualified access. - */ - boolean isImportAdded = getJavaImportData().addImportInfo(importInfo); - if (!isImportAdded) { - /* - * If the attribute type info is not imported, then it must - * be a qualified access. - */ - return true; - } - } - } - return false; + + return getJavaImportData().addImportInfo(importInfo, getGeneratedJavaClassName(), + getJavaFileInfo().getPackage()); } /** diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java index c41fdb083d..f13e6a5e75 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java @@ -71,11 +71,11 @@ import static org.onosproject.yangutils.utils.UtilConstants.RPC_INPUT_VAR_NAME; import static org.onosproject.yangutils.utils.UtilConstants.SLASH; import static org.onosproject.yangutils.utils.UtilConstants.VOID; import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.createPackage; -import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.generateJavaDocForRpc; -import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ENUM_ATTRIBUTE; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.MANAGER_SETTER_METHOD; +import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.generateJavaDocForRpc; +import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc; import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile; /** @@ -119,6 +119,7 @@ public class TempJavaServiceFragmentFiles * File name for event subject setter temp file. */ private static final String EVENT_SUBJECT_SETTER_FILE_NAME = "EventSubjectSetter"; + /** * File name for generated class file for service * suffix. @@ -370,14 +371,13 @@ public class TempJavaServiceFragmentFiles * Constructs java code exit. * * @param fileType generated file type - * @param curNode current YANG node + * @param curNode current YANG node * @throws IOException when fails to generate java files */ @Override public void generateJavaFile(int fileType, YangNode curNode) throws IOException { - List imports = new ArrayList<>(); - imports = getJavaImportData().getImports(); + List imports = getJavaImportData().getImports(); createPackage(curNode); @@ -433,15 +433,16 @@ public class TempJavaServiceFragmentFiles /** * Adds rpc string information to applicable temp file. * - * @param javaAttributeInfoOfInput rpc's input node attribute info + * @param javaAttributeInfoOfInput rpc's input node attribute info * @param javaAttributeInfoOfOutput rpc's output node attribute info - * @param rpcName name of the rpc function - * @param pluginConfig plugin configurations + * @param rpcName name of the rpc function + * @param pluginConfig plugin configurations * @throws IOException IO operation fail */ private void addRpcString(JavaAttributeInfo javaAttributeInfoOfInput, JavaAttributeInfo javaAttributeInfoOfOutput, YangPluginConfig pluginConfig, - String rpcName) throws IOException { + String rpcName) + throws IOException { String rpcInput = EMPTY_STRING; String rpcOutput = VOID; String rpcInputJavaDoc = EMPTY_STRING; @@ -464,20 +465,21 @@ public class TempJavaServiceFragmentFiles /** * Adds rpc string information to applicable temp file. * - * @param javaAttributeInfoOfInput rpc's input node attribute info + * @param javaAttributeInfoOfInput rpc's input node attribute info * @param javaAttributeInfoOfOutput rpc's output node attribute info - * @param rpcName name of the rpc function - * @param pluginConfig plugin configurations - * @param isInputLeafHolder if input node is leaf holder - * @param isOutputLeafHolder if output node is leaf holder - * @param isInputSingleChildHolder if input node is single child holder + * @param rpcName name of the rpc function + * @param pluginConfig plugin configurations + * @param isInputLeafHolder if input node is leaf holder + * @param isOutputLeafHolder if output node is leaf holder + * @param isInputSingleChildHolder if input node is single child holder * @param isOutputSingleChildHolder if input node is single child holder * @throws IOException IO operation fail */ public void addRpcString(JavaAttributeInfo javaAttributeInfoOfInput, JavaAttributeInfo javaAttributeInfoOfOutput, YangPluginConfig pluginConfig, String rpcName, boolean isInputLeafHolder, boolean isOutputLeafHolder, - boolean isInputSingleChildHolder, boolean isOutputSingleChildHolder) throws IOException { + boolean isInputSingleChildHolder, boolean isOutputSingleChildHolder) + throws IOException { String rpcInput = EMPTY_STRING; String rpcOutput = VOID; String rpcInputJavaDoc = EMPTY_STRING; @@ -504,10 +506,10 @@ public class TempJavaServiceFragmentFiles /** * Returns names for input and output. * - * @param attr attribute info - * @param isLeafHolder if leaf holder + * @param attr attribute info + * @param isLeafHolder if leaf holder * @param isSinglechildHolder if single child holder - * @param pluginConfig plugin configurations + * @param pluginConfig plugin configurations * @return names for input and output */ private String getInputOutputNames(JavaAttributeInfo attr, boolean isLeafHolder, boolean isSinglechildHolder, @@ -550,13 +552,13 @@ public class TempJavaServiceFragmentFiles /** * Adds the JAVA rpc snippet information. * - * @param javaAttributeInfoOfInput rpc's input node attribute info + * @param javaAttributeInfoOfInput rpc's input node attribute info * @param javaAttributeInfoOfOutput rpc's output node attribute info - * @param pluginConfig plugin configurations - * @param rpcName name of the rpc function - * @param isInputLeafHolder if input node is leaf holder - * @param isOutputLeafHolder if output node is leaf holder - * @param isInputSingleChildHolder if input node is single child holder + * @param pluginConfig plugin configurations + * @param rpcName name of the rpc function + * @param isInputLeafHolder if input node is leaf holder + * @param isOutputLeafHolder if output node is leaf holder + * @param isInputSingleChildHolder if input node is single child holder * @param isOutputSingleChildHolder if input node is single child holder * @throws IOException IO operation fail */ @@ -573,7 +575,7 @@ public class TempJavaServiceFragmentFiles * Constructs java code exit. * * @param fileType generated file type - * @param curNode current YANG node + * @param curNode current YANG node * @throws IOException when fails to generate java files */ public void generateEventJavaFile(int fileType, YangNode curNode) @@ -604,7 +606,7 @@ public class TempJavaServiceFragmentFiles * Constructs java code exit. * * @param fileType generated file type - * @param curNode current YANG node + * @param curNode current YANG node * @throws IOException when fails to generate java files */ public void generateEventListenerJavaFile(int fileType, YangNode curNode) @@ -632,7 +634,7 @@ public class TempJavaServiceFragmentFiles * Constructs java code exit. * * @param fileType generated file type - * @param curNode current YANG node + * @param curNode current YANG node * @throws IOException when fails to generate java files */ public void generateEventSubjectJavaFile(int fileType, YangNode curNode) @@ -657,8 +659,8 @@ public class TempJavaServiceFragmentFiles * Removes all temporary file handles. * * @param isErrorOccurred when translator fails to generate java files we - * need to close all open file handles include temporary files - * and java files. + * need to close all open file handles include temporary files + * and java files. * @throws IOException when failed to delete the temporary files */ @Override @@ -782,17 +784,18 @@ public class TempJavaServiceFragmentFiles /** * Adds java snippet for events to event subject file. * - * @param curNode current node + * @param curNode current node * @param pluginConfig plugin configurations * @throws IOException when fails to do IO operations */ - public void addJavaSnippetOfEvent(YangNode curNode, YangPluginConfig pluginConfig) throws IOException { + public void addJavaSnippetOfEvent(YangNode curNode, YangPluginConfig pluginConfig) + throws IOException { String currentInfo = getCapitalCase(getCamelCase(((YangNotification) curNode).getName(), pluginConfig.getConflictResolver())); String notificationName = ((YangNotification) curNode).getName(); - JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode.getParent(), + JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode, getCapitalCase(currentInfo)); JavaAttributeInfo javaAttributeInfo = @@ -807,14 +810,16 @@ public class TempJavaServiceFragmentFiles } /*Adds event to enum temp file.*/ - private void addEventEnum(String notificationName, YangPluginConfig pluginConfig) throws IOException { + private void addEventEnum(String notificationName, YangPluginConfig pluginConfig) + throws IOException { appendToFile(getEventEnumTempFileHandle(), getJavaDoc(ENUM_ATTRIBUTE, notificationName, false, pluginConfig) + FOUR_SPACE_INDENTATION + getEnumJavaAttribute(notificationName).toUpperCase() + COMMA + NEW_LINE); } /*Adds event method in event class*/ - private void addEnumMethod(String eventClassname, String className) throws IOException { + private void addEnumMethod(String eventClassname, String className) + throws IOException { appendToFile(getEventMethodTempFileHandle(), getEventFileContents(eventClassname, className)); } @@ -853,7 +858,8 @@ public class TempJavaServiceFragmentFiles } /*Adds getter method for event in event subject class.*/ - private void addEventSubjectGetter(JavaAttributeInfo attr, YangPluginConfig pluginConfig) throws IOException { + private void addEventSubjectGetter(JavaAttributeInfo attr, YangPluginConfig pluginConfig) + throws IOException { appendToFile(getEventSubjectGetterTempFileHandle(), getJavaDoc(GETTER_METHOD, getCapitalCase(attr.getAttributeName()), false, pluginConfig) + getGetterForClass(attr, GENERATE_EVENT_SUBJECT_CLASS) + NEW_LINE); diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java index 2cbbb49d19..930b6b4c69 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java @@ -76,6 +76,7 @@ public class TempJavaTypeFragmentFiles * Temporary file handle for of string method of class. */ private File ofStringImplTempFileHandle; + /** * Temporary file handle for constructor for type class. */ @@ -85,6 +86,7 @@ public class TempJavaTypeFragmentFiles * Java file handle for typedef class file. */ private File typedefClassJavaFileHandle; + /** * Java file handle for type class like union, typedef file. */ @@ -211,7 +213,7 @@ public class TempJavaTypeFragmentFiles YangJavaType javaType = (YangJavaType) yangType; javaType.updateJavaQualifiedInfo(pluginConfig.getConflictResolver()); String typeName = javaType.getDataTypeName(); - typeName = getCamelCase(typeName, pluginConfig.getConflictResolver()); + typeName = getCamelCase(typeName, pluginConfig.getConflictResolver()); JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData( javaType.getJavaQualifiedInfo(), typeName, javaType, diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java index f647c0dffe..265caf6570 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java @@ -24,14 +24,14 @@ import org.onosproject.yangutils.translator.tojava.JavaFileInfo; import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles; import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig; -import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER; -import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfNode; +import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.updatePackageInfo; /** * Represents grouping information extended to support java code generation. */ public class YangJavaGrouping - extends YangGrouping implements JavaCodeGeneratorInfo, JavaCodeGenerator { + extends YangGrouping + implements JavaCodeGeneratorInfo, JavaCodeGenerator { /** * Contains the information of the java file being generated. @@ -50,7 +50,6 @@ public class YangJavaGrouping public YangJavaGrouping() { super(); setJavaFileInfo(new JavaFileInfo()); - getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER); } /** @@ -96,35 +95,22 @@ public class YangJavaGrouping tempFileHandle = fileHandle; } - /** - * Prepare the information for java code generation corresponding to YANG - * grouping info. - * - * @param yangPlugin YANG plugin config - * @throws TranslatorException translator operation fail - */ + @Override - public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException { + public void generateCodeEntry(YangPluginConfig yangPlugin) + throws TranslatorException { try { - generateCodeOfNode(this, yangPlugin); + updatePackageInfo(this, yangPlugin); } catch (IOException e) { - throw new TranslatorException( - "Failed to prepare generate code entry for container node " + this.getName()); + throw new TranslatorException(e.getCause()); } } - /** - * Create a java file using the YANG grouping info. - * - * @throws TranslatorException translator operation fail - */ @Override - public void generateCodeExit() throws TranslatorException { - try { - getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this); - } catch (IOException e) { - throw new TranslatorException("Failed to generate code for container node " + this.getName()); - } + public void generateCodeExit() + throws TranslatorException { + /* + * Do nothing. + */ } - } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java index c3bd23ab1a..2bf1989438 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java @@ -24,6 +24,7 @@ import org.onosproject.yangutils.datamodel.YangInput; import org.onosproject.yangutils.datamodel.YangLeaf; import org.onosproject.yangutils.datamodel.YangLeafList; import org.onosproject.yangutils.datamodel.YangLeavesHolder; +import org.onosproject.yangutils.datamodel.YangList; import org.onosproject.yangutils.datamodel.YangNode; import org.onosproject.yangutils.datamodel.YangOutput; import org.onosproject.yangutils.datamodel.YangRpc; @@ -40,10 +41,8 @@ import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesCont import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles; import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig; -import static org.onosproject.yangutils.datamodel.YangNodeType.LIST_NODE; import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData; import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode; -import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.resolveGroupingsQuailifiedInfo; import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaDataType; import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaImportClass; import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaImportPackage; @@ -52,6 +51,13 @@ import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSy import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage; import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getParentNodeInGenCode; import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.updatePackageInfo; +import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE; +import static org.onosproject.yangutils.utils.UtilConstants.COMPONENT; +import static org.onosproject.yangutils.utils.UtilConstants.DEACTIVATE; +import static org.onosproject.yangutils.utils.UtilConstants.MANAGER; +import static org.onosproject.yangutils.utils.UtilConstants.REFERENCE; +import static org.onosproject.yangutils.utils.UtilConstants.REFERENCE_CARDINALITY; +import static org.onosproject.yangutils.utils.UtilConstants.SERVICE; import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirectory; /** @@ -126,7 +132,8 @@ public class YangJavaRpc * @throws TranslatorException translator operations fails */ @Override - public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException { + public void generateCodeEntry(YangPluginConfig yangPlugin) + throws TranslatorException { if (!(this instanceof JavaCodeGeneratorInfo)) { // TODO:throw exception @@ -152,7 +159,8 @@ public class YangJavaRpc * @throws TranslatorException translator operations fails */ @Override - public void generateCodeExit() throws TranslatorException { + public void generateCodeExit() + throws TranslatorException { // Get the parent module/sub-module. YangNode parent = getParentNodeInGenCode(this); @@ -216,7 +224,15 @@ public class YangJavaRpc YangNode tempNode = node.getChild(); while (tempNode != null) { if (tempNode instanceof YangUses) { - deleteDirectoryWhenNoFileIsGeneratedForInputOutput(rpcsChildNodePkg); + boolean isCodeGenerated = true; + if (node instanceof YangJavaInput) { + isCodeGenerated = ((YangJavaInput) node).isCodeGenFlag(); + } else if (node instanceof YangJavaOutput) { + isCodeGenerated = ((YangJavaOutput) node).isCodeGenFlag(); + } + if (!isCodeGenerated) { + deleteDirectoryWhenNoFileIsGeneratedForInputOutput(rpcsChildNodePkg); + } } tempNode = tempNode.getNextSibling(); } @@ -236,7 +252,8 @@ public class YangJavaRpc * @param emptyPkg empty package * @throws IOException when fails to do IO operations */ - private void deleteDirectoryWhenNoFileIsGeneratedForInputOutput(String emptyPkg) throws IOException { + private void deleteDirectoryWhenNoFileIsGeneratedForInputOutput(String emptyPkg) + throws IOException { deleteDirectory(emptyPkg); } @@ -244,8 +261,8 @@ public class YangJavaRpc * Creates an attribute info object corresponding to a data model node and * return it. * - * @param childNode child data model node(input / output) for which the java code generation - * is being handled + * @param childNode child data model node(input / output) for which the java code generation + * is being handled * @param currentNode parent node (module / sub-module) in which the child node is an attribute * @return AttributeInfo attribute details required to add in temporary * files @@ -260,7 +277,7 @@ public class YangJavaRpc * Get the import info corresponding to the attribute for import in * generated java files or qualified access */ - JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(currentNode, + JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(childNode, getCapitalCase(childNodeName)); if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) { throw new TranslatorException("Parent node does not have file info"); @@ -281,7 +298,7 @@ public class YangJavaRpc /** * Process input/output nodes. * - * @param node YANG node + * @param node YANG node * @param yangPluginConfig plugin configurations */ private void processNodeEntry(YangNode node, YangPluginConfig yangPluginConfig) { @@ -299,7 +316,11 @@ public class YangJavaRpc } else if (node.getChild() != null && holder.getListOfLeaf().isEmpty() && holder.getListOfLeafList().isEmpty()) { if (getNumberOfChildNodes(node) == 1) { - setCodeGenFlagForNode(node, false); + if (node.getChild() instanceof YangUses) { + setCodeGenFlagForNode(node, getCodeGenFlagWhenUsesIsAChildNode(node)); + } else { + setCodeGenFlagForNode(node, false); + } } else { setCodeGenFlagForNode(node, true); } @@ -308,10 +329,37 @@ public class YangJavaRpc } } + /*Returns code gen flag when uses is a child node.*/ + private boolean getCodeGenFlagWhenUsesIsAChildNode(YangNode node) { + YangUses uses = (YangUses) node.getChild(); + + List groupingChildResolvedNodes = uses.getUsesResolvedNodeList(); + List> groupingChildResolvedLeaves = uses.getUsesResolvedLeavesList(); + List> groupingChildResolvedLeafList = uses.getUsesResolvedListOfLeafList(); + + if (!groupingChildResolvedNodes.isEmpty() + && groupingChildResolvedNodes.size() == 1 + && groupingChildResolvedLeaves.isEmpty() + && groupingChildResolvedLeafList.isEmpty()) { + return false; + } else if (groupingChildResolvedNodes.isEmpty() + && isOnlyOneLeafPresentInGrouping(groupingChildResolvedLeaves) + && groupingChildResolvedLeafList.isEmpty()) { + return false; + } else if (groupingChildResolvedNodes.isEmpty() + && groupingChildResolvedLeaves.isEmpty() + && isOnlyOneLeafListPresentInGrouping(groupingChildResolvedLeafList)) { + return false; + } + return (groupingChildResolvedNodes.isEmpty() + && groupingChildResolvedLeaves.isEmpty() + && groupingChildResolvedLeafList.isEmpty()); + } + /** * Process input/output nodes. * - * @param node YANG node + * @param node YANG node * @param yangPluginConfig plugin configurations * @return java attribute info */ @@ -343,7 +391,7 @@ public class YangJavaRpc /** * Process input/output node when one leaf is present. * - * @param node input/output node + * @param node input/output node * @param yangPluginConfig plugin configurations * @return java attribute for node */ @@ -351,30 +399,15 @@ public class YangJavaRpc YangPluginConfig yangPluginConfig) { YangLeavesHolder holder = (YangLeavesHolder) node; - List listOfLeaves = holder.getListOfLeaf(); - - for (YangLeaf leaf : listOfLeaves) { - if (!(leaf instanceof JavaLeafInfoContainer)) { - throw new TranslatorException("Leaf does not have java information"); - } - JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leaf; - javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver()); - javaLeaf.updateJavaQualifiedInfo(); - JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData( - javaLeaf.getJavaQualifiedInfo(), - javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()), - javaLeaf.getDataType(), - addTypeImport(javaLeaf.getDataType(), false, yangPluginConfig), false); - setLeafHolderFlag(node, true); - return javaAttributeInfo; - } - return null; + YangLeaf leaf = holder.getListOfLeaf().get(0); + setLeafHolderFlag(node, true); + return getAttributeInfoForLeaf(leaf, yangPluginConfig); } /** * Process input/output node when one leaf list is present. * - * @param node input/output node + * @param node input/output node * @param yangPluginConfig plugin configurations * @return java attribute for node */ @@ -382,33 +415,57 @@ public class YangJavaRpc YangPluginConfig yangPluginConfig) { YangLeavesHolder holder = (YangLeavesHolder) node; - List listOfLeafList = holder.getListOfLeafList(); + YangLeafList leafList = holder.getListOfLeafList().get(0); + setLeafHolderFlag(node, true); + return getAttributeInfoForLeafList(leafList, yangPluginConfig); + } - for (YangLeafList leafList : listOfLeafList) { - if (!(leafList instanceof JavaLeafInfoContainer)) { - throw new TranslatorException("Leaf-list does not have java information"); - } - JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leafList; - javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver()); - javaLeaf.updateJavaQualifiedInfo(); - ((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles() - .getServiceTempFiles().getJavaImportData().setIfListImported(true); - JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData( - javaLeaf.getJavaQualifiedInfo(), - javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()), - javaLeaf.getDataType(), - addTypeImport(javaLeaf.getDataType(), true, yangPluginConfig), - true); - setLeafHolderFlag(node, true); - return javaAttributeInfo; - } - return null; + /** + * Returns java attribute info for leaf. + * + * @param leaf YANG leaf + * @param yangPluginConfig plugin configurations + * @return java attribute info for leaf + */ + private JavaAttributeInfo getAttributeInfoForLeaf(YangLeaf leaf, YangPluginConfig yangPluginConfig) { + JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leaf; + javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver()); + javaLeaf.updateJavaQualifiedInfo(); + JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData( + javaLeaf.getJavaQualifiedInfo(), + javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()), + javaLeaf.getDataType(), + addTypeImport(javaLeaf.getDataType(), false, yangPluginConfig), false); + return javaAttributeInfo; + } + + /** + * Returns java attribute info for leaf list. + * + * @param leafList YANG leaf list + * @param yangPluginConfig plugin configurations + * @return java attribute info for leaf list + */ + private JavaAttributeInfo getAttributeInfoForLeafList(YangLeafList leafList, + YangPluginConfig yangPluginConfig) { + JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leafList; + javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver()); + javaLeaf.updateJavaQualifiedInfo(); + ((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles() + .getServiceTempFiles().getJavaImportData().setIfListImported(true); + JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData( + javaLeaf.getJavaQualifiedInfo(), + javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()), + javaLeaf.getDataType(), + addTypeImport(javaLeaf.getDataType(), true, yangPluginConfig), + true); + return javaAttributeInfo; } /** * Process input/output node when one child node is present. * - * @param node input/output node + * @param node input/output node * @param yangPluginConfig plugin configurations * @return java attribute for node */ @@ -418,10 +475,8 @@ public class YangJavaRpc String clsInfo = ""; JavaQualifiedTypeInfo childInfo = new JavaQualifiedTypeInfo(); if (node.getChild() instanceof YangJavaUses) { - childInfo = resolveGroupingsQuailifiedInfo(((YangJavaUses) node.getChild()).getRefGroup(), - yangPluginConfig); - clsInfo = getCapitalCase(getCamelCase(((YangJavaUses) node.getChild()).getRefGroup().getName(), - yangPluginConfig.getConflictResolver())); + YangJavaUses uses = (YangJavaUses) node.getChild(); + return processNodeWhenUsesIsChild(uses, node, yangPluginConfig); } else { String pkg = (rpcInfo.getPackage() + "." + rpcInfo.getJavaName() + "." + getCamelCase(node.getName(), yangPluginConfig.getConflictResolver())).toLowerCase(); @@ -431,7 +486,7 @@ public class YangJavaRpc childInfo.setClassInfo(clsInfo); } boolean isList = false; - if (node.getChild().getNodeType().equals(LIST_NODE)) { + if (node.getChild() instanceof YangList) { isList = true; } boolean isQualified = addImportToService(childInfo); @@ -444,6 +499,88 @@ public class YangJavaRpc return javaAttributeInfo; } + /** + * Returns java attribute info when child node is uses. + * + * @param uses YANG uses node + * @param node YANG node + * @param yangPluginConfig plugin configurations + * @return java attribute info when child node is uses + */ + private JavaAttributeInfo processNodeWhenUsesIsChild(YangUses uses, YangNode node, + YangPluginConfig yangPluginConfig) { + String clsInfo = ""; + JavaQualifiedTypeInfo childInfo = new JavaQualifiedTypeInfo(); + List groupingChildResolvedNodes = uses.getUsesResolvedNodeList(); + List> groupingChildResolvedLeaves = uses.getUsesResolvedLeavesList(); + List> groupingChildResolvedLeafList = uses.getUsesResolvedListOfLeafList(); + + if (!groupingChildResolvedNodes.isEmpty() + && groupingChildResolvedNodes.size() == 1 + && groupingChildResolvedLeaves.isEmpty() + && groupingChildResolvedLeafList.isEmpty()) { + YangNode childNodeOfGrouping = groupingChildResolvedNodes.get(0); + boolean isList = false; + if (childNodeOfGrouping instanceof YangList) { + isList = true; + } + JavaFileInfo childNodeOfGroupingInfo = + ((JavaFileInfoContainer) childNodeOfGrouping).getJavaFileInfo(); + childInfo.setClassInfo(getCapitalCase(childNodeOfGroupingInfo.getJavaName())); + childInfo.setPkgInfo(childNodeOfGroupingInfo.getPackage()); + clsInfo = childInfo.getClassInfo(); + boolean isQualified = addImportToService(childInfo); + setLeafHolderFlag(node, false); + setSingleChildHolderFlag(node, true); + return getAttributeInfoForTheData(childInfo, clsInfo, null, isQualified, isList); + + } else if (groupingChildResolvedNodes.isEmpty() + && isOnlyOneLeafPresentInGrouping(groupingChildResolvedLeaves) + && groupingChildResolvedLeafList.isEmpty()) { + + YangLeaf leaf = groupingChildResolvedLeaves.get(0).get(0); + setLeafHolderFlag(node, true); + return getAttributeInfoForLeaf(leaf, yangPluginConfig); + + } else if (groupingChildResolvedNodes.isEmpty() + && groupingChildResolvedLeaves.isEmpty() + && isOnlyOneLeafListPresentInGrouping(groupingChildResolvedLeafList)) { + YangLeafList leafList = groupingChildResolvedLeafList.get(0).get(0); + setLeafHolderFlag(node, true); + return getAttributeInfoForLeafList(leafList, yangPluginConfig); + + } else if (groupingChildResolvedNodes.isEmpty() + && groupingChildResolvedLeaves.isEmpty() + && groupingChildResolvedLeafList.isEmpty()) { + return null; + } else { + return processNodeWhenMultipleContaintsArePresent(node); + } + } + + /*Return true if only one leaf is present in grouping node.*/ + private boolean isOnlyOneLeafPresentInGrouping(List> groupingChildResolvedLeaves) { + if (!groupingChildResolvedLeaves.isEmpty() && + groupingChildResolvedLeaves.size() == 1) { + List leaves = groupingChildResolvedLeaves.get(0); + return leaves.size() == 1; + } else { + return false; + } + } + + /*Returns true is only one leaf list is present in grouping node.*/ + private boolean isOnlyOneLeafListPresentInGrouping(List> groupingChildResolvedLeafList) { + + if (!groupingChildResolvedLeafList.isEmpty() && + groupingChildResolvedLeafList.size() == 1) { + List leaves = groupingChildResolvedLeafList.get(0); + return leaves.size() == 1; + } else { + return false; + } + } + /** * Process input/output node when multiple leaf and child nodes are present. * @@ -460,8 +597,8 @@ public class YangJavaRpc /** * Adds type import to the RPC import list. * - * @param type YANG type - * @param isList is list attribute + * @param type YANG type + * @param isList is list attribute * @param pluginConfig plugin configurations * @return type import to the RPC import list */ @@ -492,13 +629,26 @@ public class YangJavaRpc * @return true or false */ private boolean addImportToService(JavaQualifiedTypeInfo importInfo) { - if (((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles() - .getServiceTempFiles().getJavaImportData().addImportInfo(importInfo)) { - return !((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles() - .getServiceTempFiles().getJavaImportData().getImportSet().contains(importInfo); - } else { + JavaFileInfo fileInfo = ((JavaFileInfoContainer) this.getParent()).getJavaFileInfo(); + + if (importInfo.getClassInfo().contentEquals(SERVICE) + || importInfo.getClassInfo().contentEquals(COMPONENT) + || importInfo.getClassInfo().contentEquals(getCapitalCase(ACTIVATE)) + || importInfo.getClassInfo().contentEquals(getCapitalCase(DEACTIVATE)) + || importInfo.getClassInfo().contentEquals(REFERENCE_CARDINALITY) + || importInfo.getClassInfo().contentEquals(REFERENCE) + || importInfo.getClassInfo().contentEquals(getCapitalCase(fileInfo.getJavaName() + SERVICE)) + || importInfo.getClassInfo().contentEquals(getCapitalCase(fileInfo.getJavaName() + MANAGER))) { return true; } + + String className; + className = getCapitalCase(fileInfo.getJavaName()) + "Service"; + + return ((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles() + .getServiceTempFiles().getJavaImportData().addImportInfo(importInfo, + className, fileInfo.getPackage()); + } /** diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java index f2d2ada4e1..f000b99b3f 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java @@ -16,7 +16,12 @@ package org.onosproject.yangutils.translator.tojava.javamodel; import java.io.IOException; +import java.util.List; +import org.onosproject.yangutils.datamodel.YangGrouping; +import org.onosproject.yangutils.datamodel.YangLeaf; +import org.onosproject.yangutils.datamodel.YangLeafList; +import org.onosproject.yangutils.datamodel.YangNode; import org.onosproject.yangutils.datamodel.YangUses; import org.onosproject.yangutils.translator.exception.TranslatorException; import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator; @@ -24,15 +29,16 @@ import org.onosproject.yangutils.translator.tojava.JavaFileInfo; import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles; import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig; -import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER; -import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.addCurNodeInfoInParentTempFile; +import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.addCurNodeAsAttributeInTargetTempFile; +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getParentNodeInGenCode; +import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.updatePackageInfo; /** * Represents uses information extended to support java code generation. */ public class YangJavaUses - extends YangUses implements JavaCodeGeneratorInfo, JavaCodeGenerator { - + extends YangUses + implements JavaCodeGeneratorInfo, JavaCodeGenerator { /** * Contains the information of the java file being generated. @@ -51,7 +57,6 @@ public class YangJavaUses public YangJavaUses() { super(); setJavaFileInfo(new JavaFileInfo()); - getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER); } /** @@ -97,31 +102,57 @@ public class YangJavaUses tempFileHandle = fileHandle; } - /** - * Prepare the information for java code generation corresponding to YANG - * uses info. - * - * @param yangPlugin YANG plugin config - * @throws TranslatorException translator operation fail - */ + @Override - public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException { + public void generateCodeEntry(YangPluginConfig yangPlugin) + throws TranslatorException { try { - addCurNodeInfoInParentTempFile(this, false, yangPlugin); + updatePackageInfo(this, yangPlugin); + + if (!(getParentNodeInGenCode(this) instanceof JavaCodeGeneratorInfo)) { + throw new TranslatorException("invalid container of uses"); + } + JavaCodeGeneratorInfo javaCodeGeneratorInfo = (JavaCodeGeneratorInfo) getParentNodeInGenCode(this); + + if (javaCodeGeneratorInfo instanceof YangGrouping) { + /* + * Do nothing, since it will taken care in the groupings uses. + */ + return; + } + + for (List leavesList : + getUsesResolvedLeavesList()) { + //add the resolved leaves to the parent as an attribute + javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles() + .getBeanTempFiles().addLeavesInfoToTempFiles(leavesList, yangPlugin); + } + + for (List listOfLeafLists : + getUsesResolvedListOfLeafList()) { + //add the resolved leaf-list to the parent as an attribute + javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles() + .getBeanTempFiles().addLeafListInfoToTempFiles(listOfLeafLists, yangPlugin); + } + + for (YangNode usesResolvedNode : + getUsesResolvedNodeList()) { + //add the resolved nodes to the parent as an attribute + addCurNodeAsAttributeInTargetTempFile(usesResolvedNode, yangPlugin, + getParentNodeInGenCode(this)); + } + } catch (IOException e) { - throw new TranslatorException( - "Failed to prepare generate code entry for container node " + this.getName()); + throw new TranslatorException(e.getCause()); } } - /** - * Create a java file using the YANG uses info. - * - * @throws TranslatorException translator operation fail - */ - @Override - public void generateCodeExit() throws TranslatorException { - // no code generation will be done for uses. - } + @Override + public void generateCodeExit() + throws TranslatorException { + /* + * Do nothing. + */ + } } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/AttributesJavaDataType.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/AttributesJavaDataType.java index 9e7cc5cf7e..19ed11d8ad 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/AttributesJavaDataType.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/AttributesJavaDataType.java @@ -16,6 +16,8 @@ package org.onosproject.yangutils.translator.tojava.utils; +import java.util.Stack; + import org.onosproject.yangutils.datamodel.YangDataTypes; import org.onosproject.yangutils.datamodel.YangDerivedInfo; import org.onosproject.yangutils.datamodel.YangEnumeration; @@ -26,6 +28,7 @@ import org.onosproject.yangutils.datamodel.YangUnion; import org.onosproject.yangutils.translator.exception.TranslatorException; import org.onosproject.yangutils.translator.tojava.JavaFileInfo; import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer; +import org.onosproject.yangutils.translator.tojava.javamodel.JavaCodeGeneratorInfo; import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaEnumeration; import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule; import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule; @@ -34,6 +37,8 @@ import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaUnion; import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase; import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase; +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCurNodePackage; +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage; import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage; import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER; import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE; @@ -119,7 +124,7 @@ public final class AttributesJavaDataType { * Returns from string method parsed string. * * @param targetDataType target data type - * @param yangType YANG type + * @param yangType YANG type * @return parsed string */ public static String getParseFromStringMethod(String targetDataType, YangType yangType) { @@ -163,8 +168,8 @@ public final class AttributesJavaDataType { /** * Returns java import class. * - * @param yangType YANG type - * @param isListAttr if the attribute need to be a list + * @param yangType YANG type + * @param isListAttr if the attribute need to be a list * @param pluginConfig plugin configurations * @return java import class */ @@ -199,8 +204,8 @@ public final class AttributesJavaDataType { return BOOLEAN_WRAPPER; case ENUMERATION: return getCapitalCase( - getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(), - pluginConfig)); + getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(), + pluginConfig)); case BITS: return YANG_BITS_CLASS; case BINARY: @@ -215,13 +220,13 @@ public final class AttributesJavaDataType { return BOOLEAN_WRAPPER; case UNION: return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(), - pluginConfig)); + pluginConfig)); case INSTANCE_IDENTIFIER: //TODO:INSTANCE_IDENTIFIER break; case DERIVED: - return getCapitalCase( - getCamelCase(yangType.getDataTypeName(), pluginConfig)); + return getCapitalCase( + getCamelCase(yangType.getDataTypeName(), pluginConfig)); default: throw new TranslatorException("given data type is not supported."); } @@ -235,8 +240,8 @@ public final class AttributesJavaDataType { return STRING_DATA_TYPE; case ENUMERATION: return getCapitalCase( - getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(), - pluginConfig)); + getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(), + pluginConfig)); case BITS: return YANG_BITS_CLASS; case BINARY: @@ -251,13 +256,13 @@ public final class AttributesJavaDataType { return BOOLEAN_DATA_TYPE; case UNION: return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(), - pluginConfig)); + pluginConfig)); case INSTANCE_IDENTIFIER: //TODO:INSTANCE_IDENTIFIER break; case DERIVED: - return getCapitalCase( - getCamelCase(yangType.getDataTypeName(), pluginConfig)); + return getCapitalCase( + getCamelCase(yangType.getDataTypeName(), pluginConfig)); default: return null; } @@ -268,8 +273,8 @@ public final class AttributesJavaDataType { /** * Returns java import package. * - * @param yangType YANG type - * @param isListAttr if the attribute is of list type + * @param yangType YANG type + * @param isListAttr if the attribute is of list type * @param conflictResolver object of YANG to java naming conflict util * @return java import package */ @@ -352,7 +357,7 @@ public final class AttributesJavaDataType { /** * Returns java package for typedef node. * - * @param type YANG type + * @param type YANG type * @param conflictResolver object of YANG to java naming conflict util * @return java package for typedef node */ @@ -376,7 +381,7 @@ public final class AttributesJavaDataType { /** * Returns java package for union node. * - * @param type YANG type + * @param type YANG type * @param conflictResolver object of YANG to java naming conflict util * @return java package for union node */ @@ -396,7 +401,7 @@ public final class AttributesJavaDataType { /** * Returns YANG enumeration's java package. * - * @param type YANG type + * @param type YANG type * @param conflictResolver object of YANG to java naming conflict util * @return YANG enumeration's java package */ @@ -415,29 +420,87 @@ public final class AttributesJavaDataType { /** * Returns package from parent node. * - * @param parent parent YANG node + * @param parent parent YANG node * @param conflictResolver object of YANG to java naming conflict util * @return java package from parent node */ - private static String getPackageFromParent(YangNode parent, YangToJavaNamingConflictUtil conflictResolver) { + private static String getPackageFromParent(YangNode parent, + YangToJavaNamingConflictUtil conflictResolver) { if (!(parent instanceof JavaFileInfoContainer)) { throw new TranslatorException("invalid child node is being processed."); } JavaFileInfo parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo(); if (parentInfo.getPackage() == null) { - if (parent instanceof YangJavaModule) { - YangJavaModule module = (YangJavaModule) parent; - String modulePkg = getRootPackage(module.getVersion(), module.getNameSpace().getUri(), module - .getRevision().getRevDate(), conflictResolver); - return modulePkg + PERIOD + getCamelCase(module.getName(), conflictResolver).toLowerCase(); - } else if (parent instanceof YangJavaSubModule) { - YangJavaSubModule submodule = (YangJavaSubModule) parent; - String subModulePkg = getRootPackage(submodule.getVersion(), - submodule.getNameSpaceFromModule(submodule.getBelongsTo()), - submodule.getRevision().getRevDate(), conflictResolver); - return subModulePkg + PERIOD + getCamelCase(submodule.getName(), conflictResolver).toLowerCase(); - } + updateJavaFileInfo(parent, conflictResolver); } return parentInfo.getPackage() + PERIOD + parentInfo.getJavaName().toLowerCase(); } + + /** + * Update the referred data model nodes java file info, this will be called, + * when the linked node is yet to translate. Then resolve until the parent hierarchy. + * + * @param yangNode node whose java info needs to be updated + * @param conflictResolver yang plugin config + */ + public static void updateJavaFileInfo(YangNode yangNode, + YangToJavaNamingConflictUtil conflictResolver) { + Stack nodesToUpdatePackage = new Stack(); + + /* + * Add the nodes to be updated for package info in a stack. + */ + while (yangNode != null + && ((JavaFileInfoContainer) yangNode) + .getJavaFileInfo().getPackage() == null) { + nodesToUpdatePackage.push(yangNode); + yangNode = yangNode.getParent(); + } + + /* + * If the package is not updated till root node, then root package needs to + * be updated. + */ + if (yangNode == null) { + yangNode = nodesToUpdatePackage.pop(); + String pkg; + if (yangNode instanceof YangJavaModule) { + YangJavaModule module = (YangJavaModule) yangNode; + pkg = getRootPackage(module.getVersion(), module.getNameSpace().getUri(), module + .getRevision().getRevDate(), conflictResolver); + } else if (yangNode instanceof YangJavaSubModule) { + YangJavaSubModule submodule = (YangJavaSubModule) yangNode; + pkg = getRootPackage(submodule.getVersion(), + submodule.getNameSpaceFromModule(submodule.getBelongsTo()), + submodule.getRevision().getRevDate(), conflictResolver); + } else { + throw new TranslatorException("Invalid root node of data model tree"); + } + + ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo() + .setJavaName(getCamelCase(yangNode.getName(), conflictResolver)); + ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo() + .setPackage(pkg); + ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo() + .setPackageFilePath(getPackageDirPathFromJavaJPackage( + ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo() + .getPackage())); + } + + /** + * Parent of the node in stack is updated with java info, + * all the nodes can be popped and updated + */ + while (nodesToUpdatePackage.size() != 0) { + yangNode = nodesToUpdatePackage.pop(); + ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo() + .setJavaName(getCamelCase(yangNode.getName(), conflictResolver)); + ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo() + .setPackage(getCurNodePackage(yangNode)); + ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo() + .setPackageFilePath(getPackageDirPathFromJavaJPackage( + ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo() + .getPackage())); + } + } } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaExtendsListHolder.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaExtendsListHolder.java index 3ee83fddde..36986b8266 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaExtendsListHolder.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaExtendsListHolder.java @@ -27,6 +27,7 @@ import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer; import org.onosproject.yangutils.translator.tojava.JavaImportData; import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo; +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase; import static org.onosproject.yangutils.translator.tojava.utils.TempJavaCodeFragmentFilesUtils.getTempJavaFragement; /** @@ -58,7 +59,7 @@ public class JavaExtendsListHolder { /** * Sets extends list. * - * @param extendsList list of classes need to be extended + * @param extendedClass map of classes need to be extended */ private void setExtendedClassStore(Map extendedClass) { this.extendedClassStore = extendedClass; @@ -73,14 +74,13 @@ public class JavaExtendsListHolder { public void addToExtendsList(JavaQualifiedTypeInfo info, YangNode node) { JavaFileInfo fileInfo = ((JavaFileInfoContainer) node).getJavaFileInfo(); - if (!fileInfo.getPackage().equals(info.getPkgInfo())) { - JavaImportData importData = getTempJavaFragement(node).getJavaImportData(); - importData.addImportInfo(info); + JavaImportData importData = getTempJavaFragement(node).getJavaImportData(); + boolean qualified = importData.addImportInfo(info, + getCapitalCase(fileInfo.getJavaName()), fileInfo.getPackage()); /*true means import should be added*/ - getExtendedClassStore().put(info, true); - } - getExtendedClassStore().put(info, false); + getExtendedClassStore().put(info, qualified); + addToExtendsList(info); } diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java index 0b951db9f6..0ecc49eaa4 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java @@ -83,7 +83,6 @@ import static org.onosproject.yangutils.utils.UtilConstants.SERVICE_ANNOTATION; import static org.onosproject.yangutils.utils.UtilConstants.SLASH; import static org.onosproject.yangutils.utils.UtilConstants.SPACE; import static org.onosproject.yangutils.utils.UtilConstants.TRUE; -import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_CLASS; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_INTERFACE; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ENUM_CLASS; @@ -94,6 +93,7 @@ import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.IMP import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.RPC_INTERFACE; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.RPC_MANAGER; +import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc; import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile; import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.parsePkg; @@ -111,10 +111,10 @@ public final class JavaFileGeneratorUtils { /** * Returns a file object for generated file. * - * @param filePath file package path - * @param fileName file name + * @param fileName file name + * @param filePath file package path * @param extension file extension - * @param handle cached file handle + * @param handle cached file handle * @return file object */ public static File getFileObject(String filePath, String fileName, String extension, JavaFileInfo handle) { @@ -125,7 +125,7 @@ public final class JavaFileGeneratorUtils { /** * Returns data stored in temporary files. * - * @param generatedTempFiles temporary file types + * @param generatedTempFiles temporary file types * @param tempJavaFragmentFiles temp java fragment files * @return data stored in temporary files * @throws IOException when failed to get the data from temporary file handle @@ -253,11 +253,11 @@ public final class JavaFileGeneratorUtils { /** * Initiates generation of file based on generated file type. * - * @param file generated file - * @param className generated file class name - * @param genType generated file type - * @param imports imports for the file - * @param pkg generated file package + * @param file generated file + * @param className generated file class name + * @param genType generated file type + * @param imports imports for the file + * @param pkg generated file package * @param pluginConfig plugin configurations * @throws IOException when fails to generate a file */ @@ -276,17 +276,22 @@ public final class JavaFileGeneratorUtils { /** * Initiates generation of file based on generated file type. * - * @param file generated file - * @param genType generated file type - * @param imports imports for the file - * @param curNode current YANG node + * @param file generated file + * @param genType generated file type + * @param imports imports for the file + * @param curNode current YANG node * @param className class name * @throws IOException when fails to generate a file */ public static void initiateJavaFileGeneration(File file, int genType, List imports, - YangNode curNode, String className) throws IOException { + YangNode curNode, String className) + throws IOException { try { + if (file.exists()) { + throw new IOException(file.getName() + " is reused due to YANG naming"); + } + file.createNewFile(); appendContents(file, genType, imports, curNode, className); } catch (IOException e) { @@ -297,15 +302,16 @@ public final class JavaFileGeneratorUtils { /** * Appends all the contents into a generated java file. * - * @param file generated file - * @param genType generated file type + * @param file generated file + * @param genType generated file type * @param importsList list of java imports - * @param curNode current YANG node - * @param className class name + * @param curNode current YANG node + * @param className class name * @throws IOException */ private static void appendContents(File file, int genType, List importsList, YangNode curNode, - String className) throws IOException { + String className) + throws IOException { JavaFileInfo javaFileInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo(); @@ -321,39 +327,39 @@ public final class JavaFileGeneratorUtils { pkgString = parsePackageString(path, importsList); } switch (genType) { - case INTERFACE_MASK: - appendHeaderContents(file, pkgString, importsList); - write(file, genType, INTERFACE, curNode, className); - break; - case GENERATE_SERVICE_AND_MANAGER: - appendHeaderContents(file, pkgString, importsList); - write(file, genType, RPC_INTERFACE, curNode, className); - break; - case GENERATE_EVENT_CLASS: - appendHeaderContents(file, pkgString, importsList); - write(file, genType, EVENT, curNode, className); - break; - case GENERATE_EVENT_LISTENER_INTERFACE: - appendHeaderContents(file, pkgString, importsList); - write(file, genType, EVENT_LISTENER, curNode, className); - break; - case GENERATE_EVENT_SUBJECT_CLASS: - appendHeaderContents(file, pkgString, importsList); - write(file, genType, EVENT_SUBJECT_CLASS, curNode, className); - break; - default: - break; + case INTERFACE_MASK: + appendHeaderContents(file, pkgString, importsList); + write(file, genType, INTERFACE, curNode, className); + break; + case GENERATE_SERVICE_AND_MANAGER: + appendHeaderContents(file, pkgString, importsList); + write(file, genType, RPC_INTERFACE, curNode, className); + break; + case GENERATE_EVENT_CLASS: + appendHeaderContents(file, pkgString, importsList); + write(file, genType, EVENT, curNode, className); + break; + case GENERATE_EVENT_LISTENER_INTERFACE: + appendHeaderContents(file, pkgString, importsList); + write(file, genType, EVENT_LISTENER, curNode, className); + break; + case GENERATE_EVENT_SUBJECT_CLASS: + appendHeaderContents(file, pkgString, importsList); + write(file, genType, EVENT_SUBJECT_CLASS, curNode, className); + break; + default: + break; } } /** * Appends all the contents into a generated java file. * - * @param file generated file - * @param fileName generated file name - * @param genType generated file type - * @param importsList list of java imports - * @param pkg generated file package + * @param file generated file + * @param fileName generated file name + * @param genType generated file type + * @param importsList list of java imports + * @param pkg generated file package * @param pluginConfig plugin configurations * @throws IOException when fails to append contents */ @@ -364,37 +370,37 @@ public final class JavaFileGeneratorUtils { String pkgString = parsePackageString(pkg, importsList); switch (genType) { - case IMPL_CLASS_MASK: - write(file, fileName, genType, IMPL_CLASS, pluginConfig); - break; - case BUILDER_INTERFACE_MASK: - write(file, fileName, genType, BUILDER_INTERFACE, pluginConfig); - break; - case GENERATE_TYPEDEF_CLASS: - appendHeaderContents(file, pkgString, importsList); - write(file, fileName, genType, IMPL_CLASS, pluginConfig); - break; - case BUILDER_CLASS_MASK: - appendHeaderContents(file, pkgString, importsList); - write(file, fileName, genType, BUILDER_CLASS, pluginConfig); - break; - case GENERATE_UNION_CLASS: - appendHeaderContents(file, pkgString, importsList); - write(file, fileName, genType, IMPL_CLASS, pluginConfig); - break; - case GENERATE_ENUM_CLASS: - appendHeaderContents(file, pkgString, importsList); - write(file, fileName, genType, ENUM_CLASS, pluginConfig); - break; - default: - break; + case IMPL_CLASS_MASK: + write(file, fileName, genType, IMPL_CLASS, pluginConfig); + break; + case BUILDER_INTERFACE_MASK: + write(file, fileName, genType, BUILDER_INTERFACE, pluginConfig); + break; + case GENERATE_TYPEDEF_CLASS: + appendHeaderContents(file, pkgString, importsList); + write(file, fileName, genType, IMPL_CLASS, pluginConfig); + break; + case BUILDER_CLASS_MASK: + appendHeaderContents(file, pkgString, importsList); + write(file, fileName, genType, BUILDER_CLASS, pluginConfig); + break; + case GENERATE_UNION_CLASS: + appendHeaderContents(file, pkgString, importsList); + write(file, fileName, genType, IMPL_CLASS, pluginConfig); + break; + case GENERATE_ENUM_CLASS: + appendHeaderContents(file, pkgString, importsList); + write(file, fileName, genType, ENUM_CLASS, pluginConfig); + break; + default: + break; } } /** * Removes base directory path from package and generates package string for file. * - * @param javaPkg generated java package + * @param javaPkg generated java package * @param importsList list of imports * @return package string */ @@ -416,8 +422,8 @@ public final class JavaFileGeneratorUtils { * Appends other contents to interface, builder and typedef classes. * for example : ONOS copyright, imports and package. * - * @param file generated file - * @param pkg generated package + * @param file generated file + * @param pkg generated package * @param importsList list of imports * @throws IOException when fails to append contents */ @@ -443,11 +449,11 @@ public final class JavaFileGeneratorUtils { /** * Writes data to the specific generated file. * - * @param file generated file - * @param genType generated file type + * @param file generated file + * @param genType generated file type * @param javaDocType java doc type - * @param curNode current YANG node - * @param fileName file name + * @param curNode current YANG node + * @param fileName file name * @throws IOException when fails to write into a file */ private static void write(File file, int genType, JavaDocType javaDocType, YangNode curNode, String fileName) @@ -470,10 +476,10 @@ public final class JavaFileGeneratorUtils { /** * Writes data to the specific generated file. * - * @param file generated file - * @param fileName file name - * @param genType generated file type - * @param javaDocType java doc type + * @param file generated file + * @param fileName file name + * @param genType generated file type + * @param javaDocType java doc type * @param pluginConfig plugin configurations * @throws IOException */ diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/TempJavaCodeFragmentFilesUtils.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/TempJavaCodeFragmentFilesUtils.java index 617ac99d84..f70ec538f0 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/TempJavaCodeFragmentFilesUtils.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/TempJavaCodeFragmentFilesUtils.java @@ -29,12 +29,7 @@ import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles; import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer; import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles; import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaAugment; -import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaInput; import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule; -import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaOutput; -import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule; - -import static java.util.Collections.sort; import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase; import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getSmallCase; @@ -69,6 +64,8 @@ import static org.onosproject.yangutils.utils.UtilConstants.THIS; import static org.onosproject.yangutils.utils.UtilConstants.TYPE; import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle; +import static java.util.Collections.sort; + /** * Represents utilities for temporary java code fragments. */ @@ -83,8 +80,8 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Adds import for AugmentationHolders class. * - * @param curNode current YANG node - * @param imports list of imports + * @param curNode current YANG node + * @param imports list of imports * @param operation add or delete import */ public static void addAugmentationHoldersImport(YangNode curNode, List imports, boolean operation) { @@ -95,8 +92,8 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Adds import for AugmentedInfo class. * - * @param curNode current YANG node - * @param imports list of imports + * @param curNode current YANG node + * @param imports list of imports * @param operation add or delete import */ public static void addAugmentedInfoImport(YangNode curNode, List imports, boolean operation) { @@ -126,8 +123,8 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Updated imports with augmented nodes import. * - * @param curNode current YANG node - * @param imports list of imports + * @param curNode current YANG node + * @param imports list of imports * @param operation to add or to delete */ public static void addAugmentedNodesImport(YangNode curNode, List imports, boolean operation) { @@ -156,7 +153,7 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Returns imports for augmented node. * - * @param parent parent YANG node + * @param parent parent YANG node * @param targetNodes list of target nodes * @param isImplClass if impl class's import required * @return imports for augmented node @@ -204,8 +201,8 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Adds import for array list. * - * @param curNode current YANG node - * @param imports list of imports + * @param curNode current YANG node + * @param imports list of imports * @param operation add or delete import */ public static void addArrayListImport(YangNode curNode, List imports, boolean operation) { @@ -224,8 +221,8 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Adds listener's imports. * - * @param curNode currentYangNode. - * @param imports import list + * @param curNode currentYangNode. + * @param imports import list * @param operation add or remove * @param classInfo class info to be added to import list */ @@ -244,7 +241,7 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Adds annotations imports. * - * @param imports list if imports + * @param imports list if imports * @param operation to add or to delete */ public static void addAnnotationsImports(List imports, boolean operation) { @@ -269,7 +266,7 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Performs given operations on import list. * - * @param imports list of imports + * @param imports list of imports * @param curImport current import * @param operation add or remove * @return import list @@ -314,7 +311,7 @@ public final class TempJavaCodeFragmentFilesUtils { /** * Closes the file handle for temporary file. * - * @param file file to be closed + * @param file file to be closed * @param toBeDeleted flag to indicate if file needs to be deleted * @throws IOException when failed to close the file handle */ @@ -329,33 +326,6 @@ public final class TempJavaCodeFragmentFilesUtils { } } - /** - * Detects collision between parent and child node which have same name. - * When parent and child node both have the same name in that case child node should be used with - * qualified name. - * - * @param curNode current YANG node - * @param qualifiedTypeInfo current node's qualified info - * @return true if collision is detected - */ - public static boolean detectCollisionBwParentAndChildForImport(YangNode curNode, - JavaQualifiedTypeInfo qualifiedTypeInfo) { - - YangNode parent = curNode.getParent(); - if (parent instanceof YangJavaModule - || parent instanceof YangJavaSubModule - || parent instanceof YangJavaInput - || parent instanceof YangJavaOutput) { - return false; - } - String parentsClassInfo = getCapitalCase(((JavaFileInfoContainer) parent).getJavaFileInfo().getJavaName()); - String childsClassInfo = qualifiedTypeInfo.getClassInfo(); - if (childsClassInfo.equals(parentsClassInfo)) { - return true; - } - return false; - } - /** * Returns sorted import list. * diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/YangJavaModelUtils.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/YangJavaModelUtils.java index 8e020824db..3f378c7a1b 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/YangJavaModelUtils.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/YangJavaModelUtils.java @@ -19,8 +19,6 @@ package org.onosproject.yangutils.translator.tojava.utils; import java.io.IOException; import org.onosproject.yangutils.datamodel.RpcNotificationContainer; -import org.onosproject.yangutils.datamodel.YangAugment; -import org.onosproject.yangutils.datamodel.YangAugmentationHolder; import org.onosproject.yangutils.datamodel.YangCase; import org.onosproject.yangutils.datamodel.YangChoice; import org.onosproject.yangutils.datamodel.YangLeavesHolder; @@ -45,9 +43,6 @@ import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSy import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase; import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCurNodePackage; import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage; -import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION_HOLDER; -import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED_INFO; -import static org.onosproject.yangutils.utils.UtilConstants.PROVIDED_AUGMENTATION_CLASS_IMPORT_PKG; /** * Represents utility class for YANG java model. @@ -64,7 +59,7 @@ public final class YangJavaModelUtils { * Updates YANG java file package information. * * @param javaCodeGeneratorInfo YANG java file info node - * @param yangPluginConfig YANG plugin config + * @param yangPluginConfig YANG plugin config * @throws IOException IO operations fails */ public static void updatePackageInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo, @@ -85,7 +80,7 @@ public final class YangJavaModelUtils { * Updates YANG java file package information for specified package. * * @param javaCodeGeneratorInfo YANG java file info node - * @param yangPlugin YANG plugin config + * @param yangPlugin YANG plugin config * @throws IOException IO operations fails */ private static void updatePackageInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo, YangPluginConfig yangPlugin, @@ -128,7 +123,7 @@ public final class YangJavaModelUtils { */ javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles() .getServiceTempFiles().addCurNodeLeavesInfoToTempFiles( - (YangNode) javaCodeGeneratorInfo, yangPluginConfig); + (YangNode) javaCodeGeneratorInfo, yangPluginConfig); if ((YangNode) javaCodeGeneratorInfo instanceof YangJavaModule) { if (!((YangJavaModule) javaCodeGeneratorInfo).getNotificationNodes().isEmpty()) { updateNotificaitonNodeInfo(javaCodeGeneratorInfo, yangPluginConfig); @@ -151,7 +146,7 @@ public final class YangJavaModelUtils { */ javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles() .getBeanTempFiles().addCurNodeLeavesInfoToTempFiles( - (YangNode) javaCodeGeneratorInfo, yangPluginConfig); + (YangNode) javaCodeGeneratorInfo, yangPluginConfig); } else if (javaCodeGeneratorInfo instanceof YangTypeHolder) { /* * Typedef @@ -194,11 +189,12 @@ public final class YangJavaModelUtils { * Updates notification node info in service temporary file. * * @param javaCodeGeneratorInfo java code generator info - * @param yangPluginConfig plugin configurations + * @param yangPluginConfig plugin configurations * @throws IOException when fails to do IO operations */ private static void updateNotificaitonNodeInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo, - YangPluginConfig yangPluginConfig) throws IOException { + YangPluginConfig yangPluginConfig) + throws IOException { if ((YangNode) javaCodeGeneratorInfo instanceof YangJavaModule) { for (YangNode notificaiton : ((YangJavaModule) javaCodeGeneratorInfo).getNotificationNodes()) { javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles() @@ -220,8 +216,8 @@ public final class YangJavaModelUtils { * Generates code for the current ata model node and adds itself as an attribute in the parent. * * @param javaCodeGeneratorInfo YANG java file info node - * @param yangPlugin YANG plugin config - * @param isMultiInstance flag to indicate whether it's a list + * @param yangPlugin YANG plugin config + * @param isMultiInstance flag to indicate whether it's a list * @throws IOException IO operations fails */ public static void generateCodeAndUpdateInParent(JavaCodeGeneratorInfo javaCodeGeneratorInfo, @@ -246,7 +242,7 @@ public final class YangJavaModelUtils { * Generates code for the current data model node and adds support for it to be augmented. * * @param javaCodeGeneratorInfo YANG java file info node - * @param yangPlugin YANG plugin config + * @param yangPlugin YANG plugin config * @throws IOException IO operations fails */ public static void generateCodeOfAugmentableNode(JavaCodeGeneratorInfo javaCodeGeneratorInfo, @@ -259,8 +255,9 @@ public final class YangJavaModelUtils { generateCodeOfNode(javaCodeGeneratorInfo, yangPlugin); /* + TODO: Need to use this, when augmentation is added in YMS * For augmentation of nodes. - */ + if (javaCodeGeneratorInfo instanceof YangAugmentationHolder) { JavaQualifiedTypeInfo augmentationHoldersInfo = new JavaQualifiedTypeInfo(); augmentationHoldersInfo.setClassInfo(AUGMENTATION_HOLDER); @@ -276,7 +273,7 @@ public final class YangJavaModelUtils { .addToExtendsList(augmentedInfo, (YangNode) javaCodeGeneratorInfo); } - + */ if (javaCodeGeneratorInfo instanceof YangCase) { YangNode parent = ((YangCase) javaCodeGeneratorInfo).getParent(); JavaQualifiedTypeInfo parentsInfo = new JavaQualifiedTypeInfo(); @@ -297,7 +294,7 @@ public final class YangJavaModelUtils { * Generates code for the current data model node. * * @param javaCodeGeneratorInfo YANG java file info node - * @param yangPluginConfig YANG plugin config + * @param yangPluginConfig YANG plugin config * @throws IOException IO operations fails */ public static void generateCodeOfNode(JavaCodeGeneratorInfo javaCodeGeneratorInfo, @@ -314,8 +311,8 @@ public final class YangJavaModelUtils { * Generates code for the root module/sub-module node. * * @param javaCodeGeneratorInfo YANG java file info node - * @param yangPluginConfig YANG plugin config - * @param rootPkg package of the root node + * @param yangPluginConfig YANG plugin config + * @param rootPkg package of the root node * @throws IOException IO operations fails */ public static void generateCodeOfRootNode(JavaCodeGeneratorInfo javaCodeGeneratorInfo, diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java index 7e89998cbc..adc7015757 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java @@ -966,6 +966,7 @@ public final class UtilConstants { * Static attribute for augmentable. */ public static final String AUGMENTABLE = "Augmentable"; + /** * Static attribute for list. */ @@ -1017,6 +1018,11 @@ public final class UtilConstants { */ public static final String COMPONENT_ANNOTATION = "@Component"; + /** + * Static attribute for component. + */ + public static final String COMPONENT = "Component"; + /** * Static attribute for immediate. */ @@ -1133,6 +1139,16 @@ public final class UtilConstants { public static final String GROUPING_LINKER_ERROR = "YANG file error: Unable to find base " + "grouping for given uses"; + /** + * Static attribute for reference. + */ + public static final String REFERENCE = "Reference"; + + /** + * Static attribute for ReferenceCardinality. + */ + public static final String REFERENCE_CARDINALITY = "ReferenceCardinality"; + /** * Creates an instance of util constants. */ diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java index 7120612038..47e95c38f9 100644 --- a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java +++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java @@ -56,8 +56,8 @@ import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTA import static org.onosproject.yangutils.utils.UtilConstants.YANG_RESOURCES; import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.appendFileContents; import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle; -import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc; import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.PACKAGE_INFO; +import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc; import static org.slf4j.LoggerFactory.getLogger; /** @@ -67,7 +67,7 @@ public final class YangIoUtils { private static final Logger log = getLogger(YangIoUtils.class); private static final String TARGET_RESOURCE_PATH = SLASH + TEMP + SLASH + YANG_RESOURCES + SLASH; - private static final int LINE_SIZE = 116; + private static final int LINE_SIZE = 118; private static final int SUB_LINE_SIZE = 112; private static final int ZERO = 0; @@ -92,10 +92,10 @@ public final class YangIoUtils { /** * Adds package info file for the created directory. * - * @param path directory path - * @param classInfo class info for the package - * @param pack package of the directory - * @param isChildNode is it a child node + * @param path directory path + * @param classInfo class info for the package + * @param pack package of the directory + * @param isChildNode is it a child node * @param pluginConfig plugin configurations * @throws IOException when fails to create package info file */ @@ -159,7 +159,8 @@ public final class YangIoUtils { * @param dir generated directory in previous build * @throws IOException when failed to delete directory */ - public static void deleteDirectory(String dir) throws IOException { + public static void deleteDirectory(String dir) + throws IOException { File generatedDirectory = new File(dir); if (generatedDirectory.exists()) { try { @@ -177,7 +178,8 @@ public final class YangIoUtils { * @param root root directory * @throws IOException when fails to do IO operations. */ - public static void searchAndDeleteTempDir(String root) throws IOException { + public static void searchAndDeleteTempDir(String root) + throws IOException { List store = new LinkedList<>(); Stack stack = new Stack<>(); stack.push(root); @@ -207,7 +209,7 @@ public final class YangIoUtils { /** * Adds generated source directory to the compilation root. * - * @param source directory + * @param source directory * @param project current maven project * @param context current build context */ @@ -220,7 +222,7 @@ public final class YangIoUtils { /** * Removes extra char from the string. * - * @param valueString string to be trimmed + * @param valueString string to be trimmed * @param removealStirng extra chars * @return new string */ @@ -255,8 +257,8 @@ public final class YangIoUtils { * Returns the directory path of the package in canonical form. * * @param baseCodeGenPath base path where the generated files needs to be - * put - * @param pathOfJavaPkg java package of the file being generated + * put + * @param pathOfJavaPkg java package of the file being generated * @return absolute path of the package in canonical form */ public static String getDirectory(String baseCodeGenPath, String pathOfJavaPkg) { @@ -276,8 +278,8 @@ public final class YangIoUtils { * Returns the absolute path of the package in canonical form. * * @param baseCodeGenPath base path where the generated files needs to be - * put - * @param pathOfJavaPkg java package of the file being generated + * put + * @param pathOfJavaPkg java package of the file being generated * @return absolute path of the package in canonical form */ public static String getAbsolutePackagePath(String baseCodeGenPath, String pathOfJavaPkg) { @@ -288,8 +290,8 @@ public final class YangIoUtils { * Copies YANG files to the current project's output directory. * * @param yangFileInfo list of YANG files - * @param outputDir project's output directory - * @param project maven project + * @param outputDir project's output directory + * @param project maven project * @throws IOException when fails to copy files to destination resource directory */ public static void copyYangFilesToTarget(Set yangFileInfo, String outputDir, MavenProject project) @@ -334,7 +336,8 @@ public final class YangIoUtils { * @param srcFile main file * @throws IOException when fails to append contents */ - public static void mergeJavaFiles(File appendFile, File srcFile) throws IOException { + public static void mergeJavaFiles(File appendFile, File srcFile) + throws IOException { try { appendFileContents(appendFile, srcFile); } catch (IOException e) { @@ -349,7 +352,8 @@ public final class YangIoUtils { * @param data data which need to be inserted * @throws IOException when fails to insert into file */ - public static void insertDataIntoJavaFile(File file, String data) throws IOException { + public static void insertDataIntoJavaFile(File file, String data) + throws IOException { try { updateFileHandle(file, data, false); } catch (IOException e) { @@ -365,7 +369,8 @@ public final class YangIoUtils { * @return updated file * @throws IOException when fails to do IO operations. */ - public static File validateLineLength(File dataFile) throws IOException { + public static File validateLineLength(File dataFile) + throws IOException { File tempFile = dataFile; FileReader fileReader = new FileReader(dataFile); BufferedReader bufferReader = new BufferedReader(fileReader); diff --git a/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/InterFileLinkingTest.java b/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/InterFileLinkingTest.java index 3ca5315dd7..c170cd9df7 100644 --- a/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/InterFileLinkingTest.java +++ b/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/InterFileLinkingTest.java @@ -19,6 +19,7 @@ package org.onosproject.yangutils.linker; import java.io.IOException; import java.util.Iterator; import java.util.ListIterator; + import org.apache.maven.plugin.MojoExecutionException; import org.junit.Test; import org.onosproject.yangutils.datamodel.YangDataTypes; @@ -30,12 +31,12 @@ import org.onosproject.yangutils.datamodel.YangNode; import org.onosproject.yangutils.datamodel.YangNodeType; import org.onosproject.yangutils.datamodel.YangTypeDef; import org.onosproject.yangutils.datamodel.YangUses; -import org.onosproject.yangutils.linker.impl.ResolvableStatus; import org.onosproject.yangutils.linker.impl.YangLinkerManager; import org.onosproject.yangutils.parser.exceptions.ParserException; import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; import org.onosproject.yangutils.plugin.manager.YangFileInfo; import org.onosproject.yangutils.plugin.manager.YangUtilManager; +import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig; import org.onosproject.yangutils.utils.io.impl.YangFileScanner; import static org.hamcrest.CoreMatchers.nullValue; @@ -44,7 +45,8 @@ import static org.hamcrest.core.Is.is; import static org.onosproject.yangutils.datamodel.YangDataTypes.DERIVED; import static org.onosproject.yangutils.datamodel.YangDataTypes.STRING; import static org.onosproject.yangutils.datamodel.YangNodeType.MODULE_NODE; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.RESOLVED; +import static org.onosproject.yangutils.linker.ResolvableStatus.RESOLVED; +import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirectory; /** * Test cases for testing inter file linking. @@ -186,13 +188,13 @@ public class InterFileLinkingTest { assertThat(uses.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); - leafIterator = yangNode.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under module. - assertThat(leafInfo.getName(), is("hello")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); +// leafIterator = yangNode.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under module. +// assertThat(leafInfo.getName(), is("hello")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); } /** @@ -332,13 +334,13 @@ public class InterFileLinkingTest { assertThat(uses.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); - leafIterator = yangNode.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under module. - assertThat(leafInfo.getName(), is("hello")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); +// leafIterator = yangNode.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under module. +// assertThat(leafInfo.getName(), is("hello")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); } /** @@ -599,4 +601,117 @@ public class InterFileLinkingTest { assertThat(derivedInfo.getPatternRestriction(), is(nullValue())); assertThat(derivedInfo.getResolvedExtendedInfo(), is(nullValue())); } + + /** + * Checks hierarchical intra with inter file type linking. + */ + @Test + public void interFileWithUsesReferringType() + throws IOException, ParserException, MojoExecutionException { + + String searchDir = "src/test/resources/interfilewithusesreferringtype"; + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir)); + utilManager.parseYangFileInfoSet(); + utilManager.resolveDependenciesUsingLinker(); + + String userDir = System.getProperty("user.dir"); + YangPluginConfig yangPluginConfig = new YangPluginConfig(); + yangPluginConfig.setCodeGenDir("target/interfilewithusesreferringtype/"); + + utilManager.translateToJava(utilManager.getYangFileInfoSet(), yangPluginConfig); + + deleteDirectory(userDir + "/target/interfilewithusesreferringtype/"); + + } + + /** + * Checks hierarchical intra with inter file type linking. + */ + @Test + public void file1UsesFile2TypeDefFile3Type() + throws IOException, ParserException, MojoExecutionException { + + String searchDir = "src/test/resources/file1UsesFile2TypeDefFile3Type"; + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir)); + utilManager.parseYangFileInfoSet(); + utilManager.resolveDependenciesUsingLinker(); + + String userDir = System.getProperty("user.dir"); + YangPluginConfig yangPluginConfig = new YangPluginConfig(); + yangPluginConfig.setCodeGenDir("target/file1UsesFile2TypeDefFile3Type/"); + + utilManager.translateToJava(utilManager.getYangFileInfoSet(), yangPluginConfig); + + deleteDirectory(userDir + "/target/file1UsesFile2TypeDefFile3Type/"); + + } + + + /** + * Checks hierarchical intra with inter file type linking. + */ + @Test + public void interFileIetf() + throws IOException, ParserException, MojoExecutionException { + + String searchDir = "src/test/resources/interfileietf"; + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir)); + utilManager.parseYangFileInfoSet(); + utilManager.resolveDependenciesUsingLinker(); + + String userDir = System.getProperty("user.dir"); + YangPluginConfig yangPluginConfig = new YangPluginConfig(); + yangPluginConfig.setCodeGenDir("target/interfileietf/"); + + utilManager.translateToJava(utilManager.getYangFileInfoSet(), yangPluginConfig); + + deleteDirectory(userDir + "/target/interfileietf/"); + + } + + + /** + * Checks hierarchical intra with inter file type linking. + */ + @Test + public void usesInContainer() + throws IOException, ParserException, MojoExecutionException { + + String searchDir = "src/test/resources/usesInContainer"; + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir)); + utilManager.parseYangFileInfoSet(); + utilManager.resolveDependenciesUsingLinker(); + + String userDir = System.getProperty("user.dir"); + YangPluginConfig yangPluginConfig = new YangPluginConfig(); + yangPluginConfig.setCodeGenDir("target/usesInContainer/"); + + utilManager.translateToJava(utilManager.getYangFileInfoSet(), yangPluginConfig); + + deleteDirectory(userDir + "/target/usesInContainer/"); + + } + + + /** + * Checks hierarchical intra with inter file type linking. + */ + @Test + public void groupingNodeSameAsModule() + throws IOException, ParserException, MojoExecutionException { + + String searchDir = "src/test/resources/groupingNodeSameAsModule"; + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir)); + utilManager.parseYangFileInfoSet(); + utilManager.resolveDependenciesUsingLinker(); + + String userDir = System.getProperty("user.dir"); + YangPluginConfig yangPluginConfig = new YangPluginConfig(); + yangPluginConfig.setCodeGenDir("target/groupingNodeSameAsModule/"); + + utilManager.translateToJava(utilManager.getYangFileInfoSet(), yangPluginConfig); + + deleteDirectory(userDir + "/target/groupingNodeSameAsModule/"); + + } } diff --git a/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/IntraFileTypeLinkingTest.java b/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/IntraFileTypeLinkingTest.java index ab4f45f8fb..d4ffaae296 100644 --- a/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/IntraFileTypeLinkingTest.java +++ b/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/IntraFileTypeLinkingTest.java @@ -33,12 +33,12 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.onosproject.yangutils.datamodel.YangDataTypes.BINARY; +import static org.onosproject.yangutils.linker.ResolvableStatus.INTRA_FILE_RESOLVED; +import static org.onosproject.yangutils.linker.ResolvableStatus.RESOLVED; import static org.onosproject.yangutils.datamodel.YangDataTypes.DERIVED; import static org.onosproject.yangutils.datamodel.YangDataTypes.INT32; import static org.onosproject.yangutils.datamodel.YangDataTypes.STRING; import static org.onosproject.yangutils.datamodel.YangNodeType.MODULE_NODE; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.INTRA_FILE_RESOLVED; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.RESOLVED; /** * Test cases for testing "type" intra file linking. diff --git a/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/IntraFileUsesLinkingTest.java b/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/IntraFileUsesLinkingTest.java index 212a499a7c..44533a0125 100644 --- a/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/IntraFileUsesLinkingTest.java +++ b/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/IntraFileUsesLinkingTest.java @@ -18,6 +18,7 @@ package org.onosproject.yangutils.linker; import java.io.IOException; import java.util.ListIterator; + import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -32,7 +33,6 @@ import org.onosproject.yangutils.datamodel.YangNodeType; import org.onosproject.yangutils.datamodel.YangTypeDef; import org.onosproject.yangutils.datamodel.YangUses; import org.onosproject.yangutils.linker.exceptions.LinkerException; -import org.onosproject.yangutils.linker.impl.ResolvableStatus; import org.onosproject.yangutils.parser.exceptions.ParserException; import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; @@ -92,13 +92,13 @@ public class IntraFileUsesLinkingTest { assertThat(uses.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); - leafIterator = yangNode.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under module. - assertThat(leafInfo.getName(), is("hello")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); +// leafIterator = yangNode.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under module. +// assertThat(leafInfo.getName(), is("hello")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); } @@ -161,28 +161,28 @@ public class IntraFileUsesLinkingTest { assertThat(uses.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); - leafIterator = yangNode.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); +// leafIterator = yangNode.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under module. +// assertThat(leafInfo.getName(), is("treat")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); - // Check whether the information in the leaf is correct under module. - assertThat(leafInfo.getName(), is("treat")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); - - // Check whether container is the child of module. - assertThat((grouping.getNextSibling() instanceof YangContainer), is(true)); - container = (YangContainer) grouping.getNextSibling(); - - // Check whether the container name is set correctly which is under module. - assertThat(container.getName(), is("test")); - - leafIterator = container.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under container which is under module. - assertThat(leafInfo.getName(), is("leaf2")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); +// // Check whether container is the child of module. +// assertThat((grouping.getNextSibling() instanceof YangContainer), is(true)); +// container = (YangContainer) grouping.getNextSibling(); +// +// // Check whether the container name is set correctly which is under module. +// assertThat(container.getName(), is("test")); +// +// leafIterator = container.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under container which is under module. +// assertThat(leafInfo.getName(), is("leaf2")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); } /** @@ -241,52 +241,52 @@ public class IntraFileUsesLinkingTest { assertThat(uses.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); - // Check whether list is the sibling of uses which has been deep copied from grouping. - assertThat((yangNode.getChild().getChild().getNextSibling().getChild().getNextSibling() instanceof YangList), - is(true)); - YangList yangList = (YangList) yangNode.getChild().getChild().getNextSibling().getChild().getNextSibling(); - - // Check whether the list name is set correctly. - assertThat(yangList.getName(), is("valid")); - - leafIterator = yangList.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under list which is deep copied. - assertThat(leafInfo.getName(), is("invalid-interval")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16)); - assertThat(leafInfo.getUnits(), is("\"seconds\"")); - assertThat(leafInfo.getReference(), is("\"RFC 6020\"")); - - // Check whether uses is output's child. - assertThat((yangNode.getChild().getChild().getNextSibling().getNextSibling().getChild() instanceof YangUses), - is(true)); - YangUses usesInOuput = (YangUses) yangNode.getChild().getChild().getNextSibling().getNextSibling().getChild(); - - // Check whether uses get resolved. - assertThat(usesInOuput.getResolvableStatus(), - is(ResolvableStatus.RESOLVED)); - - // Check whether list is the sibling of uses which has been deep copied from grouping. - assertThat((yangNode.getChild().getChild().getNextSibling().getChild().getNextSibling() instanceof YangList), - is(true)); - - YangList yangListInOutput = (YangList) yangNode.getChild().getChild().getNextSibling().getNextSibling() - .getChild().getNextSibling(); - - // Check whether the list name is set correctly. - assertThat(yangListInOutput.getName(), is("valid")); - - leafIterator = yangListInOutput.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under list which is deep copied. - assertThat(leafInfo.getName(), is("invalid-interval")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16)); - assertThat(leafInfo.getUnits(), is("\"seconds\"")); - assertThat(leafInfo.getReference(), is("\"RFC 6020\"")); +// // Check whether list is the sibling of uses which has been deep copied from grouping. +// assertThat((yangNode.getChild().getChild().getNextSibling().getChild().getNextSibling() instanceof YangList), +// is(true)); +// YangList yangList = (YangList) yangNode.getChild().getChild().getNextSibling().getChild().getNextSibling(); +// +// // Check whether the list name is set correctly. +// assertThat(yangList.getName(), is("valid")); +// +// leafIterator = yangList.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under list which is deep copied. +// assertThat(leafInfo.getName(), is("invalid-interval")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16)); +// assertThat(leafInfo.getUnits(), is("\"seconds\"")); +// assertThat(leafInfo.getReference(), is("\"RFC 6020\"")); +// +// // Check whether uses is output's child. +// assertThat((yangNode.getChild().getChild().getNextSibling().getNextSibling().getChild() instanceof YangUses), +// is(true)); +// YangUses usesInOuput = (YangUses) yangNode.getChild().getChild().getNextSibling().getNextSibling().getChild(); +// +// // Check whether uses get resolved. +// assertThat(usesInOuput.getResolvableStatus(), +// is(ResolvableStatus.RESOLVED)); +// +// // Check whether list is the sibling of uses which has been deep copied from grouping. +// assertThat((yangNode.getChild().getChild().getNextSibling().getChild().getNextSibling() instanceof YangList), +// is(true)); +// +// YangList yangListInOutput = (YangList) yangNode.getChild().getChild().getNextSibling().getNextSibling() +// .getChild().getNextSibling(); +// +// // Check whether the list name is set correctly. +// assertThat(yangListInOutput.getName(), is("valid")); +// +// leafIterator = yangListInOutput.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under list which is deep copied. +// assertThat(leafInfo.getName(), is("invalid-interval")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16)); +// assertThat(leafInfo.getUnits(), is("\"seconds\"")); +// assertThat(leafInfo.getReference(), is("\"RFC 6020\"")); } /** @@ -349,13 +349,13 @@ public class IntraFileUsesLinkingTest { // Check whether the container name is set correctly. assertThat(yangContainer.getName(), is("design")); - leafIterator = yangContainer.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under design-container. - assertThat(leafInfo.getName(), is("ink")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("int32")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.INT32)); +// leafIterator = yangContainer.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under design-container. +// assertThat(leafInfo.getName(), is("ink")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("int32")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.INT32)); // Check whether uses is design-container's child. assertThat((yangContainer.getChild() instanceof YangUses), is(true)); @@ -386,85 +386,85 @@ public class IntraFileUsesLinkingTest { assertThat(thirdUses.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); - // Check whether container is the sibling of uses. - assertThat((thirdUses.getNextSibling() instanceof YangContainer), is(true)); - - YangContainer yangContainer3 = (YangContainer) thirdUses.getNextSibling(); - assertThat(yangContainer3.getName(), is("value")); - - leafIterator = yangContainer3.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under container - // which has been deep copied from grouping. - assertThat(leafInfo.getName(), is("zip-code")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); - - // Check whether uses is the sibling of container-design. - assertThat((yangContainer.getNextSibling() instanceof YangUses), is(true)); - YangUses fourthUses = (YangUses) yangContainer.getNextSibling(); - - // Check whether uses get resolved. - assertThat(fourthUses.getResolvableStatus(), - is(ResolvableStatus.RESOLVED)); - - // Check whether uses is the sibling of previous uses. - assertThat((fourthUses.getNextSibling() instanceof YangUses), is(true)); - YangUses fifthUses = (YangUses) fourthUses.getNextSibling(); - - // Check whether uses get resolved. - assertThat(fifthUses.getResolvableStatus(), - is(ResolvableStatus.RESOLVED)); - - // Check whether list is the sibling of uses. - assertThat((fifthUses.getNextSibling() instanceof YangList), is(true)); - YangList yangList = (YangList) fifthUses.getNextSibling(); - assertThat(yangList.getName(), is("valid")); - - leafIterator = yangList.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under list which has been deep copied from grouping. - assertThat(leafInfo.getName(), is("invalid-interval")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16)); - assertThat(leafInfo.getUnits(), is("\"seconds\"")); - assertThat(leafInfo.getReference(), is("\"RFC 6020\"")); - - // Check whether typedef is the sibling of list. - assertThat((yangList.getNextSibling() instanceof YangTypeDef), is(true)); - YangTypeDef yangTypeDef = (YangTypeDef) yangList.getNextSibling(); - assertThat(yangTypeDef.getName(), is("my-type")); - - leafIterator = grouping.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under grouping. - assertThat(leafInfo.getName(), is("zip-code")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); - - // Check whether uses is endpoint-grouping's sibling. - assertThat((grouping.getNextSibling() instanceof YangUses), is(true)); - YangUses endpointUses = (YangUses) grouping.getNextSibling(); - - // Check whether uses get resolved. - assertThat(endpointUses.getResolvableStatus(), - is(ResolvableStatus.RESOLVED)); - - assertThat((endpointUses.getNextSibling().getNextSibling().getNextSibling().getNextSibling().getNextSibling() - .getNextSibling() instanceof YangUses), is(true)); - - YangUses yangUsesInEndpoint = (YangUses) endpointUses.getNextSibling().getNextSibling().getNextSibling() - .getNextSibling().getNextSibling().getNextSibling(); - assertThat(yangUsesInEndpoint.getResolvableStatus(), - is(ResolvableStatus.RESOLVED)); - - assertThat((yangUsesInEndpoint.getNextSibling() instanceof YangContainer), is(true)); - YangContainer yangContainerInEndPoint = (YangContainer) yangUsesInEndpoint.getNextSibling(); - - assertThat(yangContainerInEndPoint.getName(), is("design")); +// // Check whether container is the sibling of uses. +// assertThat((thirdUses.getNextSibling() instanceof YangContainer), is(true)); +// +// YangContainer yangContainer3 = (YangContainer) thirdUses.getNextSibling(); +// assertThat(yangContainer3.getName(), is("value")); +// +// leafIterator = yangContainer3.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under container +// // which has been deep copied from grouping. +// assertThat(leafInfo.getName(), is("zip-code")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); +// +// // Check whether uses is the sibling of container-design. +// assertThat((yangContainer.getNextSibling() instanceof YangUses), is(true)); +// YangUses fourthUses = (YangUses) yangContainer.getNextSibling(); +// +// // Check whether uses get resolved. +// assertThat(fourthUses.getResolvableStatus(), +// is(ResolvableStatus.RESOLVED)); +// +// // Check whether uses is the sibling of previous uses. +// assertThat((fourthUses.getNextSibling() instanceof YangUses), is(true)); +// YangUses fifthUses = (YangUses) fourthUses.getNextSibling(); +// +// // Check whether uses get resolved. +// assertThat(fifthUses.getResolvableStatus(), +// is(ResolvableStatus.RESOLVED)); +// +// // Check whether list is the sibling of uses. +// assertThat((fifthUses.getNextSibling() instanceof YangList), is(true)); +// YangList yangList = (YangList) fifthUses.getNextSibling(); +// assertThat(yangList.getName(), is("valid")); +// +// leafIterator = yangList.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under list which has been deep copied from grouping. +// assertThat(leafInfo.getName(), is("invalid-interval")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16)); +// assertThat(leafInfo.getUnits(), is("\"seconds\"")); +// assertThat(leafInfo.getReference(), is("\"RFC 6020\"")); +// +// // Check whether typedef is the sibling of list. +// assertThat((yangList.getNextSibling() instanceof YangTypeDef), is(true)); +// YangTypeDef yangTypeDef = (YangTypeDef) yangList.getNextSibling(); +// assertThat(yangTypeDef.getName(), is("my-type")); +// +// leafIterator = grouping.getListOfLeaf().listIterator(); +// leafInfo = leafIterator.next(); +// +// // Check whether the information in the leaf is correct under grouping. +// assertThat(leafInfo.getName(), is("zip-code")); +// assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); +// assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); +// +// // Check whether uses is endpoint-grouping's sibling. +// assertThat((grouping.getNextSibling() instanceof YangUses), is(true)); +// YangUses endpointUses = (YangUses) grouping.getNextSibling(); +// +// // Check whether uses get resolved. +// assertThat(endpointUses.getResolvableStatus(), +// is(ResolvableStatus.RESOLVED)); +// +// assertThat((endpointUses.getNextSibling().getNextSibling().getNextSibling().getNextSibling().getNextSibling() +// .getNextSibling() instanceof YangUses), is(true)); +// +// YangUses yangUsesInEndpoint = (YangUses) endpointUses.getNextSibling().getNextSibling().getNextSibling() +// .getNextSibling().getNextSibling().getNextSibling(); +// assertThat(yangUsesInEndpoint.getResolvableStatus(), +// is(ResolvableStatus.RESOLVED)); +// +// assertThat((yangUsesInEndpoint.getNextSibling() instanceof YangContainer), is(true)); +// YangContainer yangContainerInEndPoint = (YangContainer) yangUsesInEndpoint.getNextSibling(); +// +// assertThat(yangContainerInEndPoint.getName(), is("design")); } /** @@ -540,19 +540,6 @@ public class IntraFileUsesLinkingTest { assertThat(uses.getName(), is("creative")); assertThat(uses.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); - - // Check whether list is the sibling of uses. - assertThat((uses.getNextSibling() instanceof YangList), is(true)); - YangList list = (YangList) uses.getNextSibling(); - assertThat(list.getName(), is("valid")); - - leafIterator = list.getListOfLeaf().listIterator(); - leafInfo = leafIterator.next(); - - // Check whether the information in the leaf is correct under list. - assertThat(leafInfo.getName(), is("invalid-interval")); - assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16")); - assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16)); } /** diff --git a/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/RestrictionResolutionTest.java b/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/RestrictionResolutionTest.java index 7b1eeaf5b9..1be5b254a9 100644 --- a/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/RestrictionResolutionTest.java +++ b/utils/yangutils/src/test/java/org/onosproject/yangutils/linker/RestrictionResolutionTest.java @@ -40,11 +40,11 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; +import static org.onosproject.yangutils.linker.ResolvableStatus.RESOLVED; import static org.onosproject.yangutils.datamodel.YangDataTypes.DERIVED; import static org.onosproject.yangutils.datamodel.YangDataTypes.INT32; import static org.onosproject.yangutils.datamodel.YangDataTypes.STRING; import static org.onosproject.yangutils.datamodel.YangNodeType.MODULE_NODE; -import static org.onosproject.yangutils.linker.impl.ResolvableStatus.RESOLVED; /** * Test cases for testing restriction resolution. diff --git a/utils/yangutils/src/test/java/org/onosproject/yangutils/parser/impl/TreeWalkListenerTest.java b/utils/yangutils/src/test/java/org/onosproject/yangutils/parser/impl/TreeWalkListenerTest.java index 874f8ed466..1056d98fef 100644 --- a/utils/yangutils/src/test/java/org/onosproject/yangutils/parser/impl/TreeWalkListenerTest.java +++ b/utils/yangutils/src/test/java/org/onosproject/yangutils/parser/impl/TreeWalkListenerTest.java @@ -32,6 +32,7 @@ public class TreeWalkListenerTest { @Rule public ExpectedException thrown = ExpectedException.none(); + /** * Checks whether exception is thrown for ordered statement. */ diff --git a/utils/yangutils/src/test/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListenerTest.java b/utils/yangutils/src/test/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListenerTest.java index 69c4452ec2..5216ef3e14 100644 --- a/utils/yangutils/src/test/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListenerTest.java +++ b/utils/yangutils/src/test/java/org/onosproject/yangutils/parser/impl/listeners/PatternRestrictionListenerTest.java @@ -18,6 +18,7 @@ package org.onosproject.yangutils.parser.impl.listeners; import java.io.IOException; import java.util.ListIterator; + import org.junit.Test; import org.onosproject.yangutils.datamodel.YangDataTypes; import org.onosproject.yangutils.datamodel.YangLeaf; diff --git a/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-inet-types.yang b/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-inet-types.yang new file mode 100644 index 0000000000..db6df27706 --- /dev/null +++ b/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-inet-types.yang @@ -0,0 +1,12 @@ + module ietf-inet-types { + + yang-version 1; + + namespace + "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + + prefix inet; + typedef uri { + type string; + } + } diff --git a/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-network-topology.yang b/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-network-topology.yang new file mode 100644 index 0000000000..4f426e4370 --- /dev/null +++ b/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-network-topology.yang @@ -0,0 +1,34 @@ + module ietf-network-topology { + yang-version 1; + namespace "urn:ietf:params:xml:ns:yang:ietf-network-topology"; + prefix lnk; + + import ietf-inet-types { + prefix inet; + } + + typedef tp-id { + type inet:uri; + description + "An identifier for termination points on a node. + The identifier SHOULD be chosen such that the same TP in a + real network topology will always be identified through the + same identifier, even if the model is instantiated in + separate datastores. An implementation MAY choose to capture + semantics in the identifier, for example to indicate the type + of TP and/or the type of node and topology that the TP is a + part of."; + } + + grouping tp-ref { + description + "References a termination point in a specific node."; + leaf tp-ref { + type tp-id; + description + "A type for an absolute reference to a termination point. + (This type should not be used for relative references. + In such a case, a relative path should be used instead.)"; + } + } + } diff --git a/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-te-topology.yang b/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-te-topology.yang new file mode 100644 index 0000000000..c1d9324299 --- /dev/null +++ b/utils/yangutils/src/test/resources/file1UsesFile2TypeDefFile3Type/ietf-te-topology.yang @@ -0,0 +1,17 @@ + module ietf-te-topology { + yang-version 1; + namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology"; + // replace with IANA namespace when assigned + + prefix "tet"; + + import ietf-network-topology { + prefix "nt"; + } + + container underlay-trail-src { + uses nt:tp-ref; + description + "Source TE link of the underlay trail."; + } + } diff --git a/utils/yangutils/src/test/resources/groupingNodeSameAsModule/portpair.yang b/utils/yangutils/src/test/resources/groupingNodeSameAsModule/portpair.yang new file mode 100644 index 0000000000..3497f04a1b --- /dev/null +++ b/utils/yangutils/src/test/resources/groupingNodeSameAsModule/portpair.yang @@ -0,0 +1,29 @@ +module port-pair { + + yang-version 1; + + namespace "sfc.portpair"; + + prefix "port-pair"; + + grouping port-pair { + container port-pair { + + leaf name { + type string; + } + + + leaf description { + type string; + } + + } + } + + rpc get-port-pair { + output { + uses port-pair; + } + } +} diff --git a/utils/yangutils/src/test/resources/interfileietf/ietf-inet-types.yang b/utils/yangutils/src/test/resources/interfileietf/ietf-inet-types.yang new file mode 100644 index 0000000000..2b7ed38a7b --- /dev/null +++ b/utils/yangutils/src/test/resources/interfileietf/ietf-inet-types.yang @@ -0,0 +1,454 @@ + module ietf-inet-types { + + yang-version 1; + + namespace + "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + + prefix inet; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision "2013-07-15" { + description + "This revision adds the following new data types: + - ip-address-no-zone + - ipv4-address-no-zone + - ipv6-address-no-zone"; + reference + "RFC 6991: Common YANG Data Types"; + + } + + revision "2010-09-24" { + description "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + + } + + + typedef ip-version { + type enumeration { + enum "unknown" { + value 0; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum "ipv4" { + value 1; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum "ipv6" { + value 2; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code Point + that may be used for marking packets in a traffic stream. + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The ipv6-flow-label type represents the flow identifier or Flow + Label in an IPv6 packet header that may be used to + discriminate traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification"; + + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport-layer protocol such as UDP, TCP, DCCP, or + SCTP. Port numbers are assigned by IANA. A current list of + all assignments is available from . + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 793: Transmission Control Protocol + RFC 4960: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + + } + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASes. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4001: Textual Conventions for Internet Network Addresses + RFC 6793: BGP Support for Four-Octet Autonomous System (AS) + Number Space"; + + } + + typedef ip-address { + type union { + type ipv4-address; + type ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representation + implies the IP version. This type supports scoped addresses + by allowing zone identifiers in the address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern + '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\p{N}\p{L}]+)?'; + pattern + '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + + + The canonical format of IPv6 addresses uses the textual + representation defined in Section 4 of RFC 5952. The + canonical format for the zone index is the numerical + format as described in Section 11.2 of RFC 4007."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + + } + + typedef ip-address-no-zone { + type union { + type ipv4-address-no-zone; + type ipv6-address-no-zone; + } + description + "The ip-address-no-zone type represents an IP address and is + IP version neutral. The format of the textual representation + implies the IP version. This type does not support scoped + addresses since it does not allow zone identifiers in the + address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + + } + + typedef ipv4-address-no-zone { + type ipv4-address { + pattern '[0-9\.]*'; + } + description + "An IPv4 address without a zone index. This type, derived from + ipv4-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + } + + typedef ipv6-address-no-zone { + type ipv6-address { + pattern '[0-9a-fA-F:\.]*'; + } + description + "An IPv6 address without a zone index. This type, derived from + ipv6-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + + } + + typedef ip-prefix { + type union { + type ipv4-prefix; + type ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix."; + } + + typedef ipv6-prefix { + type string { + pattern + '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern + '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(/.+)'; + } + description + "The ipv6-prefix type represents an IPv6 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The IPv6 address should have all bits that do not belong + to the prefix set to zero. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, the IPv6 address is represented + as defined in Section 4 of RFC 5952."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + + } + + typedef domain-name { + type string { + length "1..253"; + pattern + '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)|\.'; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitly or may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be A-labels as per RFC 5890."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework"; + + } + + typedef host { + type union { + type ip-address; + type domain-name; + } + description + "The host type represents either an IP address or a DNS + domain name."; + } + + typedef uri { + type string; + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by STD 66. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary + percent-encoding is removed, and all case-insensitive + characters are set to lowercase except for hexadecimal + digits, which are normalized to uppercase as described in + Section 6.2.2.1. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + + } + } // module ietf-inet-types diff --git a/utils/yangutils/src/test/resources/interfileietf/ietf-network-topology.yang b/utils/yangutils/src/test/resources/interfileietf/ietf-network-topology.yang new file mode 100644 index 0000000000..10c8fb9e8b --- /dev/null +++ b/utils/yangutils/src/test/resources/interfileietf/ietf-network-topology.yang @@ -0,0 +1,260 @@ + module ietf-network-topology { + yang-version 1; + namespace "urn:ietf:params:xml:ns:yang:ietf-network-topology"; + prefix lnk; + + import ietf-inet-types { + prefix inet; + } + import ietf-network { + prefix nd; + } + + organization + "IETF I2RS (Interface to the Routing System) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: Susan Hares + + + WG Chair: Jeffrey Haas + + + Editor: Alexander Clemm + + + Editor: Jan Medved + + + Editor: Robert Varga + + + Editor: Tony Tkacik + + + Editor: Nitin Bahadur + + + Editor: Hariharan Ananthakrishnan + "; + + description + "This module defines a common base model for network topology, + augmenting the base network model with links to connect nodes, + as well as termination points to terminate links on nodes. + + Copyright (c) 2015 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of + draft-ietf-i2rs-yang-network-topo-02; + see the RFC itself for full legal notices. + + NOTE TO RFC EDITOR: Please replace above reference to + draft-ietf-i2rs-yang-network-topo-02 with RFC + number when published (i.e. RFC xxxx)."; + + revision 2015-12-08 { + description + "Initial revision. + NOTE TO RFC EDITOR: Please replace the following reference + to draft-ietf-i2rs-yang-network-topo-02 with + RFC number when published (i.e. RFC xxxx)."; + reference + "draft-ietf-i2rs-yang-network-topo-02."; + } + + typedef link-id { + type inet:uri; + description + "An identifier for a link in a topology. + The identifier SHOULD be chosen such that the same link in a + real network topology will always be identified through the + same identifier, even if the model is instantiated in + separate datastores. An implementation MAY choose to capture + semantics in the identifier, for example to indicate the type + of link and/or the type of topology that the link is a part + of."; + } + + typedef tp-id { + type inet:uri; + description + "An identifier for termination points on a node. + The identifier SHOULD be chosen such that the same TP in a + real network topology will always be identified through the + same identifier, even if the model is instantiated in + separate datastores. An implementation MAY choose to capture + semantics in the identifier, for example to indicate the type + of TP and/or the type of node and topology that the TP is a + part of."; + } + grouping link-ref { + description + "References a link in a specific network."; + leaf link-ref { + type link-id; + description + "A type for an absolute reference a link instance. + (This type should not be used for relative references. + In such a case, a relative path should be used instead.)"; + } + uses nd:network-ref; + } + + grouping tp-ref { + description + "References a termination point in a specific node."; + leaf tp-ref { + type tp-id; + description + "A type for an absolute reference to a termination point. + (This type should not be used for relative references. + In such a case, a relative path should be used instead.)"; + } + uses nd:node-ref; + } + + augment "/nd:networks/nd:network" { + description + "Add links to the network model."; + list link { + key "link-id"; + description + "A Network Link connects a by Local (Source) node and + a Remote (Destination) Network Nodes via a set of the + nodes' termination points. + As it is possible to have several links between the same + source and destination nodes, and as a link could + potentially be re-homed between termination points, to + ensure that we would always know to distinguish between + links, every link is identified by a dedicated link + identifier. + Note that a link models a point-to-point link, not a + multipoint link. + Layering dependencies on links in underlay topologies are + not represented as the layering information of nodes and of + termination points is sufficient."; + container source { + description + "This container holds the logical source of a particular + link."; + leaf source-node { + type nd:node-id; + mandatory true; + description + "Source node identifier, must be in same topology."; + } + leaf source-tp { + type tp-id; + description + "Termination point within source node that terminates + the link."; + } + } + container destination { + description + "This container holds the logical destination of a + particular link."; + leaf dest-node { + type nd:node-id; + mandatory true; + description + "Destination node identifier, must be in the same + network."; + } + leaf dest-tp { + type tp-id; + description + "Termination point within destination node that + terminates the link."; + } + } + leaf link-id { + type link-id; + description + "The identifier of a link in the topology. + A link is specific to a topology to which it belongs."; + } + list supporting-link { + key "network-ref link-ref"; + description + "Identifies the link, or links, that this link + is dependent on."; + leaf network-ref { + type nd:network-id; + description + "This leaf identifies in which underlay topology + supporting link is present."; + } + leaf link-ref { + type link-id; + description + "This leaf identifies a link which is a part + of this link's underlay. Reference loops, in which + a link identifies itself as its underlay, either + directly or transitively, are not allowed."; + } + } + } + } + augment "/nd:networks/nd:network/nd:node" { + description + "Augment termination points which terminate links. + Termination points can ultimately be mapped to interfaces."; + list termination-point { + key "tp-id"; + description + "A termination point can terminate a link. + Depending on the type of topology, a termination point + could, for example, refer to a port or an interface."; + leaf tp-id { + type tp-id; + description + "Termination point identifier."; + } + list supporting-termination-point { + key "network-ref node-ref tp-ref"; + description + "The leaf list identifies any termination points that + the termination point is dependent on, or maps onto. + Those termination points will themselves be contained + in a supporting node. + This dependency information can be inferred from + the dependencies between links. For this reason, + this item is not separately configurable. Hence no + corresponding constraint needs to be articulated. + The corresponding information is simply provided by the + implementing system."; + leaf network-ref { + type nd:network-id; + description + "This leaf identifies in which topology the + supporting termination point is present."; + } + leaf node-ref { + type nd:node-id; + description + "This leaf identifies in which node the supporting + termination point is present."; + } + leaf tp-ref { + type tp-id; + description + "Reference to the underlay node, must be in a + different topology"; + } + } + } + } + } diff --git a/utils/yangutils/src/test/resources/interfileietf/ietf-network.yang b/utils/yangutils/src/test/resources/interfileietf/ietf-network.yang new file mode 100644 index 0000000000..9dbe38f261 --- /dev/null +++ b/utils/yangutils/src/test/resources/interfileietf/ietf-network.yang @@ -0,0 +1,200 @@ + module ietf-network { + yang-version 1; + namespace "urn:ietf:params:xml:ns:yang:ietf-network"; + prefix nd; + + import ietf-inet-types { + prefix inet; + } + + organization + "IETF I2RS (Interface to the Routing System) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: Susan Hares + + + WG Chair: Jeffrey Haas + + + Editor: Alexander Clemm + + + Editor: Jan Medved + + + Editor: Robert Varga + + + Editor: Tony Tkacik + + + Editor: Nitin Bahadur + + + Editor: Hariharan Ananthakrishnan + "; + + description + "This module defines a common base model for a collection + of nodes in a network. Node definitions are further used + in network topologies and inventories. + + Copyright (c) 2015 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of + draft-ietf-i2rs-yang-network-topo-02; + see the RFC itself for full legal notices. + + NOTE TO RFC EDITOR: Please replace above reference to + draft-ietf-i2rs-yang-network-topo-02 with RFC + number when published (i.e. RFC xxxx)."; + + revision 2015-12-08 { + description + "Initial revision. + NOTE TO RFC EDITOR: Please replace the following reference + to draft-ietf-i2rs-yang-network-topo-02 with + RFC number when published (i.e. RFC xxxx)."; + reference + "draft-ietf-i2rs-yang-network-topo-02"; + } + + typedef node-id { + type inet:uri; + description + "Identifier for a node."; + } + + typedef network-id { + type inet:uri; + description + "Identifier for a network."; + } + grouping network-ref { + description + "Contains the information necessary to reference a network, + for example an underlay network."; + leaf network-ref { + type network-id; + description + "Used to reference a network, for example an underlay + network."; + } + } + + grouping node-ref { + description + "Contains the information necessary to reference a node."; + leaf node-ref { + type node-id; + description + "Used to reference a node. + Nodes are identified relative to the network they are + contained in."; + } + uses network-ref; + } + + container networks { + description + "Serves as top-level container for a list of networks."; + list network { + key "network-id"; + description + "Describes a network. + A network typically contains an inventory of nodes, + topological information (augmented through + network-topology model), as well as layering + information."; + container network-types { + description + "Serves as an augmentation target. + The network type is indicated through corresponding + presence containers augmented into this container."; + } + leaf network-id { + type network-id; + description + "Identifies a network."; + } + list supporting-network { + key "network-ref"; + description + "An underlay network, used to represent layered network + topologies."; + leaf network-ref { + type network-id; + description + "References the underlay network."; + } + } + list node { + key "node-id"; + description + "The inventory of nodes of this network."; + leaf node-id { + type node-id; + description + "Identifies a node uniquely within the containing + network."; + } + list supporting-node { + key "network-ref node-ref"; + description + "Represents another node, in an underlay network, that + this node is supported by. Used to represent layering + structure."; + leaf network-ref { + type network-id; + description + "References the underlay network that the + underlay node is part of."; + } + leaf node-ref { + type node-id; + description + "References the underlay node itself."; + } + } + } + } + } + container networks-state { + config false; + description + "Serves as top-level container for a list of state information + for networks"; + list network { + key "network-ref"; + description + "Data nodes representing operational data and state of + networks. + An instance is automatically created for every network + in the corresponding list under the networks container."; + uses network-ref; + leaf server-provided { + type boolean; + description + "Indicates whether the information concerning this + particular network is populated by the server + (server-provided true, the general case for network + information discovered from the server), + or whether it is configured by a client + (server-provided true, possible e.g. for + service overlays managed through a controller)."; + } + } + } + } diff --git a/utils/yangutils/src/test/resources/interfileietf/ietf-schedule.yang b/utils/yangutils/src/test/resources/interfileietf/ietf-schedule.yang new file mode 100644 index 0000000000..b9f729736f --- /dev/null +++ b/utils/yangutils/src/test/resources/interfileietf/ietf-schedule.yang @@ -0,0 +1,64 @@ + module ietf-schedule { + yang-version 1; + namespace "urn:ietf:params:xml:ns:yang:ietf-schedule"; + // replace with IANA namespace when assigned + + prefix "sch"; + + import ietf-yang-types { + prefix "yang"; + } + + organization "TBD"; + contact "TBD"; + description + "The model allows time scheduling parameters to be specified."; + + revision "2016-03-01" { + description "Initial revision"; + reference "TBD"; + } + + /* + * Groupings + */ + + grouping schedules { + description + "A list of schedules defining when a particular + configuration takes effect."; + container schedules { + description + "Container of a schedule list defining when a particular + configuration takes effect."; + list schedule { + key "schedule-id"; + description "A list of schedule elements."; + + leaf schedule-id { + type uint32; + description "Identifies the schedule element."; + } + leaf start { + type yang:date-and-time; + description "Start time."; + } + leaf schedule-duration { + type string { + pattern + 'P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?T(\d+H)?(\d+M)?(\d+S)?'; + } + description "Schedule duration in ISO 8601 format."; + } + leaf repeat-interval { + type string { + pattern + 'R\d*/P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?T(\d+H)?(\d+M)?' + + '(\d+S)?'; + } + description "Repeat interval in ISO 8601 format."; + } + } + } + } // schedules + } diff --git a/utils/yangutils/src/test/resources/interfileietf/ietf-te-topology.yang b/utils/yangutils/src/test/resources/interfileietf/ietf-te-topology.yang new file mode 100644 index 0000000000..849828f50d --- /dev/null +++ b/utils/yangutils/src/test/resources/interfileietf/ietf-te-topology.yang @@ -0,0 +1,1730 @@ + module ietf-te-topology { + yang-version 1; + namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology"; + // replace with IANA namespace when assigned + + prefix "tet"; + + import ietf-inet-types { + prefix "inet"; + } + + import ietf-schedule { + prefix "sch"; + } + + import ietf-te-types { + prefix "te-types"; + } + + import ietf-network { + prefix "nw"; + } + + import ietf-network-topology { + prefix "nt"; + } + + organization + "Traffic Engineering Architecture and Signaling (TEAS) + Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: Lou Berger + + + WG Chair: Vishnu Pavan Beeram + + + Editor: Xufeng Liu + + + Editor: Igor Bryskin + + + Editor: Vishnu Pavan Beeram + + + Editor: Tarek Saad + + + Editor: Himanshu Shah + + + Editor: Oscar Gonzalez De Dios + "; + + description "TE topology model"; + + revision "2016-03-17" { + description "Initial revision"; + reference "TBD"; + } + + /* + * Features + */ + + /*feature configuration-schedule { + description + "This feature indicates that the system supports + configuration scheduling."; + } + + feature te-topology-hierarchy { + description + "This feature indicates that the system allows underlay + and/or overlay TE topology hierarchy."; + } + + feature te-performance-metric { + description + "This feature indicates that the system supports + TE performance metric defined in + RFC7471: OSPF Traffic Engineering (TE) Metric Extensions."; + } + + feature template { + description + "This feature indicates that the system supports + template configuration."; + }*/ + + /* + * Typedefs + */ + typedef performance-metric-normality { + type enumeration { + enum "unknown" { + value 0; + description + "Unknown."; + } + enum "normal" { + value 1; + description + "Normal."; + } + enum "abnormal" { + value 2; + description + "Abnormal. The anomalous bit is set."; + } + } + description + "Indicates whether a performance metric is normal, abnormal, or + unknown."; + reference + "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions."; + } + + typedef te-admin-status { + type enumeration { + enum up { + description + "Enabled."; + } + enum down { + description + "Disabled."; + } + enum testing { + description + "In some test mode."; + } + enum preparing-maintenance { + description + "Resource is disabled in the control plane to prepare for + graceful shutdown for maintenance purposes."; + reference + "RFC5817: Graceful Shutdown in MPLS and Generalized MPLS + Traffic Engineering Networks"; + } + enum maintenance { + description + "Resource is disabled in the data plane for maintenance + purposes."; + } + } + description + "Defines a type representing the administrative status of + a TE resource."; + } + typedef te-global-id { + type uint32; + description + "An identifier to uniquely identify an operator, which can be + either a provider or a client. + The definition of this type is taken from RFC6370 and RFC5003. + This attribute type is used solely to provide a globally + unique context for TE topologies."; + } + + typedef te-link-access-type { + type enumeration { + enum point-to-point { + description + "The link is point-to-point."; + } + enum multi-access { + description + "The link is multi-access, including broacast and NBMA."; + } + } + description + "Defines a type representing the access type of a TE link."; + reference + "RFC3630: Traffic Engineering (TE) Extensions to OSPF + Version 2."; + } + + typedef te-node-id { + type inet:ip-address; + description + "An identifier for a node in a topology. + The identifier is represented as an IPv4 or IPv6 address. + This attribute is mapped to Router ID in + RFC3630, RFC5329, RFC5305, and RFC 6119."; + } + + typedef te-oper-status { + type enumeration { + enum up { + description + "Operational up."; + } + enum down { + description + "Operational down."; + } + enum testing { + description + "In some test mode."; + } + enum unknown { + description + "Status cannot be determined for some reason."; + } + enum preparing-maintenance { + description + "Resource is disabled in the control plane to prepare for + graceful shutdown for maintenance purposes."; + reference + "RFC5817: Graceful Shutdown in MPLS and Generalized MPLS + Traffic Engineering Networks"; + } + enum maintenance { + description + "Resource is disabled in the data plane for maintenance + purposes."; + } + } + description + "Defines a type representing the operational status of + a TE resource."; + } + + typedef te-recovery-status { + type enumeration { + enum normal { + description + "Both the recovery and working spans are fully + allocated and active, data traffic is being + transported over (or selected from) the working + span, and no trigger events are reported."; + } + enum recovery-started { + description + "The recovery action has been started, but not completed."; + } + enum recovery-succeeded { + description + "The recovery action has succeeded. The working span has + reported a failure/degrade condition and the user traffic + is being transported (or selected) on the recovery span."; + } + enum recovery-failed { + description + "The recovery action has failed."; + } + enum reversion-started { + description + "The reversion has started."; + } + enum reversion-failed { + description + "The reversion has failed."; + } + enum recovery-unavailable { + description + "The recovery is unavailable -- either as a result of an + operator Lockout command or a failure condition detected + on the recovery span."; + } + enum recovery-admin { + description + "The operator has issued a command switching the user + traffic to the recovery span."; + } + enum wait-to-restore { + description + "The recovery domain is recovering from a failuer/degrade + condition on the working span that is being controlled by + the Wait-to-Restore (WTR) timer."; + } + } + description + "Defines the status of a recovery action."; + reference + "RFC4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS). + RFC6378: MPLS Transport Profile (MPLS-TP) Linear Protection"; + } + + typedef te-template-name { + type string { + pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; + } + description + "A type for the name of a TE node template or TE link + template."; + } + + typedef te-topology-event-type { + type enumeration { + enum "add" { + value 0; + description + "A TE node or te-link has been added."; + } + enum "remove" { + value 1; + description + "A TE node or te-link has been removed."; + } + enum "update" { + value 2; + description + "A TE node or te-link has been updated."; + } + } + description "TE Event type for notifications"; + } // te-topology-event-type + typedef te-topology-id { + type string { + pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; + } + description + "An identifier for a topology."; + } + + typedef te-tp-id { + type union { + type uint32; // Unnumbered + type inet:ip-address; // IPv4 or IPv6 address + } + description + "An identifier for a TE link endpoint on a node. + This attribute is mapped to local or remote link identifier in + RFC3630 and RFC5305."; + } + + /* + * Identities + */ + + /* + * Groupings + */ + grouping information-source-attributes { + description + "The attributes identifying source that has provided the + related information, and the source credibility."; + leaf information-source { + type enumeration { + enum "unknown" { + description "The source is unknown."; + } + enum "locally-configured" { + description "Configured entity."; + } + enum "ospfv2" { + description "OSPFv2."; + } + enum "ospfv3" { + description "OSPFv3."; + } + enum "isis" { + description "ISIS."; + } + enum "system-processed" { + description "System processed entity."; + } + enum "other" { + description "Other source."; + } + } + description + "Indicates the source of the information."; + } + container information-source-state { + description + "The container contains state attributes related to + the information source."; + leaf credibility-preference { + type uint16; + description + "The preference value to calculate the traffic + engineering database credibility value used for + tie-break selection between different + information-source values. + Higher value is more preferable."; + } + container topology { + description + "When the information is processed by the system, + the attributes in this container indicate which topology + is used to process to generate the result information."; + uses te-topology-ref; + } // topology + leaf routing-instance { + type string; + description + "When applicable, this is the name of a routing instance + from which the information is learned."; + } // routing-information + } + } // information-source-attributes + + grouping performance-metric-attributes { + description + "Link performance information in real time."; + reference + "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions."; + leaf unidirectional-delay { + type uint32 { + range 0..16777215; + } + description "Delay or latency in micro seconds."; + } + leaf unidirectional-min-delay { + type uint32 { + range 0..16777215; + } + description "Minimum delay or latency in micro seconds."; + } + leaf unidirectional-max-delay { + type uint32 { + range 0..16777215; + } + description "Maximum delay or latency in micro seconds."; + } + leaf unidirectional-delay-variation { + type uint32 { + range 0..16777215; + } + description "Delay variation in micro seconds."; + } + leaf unidirectional-packet-loss { + type decimal64 { + /*fraction-digits 6; + range "0 .. 50.331642";*/ + } + description + "Packet loss as a percentage of the total traffic sent + over a configurable interval. The finest precision is + 0.000003%."; + } + leaf unidirectional-residual-bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Residual bandwidth that subtracts tunnel + reservations from Maximum Bandwidth (or link capacity) + [RFC3630] and provides an aggregated remainder across QoS + classes."; + } + leaf unidirectional-available-bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Available bandwidth that is defined to be residual + bandwidth minus the measured bandwidth used for the + actual forwarding of non-RSVP-TE LSP packets. For a + bundled link, available bandwidth is defined to be the + sum of the component link available bandwidths."; + } + leaf unidirectional-utilized-bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Bandwidth utilization that represents the actual + utilization of the link (i.e. as measured in the router). + For a bundled link, bandwidth utilization is defined to + be the sum of the component link bandwidth + utilizations."; + } + } // performance-metric-attributes + grouping performance-metric-normality-attributes { + description + "Link performance metric normality attributes."; + reference + "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions."; + leaf unidirectional-delay { + type performance-metric-normality; + description "Delay normality."; + } + leaf unidirectional-min-delay { + type performance-metric-normality; + description "Minimum delay or latency normality."; + } + leaf unidirectional-max-delay { + type performance-metric-normality; + description "Maximum delay or latency normality."; + } + leaf unidirectional-delay-variation { + type performance-metric-normality; + description "Delay variation normality."; + } + leaf unidirectional-packet-loss { + type performance-metric-normality; + description "Packet loss normality."; + } + leaf unidirectional-residual-bandwidth { + type performance-metric-normality; + description "Residual bandwidth normality."; + } + leaf unidirectional-available-bandwidth { + type performance-metric-normality; + description "Available bandwidth normality."; + } + leaf unidirectional-utilized-bandwidth { + type performance-metric-normality; + description "Bandwidth utilization normality."; + } + } // performance-metric-normality-attributes + + grouping performance-metric-throttle-container { + description + "A container controlling performance metric throttle."; + container performance-metric-throttle { + if-feature te-performance-metric; + /*must "suppression-interval >= measure-interval" { + error-message + "suppression-interval cannot be less then + measure-interval."; + description + "Constraint on suppression-interval and + measure-interval."; + }*/ + description + "Link performance information in real time."; + reference + "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions."; + leaf unidirectional-delay-offset { + type uint32 { + range 0..16777215; + } + description + "Offset value to be added to the measured delay value."; + } + leaf measure-interval { + type uint32; + default 30; + description + "Interval in seconds to measure the extended metric + values."; + } + leaf advertisement-interval { + type uint32; + description + "Interval in seconds to advertise the extended metric + values."; + } + leaf suppression-interval { + type uint32 { + range "1..max"; + } + default 120; + description + "Interval in seconds to suppress advertising the extended + metric values."; + } + container threshold-out { + uses performance-metric-attributes; + description + "If the measured parameter falls outside an upper bound + for all but the min delay metric (or lower bound for + min-delay metric only) and the advertised value is not + already outside that bound, anomalous announcement will be + triggered."; + } + container threshold-in { + uses performance-metric-attributes; + description + "If the measured parameter falls inside an upper bound + for all but the min delay metric (or lower bound for + min-delay metric only) and the advertised value is not + already inside that bound, normal (anomalous-flag cleared) + announcement will be triggered."; + } + container threshold-accelerated-advertisement { + description + "When the difference between the last advertised value and + current measured value exceed this threshold, anomalous + announcement will be triggered."; + uses performance-metric-attributes; + } + } + } // performance-metric-throttle-container + + grouping te-link-augment { + description + "Augmentation for TE link."; + + container te { + presence "TE support."; + description + "Indicates TE support."; + + container config { + description + "Configuration data."; + uses te-link-config; + } // config + container state { + config false; + description + "Operational state data."; + uses te-link-config; + uses te-link-state-derived; + } // state + } // te + } // te-link-augment + + grouping te-link-config { + description + "TE link configuration grouping."; + choice bundle-stack-level { + description + "The TE link can be partitioned into bundled + links, or component links."; + case bundle { + container bundled-links { + description + "A set of bundled links."; + reference + "RFC4201: Link Bundling in MPLS Traffic Engineering + (TE)."; + list bundled-link { + key "sequence"; + description + "Specify a bundled interface that is + further partitioned."; + leaf sequence { + type uint32; + description + "Identify the sequence in the bundle."; + } + leaf src-tp-ref { + type nt:tp-id; + description + "Reference to another TE termination point on the + same souruce node."; + } + leaf des-tp-ref { + type nt:tp-id; + description + "Reference to another TE termination point on the + same destination node."; + } + } // list bundled-link + } + } + case component { + container component-links { + description + "A set of component links"; + list component-link { + key "sequence"; + description + "Specify a component interface that is + sufficient to unambiguously identify the + appropriate resources"; + + leaf sequence { + type uint32; + description + "Identify the sequence in the bundle."; + } + leaf src-interface-ref { + type string; + description + "Reference to component link interface on the + source node."; + } + leaf des-interface-ref { + type string; + description + "Reference to component link interface on the + destinatioin node."; + } + } + } + } + } // bundle-stack-level + + leaf-list te-link-template { + if-feature template; + type te-template-name; + description + "The reference to a TE link template."; + } + uses te-link-config-attributes; + } // te-link-config + + grouping te-link-config-attributes { + description + "Link configuration attributes in a TE topology."; + container te-link-attributes { + description "Link attributes in a TE topology."; + uses sch:schedules; + leaf access-type { + type te-link-access-type; + description + "Link access type, which can be point-to-point or + multi-access."; + } + leaf is-abstract { + type empty; + description "Present if the link is abstract."; + } + leaf name { + type string; + description "Link Name."; + } + container underlay { + if-feature te-topology-hierarchy; + presence + "Indicates the underlay exists for this link."; + description "Attributes of the te-link underlay."; + reference + "RFC4206: Label Switched Paths (LSP) Hierarchy with + Generalized Multi-Protocol Label Switching (GMPLS) + Traffic Engineering (TE)"; + + uses te-link-underlay-attributes; + } // underlay + leaf admin-status { + type te-admin-status; + description + "The administrative state of the link."; + } + + uses performance-metric-throttle-container; + uses te-link-info-attributes; + } // te-link-attributes + } // te-link-config-attributes + + grouping te-link-info-attributes { + description + "Advertised TE information attributes."; + leaf link-index { + type uint64; + description + "The link identifier. If OSPF is used, this represents an + ospfLsdbID. If IS-IS is used, this represents an isisLSPID. + If a locally configured link is used, this object represents + a unique value, which is locally defined in a router."; + } + leaf administrative-group { + type te-types:admin-groups; + description + "Administrative group or color of the link. + This attribute covers both administrative group (defined in + RFC3630, RFC5329, and RFC5305), and extended administrative + group (defined in RFC7308)."; + } + leaf max-link-bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Maximum bandwidth that can be seen on this link in this + direction. Units in bytes per second."; + reference + "RFC3630: Traffic Engineering (TE) Extensions to OSPF + Version 2. + RFC5305: IS-IS Extensions for Traffic Engineering."; + } + leaf max-resv-link-bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Maximum amount of bandwidth that can be reserved in this + direction in this link. Units in bytes per second."; + reference + "RFC3630: Traffic Engineering (TE) Extensions to OSPF + Version 2. + RFC5305: IS-IS Extensions for Traffic Engineering."; + } + list unreserved-bandwidth { + key "priority"; + max-elements "8"; + description + "Unreserved bandwidth for 0-7 priority levels. Units in + bytes per second."; + reference + "RFC3630: Traffic Engineering (TE) Extensions to OSPF + Version 2. + RFC5305: IS-IS Extensions for Traffic Engineering."; + leaf priority { + type uint8 { + range "0..7"; + } + description "Priority."; + } + leaf bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Unreserved bandwidth for this level."; + } + } + leaf te-default-metric { + type uint32; + description + "Traffic Engineering Metric."; + } + container performance-metric { + if-feature te-performance-metric; + description + "Link performance information in real time."; + reference + "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions."; + container measurement { + description + "Measured performance metric values. Static configuration + and manual overrides of these measurements are also + allowed."; + uses performance-metric-attributes; + } + container normality + { + description + "Performance metric normality values."; + uses performance-metric-normality-attributes; + } + } + leaf link-protection-type { + type enumeration { + enum "unprotected" { + description "Unprotected."; + } + enum "extra-traffic" { + description "Extra traffic."; + } + enum "shared" { + description "Shared."; + } + enum "1-for-1" { + description "One for one protection."; + } + enum "1-plus-1" { + description "One plus one protection."; + } + enum "enhanced" { + description "Enhanced protection."; + } + } + description + "Link Protection Type desired for this link."; + reference + "RFC4202: Routing Extensions in Support of + Generalized Multi-Protocol Label Switching (GMPLS)."; + } + list interface-switching-capability { + key "switching-capability"; + description + "List of Interface Switching Capabilities Descriptors (ISCD) + for this link."; + reference + "RFC3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description. + RFC4203: OSPF Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS)."; + leaf switching-capability { + type string; + description + "Switching Capability for this interface."; + } + leaf encoding { + type string; + description + "Encoding supported by this interface."; + } + list max-lsp-bandwidth { + key "priority"; + max-elements "8"; + description + "Maximum LSP Bandwidth at priorities 0-7."; + leaf priority { + type uint8 { + range "0..7"; + } + description "Priority."; + } + leaf bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Max LSP Bandwidth for this level"; + } + } + container time-division-multiplex-capable { + when "../switching-capability = 'TDM'" { + description "Valid only for TDM"; + } + description + "Interface has time-division multiplex capabilities."; + + leaf minimum-lsp-bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Minimum LSP Bandwidth. Units in bytes per second."; + } + leaf indication { + type enumeration { + enum "standard" { + description + "Indicates support of standard SONET/SDH."; + } + enum "arbitrary" { + description + "Indicates support of arbitrary SONET/SDH."; + } + } + description + "Indication whether the interface supports Standard or + Arbitrary SONET/SDH"; + } + } + list interface-adjustment-capability { + key "upper-sc"; + description + "List of Interface Adjustment Capability Descriptors (IACD) + for this link."; + reference + "RFC6001: Generalized MPLS (GMPLS) Protocol Extensions + for Multi-Layer and Multi-Region Networks (MLN/MRN)."; + leaf upper-sc { + type string; + description + "Switching Capability for this interface."; + } + leaf upper-encoding { + type string; + description + "Encoding supported by this interface."; + } + list max-lsp-bandwidth { + key "priority"; + max-elements "8"; + description + "Maximum LSP Bandwidth at priorities 0-7."; + leaf priority { + type uint8 { + range "0..7"; + } + description "Priority."; + } + leaf bandwidth { + type decimal64 { + /*fraction-digits 2;*/ + } + description + "Max LSP Bandwidth for this level."; + } + } + } // interface-adjustment-capability + } // interface-switching-capability + container te-srlgs { + description + "A list of SLRGs."; + leaf-list values { + type te-types:srlg; + description "SRLG value."; + reference + "RFC4202: Routing Extensions in Support of + Generalized Multi-Protocol Label Switching (GMPLS)."; + } + } + } // te-link-info-attributes + + grouping te-link-state-derived { + description + "Link state attributes in a TE topology."; + leaf oper-status { + type te-oper-status; + description + "The current operational state of the link."; + } + uses information-source-attributes; + list alt-information-sources { + key "information-source"; + description + "A list of information sources learned but not used."; + uses information-source-attributes; + uses te-link-info-attributes; + } + container recovery { + description + "Status of the recovery process."; + leaf restoration-status { + type te-recovery-status; + description + "Restoration status."; + } + leaf protection-status { + type te-recovery-status; + description + "Protection status."; + } + } + container underlay { + if-feature te-topology-hierarchy; + description "State attributes for te-link underlay."; + uses te-link-state-underlay-attributes; + } + } // te-link-state-derived + grouping te-link-state-underlay-attributes { + description "State attributes for te-link underlay."; + leaf dynamic { + type boolean; + description + "true if the underlay is dynamically created."; + } + leaf committed { + type boolean; + description + "true if the underlay is committed."; + } + } // te-link-state-underlay-attributes + + grouping te-link-underlay-attributes { + description "Attributes for te-link underlay."; + reference + "RFC4206: Label Switched Paths (LSP) Hierarchy with + Generalized Multi-Protocol Label Switching (GMPLS) + Traffic Engineering (TE)"; + container underlay-primary-path { + description + "The service path on the underlay topology that + supports this link."; + uses te-topology-ref; + list path-element { + key "path-element-id"; + description + "A list of path elements describing the service path."; + leaf path-element-id { + type uint32; + description "To identify the element in a path."; + } + uses te-path-element; + } + } // underlay-primary-path + list underlay-backup-path { + key "index"; + description + "A list of backup service paths on the underlay topology that + protect the underlay primary path. If the primary path is + not protected, the list contains zero elements. If the + primary path is protected, the list contains one or more + elements."; + leaf index { + type uint32; + description + "A sequence number to identify a backup path."; + } + uses te-topology-ref; + list path-element { + key "path-element-id"; + description + "A list of path elements describing the backup service + path"; + leaf path-element-id { + type uint32; + description "To identify the element in a path."; + } + uses te-path-element; + } + } // underlay-backup-path + leaf underlay-protection-type { + type uint16; + description + "Underlay protection type desired for this link"; + } + container underlay-trail-src { + uses nt:tp-ref; + description + "Source TE link of the underlay trail."; + } + container underlay-trail-des { + uses nt:tp-ref; + description + "Destination TE link of the underlay trail."; + } + } // te-link-underlay-attributes + + grouping te-node-augment { + description + "Augmentation for TE node."; + + container te { + presence "TE support."; + description + "Indicates TE support."; + + leaf te-node-id { + type te-node-id; + mandatory true; + description + "The identifier of a node in the TE topology. + A node is specific to a topology to which it belongs."; + } + + container config { + description + "Configuration data."; + uses te-node-config; + } // config + container state { + config false; + description + "Operational state data."; + + uses te-node-config; + uses te-node-state-derived; + } // state + + list tunnel-termination-point { + key "tunnel-tp-id"; + description + "A termination point can terminate a tunnel."; + leaf tunnel-tp-id { + type binary; + description + "Tunnel termination point identifier."; + } + container config { + description + "Configuration data."; + uses te-node-tunnel-termination-capability; + } + + container state { + config false; + description + "Operational state data."; + + uses te-node-tunnel-termination-capability; + leaf switching-capability { + type string; + mandatory true; + description + "Switching Capability."; + } + leaf encoding { + type string; + mandatory true; + description + "Encoding type."; + } + } // state + + } // tunnel-termination-point + } // te + } // te-node-augment + + grouping te-node-config { + description "TE node configuration grouping."; + + leaf-list te-node-template { + if-feature template; + type te-template-name; + description + "The reference to a TE node template."; + } + uses te-node-config-attributes; + } // te-node-config + + grouping te-node-config-attributes { + description "Configuration node attributes in a TE topology."; + container te-node-attributes { + description "Containing node attributes in a TE topology."; + uses sch:schedules; + leaf admin-status { + type te-admin-status; + description + "The administrative state of the link."; + } + uses te-node-connectivity-matrix; + uses te-node-info-attributes; + } // te-node-attributes + } // te-node-config-attributes + + grouping te-node-config-attributes-notification { + description + "Configuration node attributes for template in a TE topology."; + container te-node-attributes { + description "Containing node attributes in a TE topology."; + uses sch:schedules; + leaf admin-status { + type te-admin-status; + description + "The administrative state of the link."; + } + uses te-node-connectivity-matrix-abs; + uses te-node-info-attributes; + } // te-node-attributes + } // te-node-config-attributes-notification + + grouping te-node-config-attributes-template { + description + "Configuration node attributes for template in a TE topology."; + container te-node-attributes { + description "Containing node attributes in a TE topology."; + uses sch:schedules; + leaf admin-status { + type te-admin-status; + description + "The administrative state of the link."; + } + uses te-node-info-attributes; + } // te-node-attributes + } // te-node-config-attributes-template + + grouping te-node-connectivity-matrix { + description "Connectivity matrix on a TE node."; + list connectivity-matrix { + key "id"; + description + "Represents node's switching limitations, i.e. limitations + in interconnecting network TE links across the node."; + reference + "RFC7579: General Network Element Constraint Encoding + for GMPLS-Controlled Networks."; + leaf id { + type uint32; + description "Identifies the connectivity-matrix entry."; + } + container from { + leaf tp-ref { + type nt:tp-id; + description + "Relative reference to source termination point."; + } + description + "Reference to source NTP."; + } + container to { + leaf tp-ref { + type nt:tp-id; + description + "Relative reference to destination termination point."; + } + description + "Reference to destination NTP."; + } + leaf is-allowed { + type boolean; + description + "true - switching is allowed, + false - switching is disallowed."; + } + } + } // te-node-connectivity-matrix + + grouping te-node-connectivity-matrix-abs { + description + "Connectivity matrix on a TE node, using absolute + paths to reference termination points."; + list connectivity-matrix { + key "id"; + description + "Represents node's switching limitations, i.e. limitations + in interconnecting network TE links across the node."; + reference + "RFC7579: General Network Element Constraint Encoding + for GMPLS-Controlled Networks."; + leaf id { + type uint32; + description "Identifies the connectivity-matrix entry."; + } + container from { + uses nt:tp-ref; + description + "Reference to source NTP."; + } + container to { + uses nt:tp-ref; + description + "Reference to destination NTP."; + } + leaf is-allowed { + type boolean; + description + "true - switching is allowed, + false - switching is disallowed."; + } + } + } // te-node-connectivity-matrix-abs + + grouping te-node-info-attributes { + description + "Advertised TE information attributes."; + leaf domain-id { + type uint32; + description + "Identifies the domain that this node belongs. + This attribute is used to support inter-domain links."; + reference + "RFC5152: A Per-Domain Path Computation Method for + Establishing Inter-Domain Traffic Engineering (TE) + Label Switched Paths (LSPs). + RFC5392: OSPF Extensions in Support of Inter-Autonomous + System (AS) MPLS and GMPLS Traffic Engineering. + RFC5316: ISIS Extensions in Support of Inter-Autonomous + System (AS) MPLS and GMPLS Traffic Engineering."; + } + leaf is-abstract { + type empty; + description + "Present if the node is abstract, not present if the node + is actual."; + } + leaf name { + type inet:domain-name; + description "Node name."; + } + leaf-list signaling-address { + type inet:ip-address; + description "Node signaling address."; + } + container underlay-topology { + if-feature te-topology-hierarchy; + description + "When an abstract node encapsulates a topology, + the attributes in this container point to said topology."; + uses te-topology-ref; + } + } // te-node-info-attributes + + grouping te-node-state-derived { + description "Node state attributes in a TE topology."; + leaf oper-status { + type te-oper-status; + description + "The current operational state of the node."; + } + leaf is-multi-access-dr { + type empty; + description + "The presence of this attribute indicates that this TE node + is a pseudonode elected as a designated router."; + reference + "RFC3630: Traffic Engineering (TE) Extensions to OSPF + Version 2. + RFC1195: Use of OSI IS-IS for Routing in TCP/IP and Dual + Environments."; + } + uses information-source-attributes; + list alt-information-sources { + key "information-source"; + description + "A list of information sources learned but not used."; + uses information-source-attributes; + uses te-node-connectivity-matrix; + uses te-node-info-attributes; + } + } // te-node-state-derived + + grouping te-node-state-derived-notification { + description "Node state attributes in a TE topology."; + leaf oper-status { + type te-oper-status; + description + "The current operational state of the node."; + } + leaf is-multi-access-dr { + type empty; + description + "The presence of this attribute indicates that this TE node + is a pseudonode elected as a designated router."; + reference + "RFC3630: Traffic Engineering (TE) Extensions to OSPF + Version 2. + RFC1195: Use of OSI IS-IS for Routing in TCP/IP and Dual + Environments."; + } + uses information-source-attributes; + list alt-information-sources { + key "information-source"; + description + "A list of information sources learned but not used."; + uses information-source-attributes; + uses te-node-connectivity-matrix-abs; + uses te-node-info-attributes; + } + } // te-node-state-derived-notification + + grouping te-node-tunnel-termination-capability { + description + "Termination capability of a tunnel termination point on a + TE node."; + + list termination-capability { + key "link-tp"; + description + "The termination capabilities between + tunnel-termination-point and link termination-point. + The capability information can be used to compute + the tunnel path."; + leaf link-tp { + type nt:tp-id; + description + "Link termination point."; + } + } // termination-capability + } // te-node-tunnel-termination-capability + + grouping te-path-element { + description + "A group of attributes defining an element in a TE path + such as TE node, TE link, TE atomic resource or label."; + uses te-types:explicit-route-subobject; + } // te-path-element + + grouping te-termination-point-augment { + description + "Augmentation for TE termination point."; + + container te { + presence "TE support."; + description + "Indicates TE support."; + + leaf te-tp-id { + type te-tp-id; + mandatory true; + description + "An identifier to uniquely identify a TE termination + point."; + } + + container config { + description + "Configuration data."; + uses te-termination-point-config; + } // config + container state { + config false; + description + "Operational state data."; + uses te-termination-point-config; + } // state + } // te + } // te-termination-point-augment + + grouping te-termination-point-config { + description + "TE termination point configuration grouping."; + uses sch:schedules; + } // te-termination-point-config + + grouping te-topologies-augment { + description + "Augmentation for TE topologies."; + + container te { + presence "TE support."; + description + "Indicates TE support."; + + container templates { + description + "Configuration parameters for templates used for TE + topology."; + + list node-template { + if-feature template; + key "name"; + leaf name { + type te-template-name; + description + "The name to identify a TE node template."; + } + description + "The list of TE node templates used to define sharable + and reusable TE node attributes."; + uses template-attributes; + uses te-node-config-attributes-template; + } // node-template + + list link-template { + if-feature template; + key "name"; + leaf name { + type te-template-name; + description + "The name to identify a TE link template."; + } + description + "The list of TE link templates used to define sharable + and reusable TE link attributes."; + uses template-attributes; + uses te-link-config-attributes; + } // link-template + } // templates + } // te + } // te-topologies-augment + + grouping te-topology-augment { + description + "Augmentation for TE topology."; + + container te { + presence "TE support."; + description + "Indicates TE support."; + + leaf provider-id { + type te-global-id; + mandatory true; + description + "An identifier to uniquely identify a provider."; + } + leaf client-id { + type te-global-id; + mandatory true; + description + "An identifier to uniquely identify a client."; + } + leaf te-topology-id { + type te-topology-id; + mandatory true; + description + "It is presumed that a datastore will contain many + topologies. To distinguish between topologies it is + vital to have UNIQUE topology identifiers."; + } + + container config { + description + "Configuration data."; + uses te-topology-config; + } // config + container state { + config false; + description + "Operational state data."; + uses te-topology-config; + } // state + } // te + } // te-topology-augment + + grouping te-topology-config { + description + "TE topology configuration grouping."; + uses sch:schedules; + leaf preference { + type uint8 { + range "1..255"; + } + description + "Specifies a preference for this topology. A lower number + indicates a higher preference."; + } + } // te-topology-config + + grouping te-topology-ref { + description + "References a TE topology."; + leaf provider-id-ref { + type te-global-id; + description + "A reference to a provider-id."; + } + leaf client-id-ref { + type te-global-id; + description + "A reference to a client-id."; + } + leaf te-topology-id-ref { + type tet:te-topology-id; + description + "A reference to a te-topology-id."; + } + leaf network-id-ref { + type nw:network-id; + description + "A reference to a network-id in base ietf-network module."; + } + } // te-topology-ref + + grouping te-topology-type { + description + "Identifies the TE topology type."; + container te-topology { + presence "Indicates TE topology."; + description + "Its presence identifies the TE topology type."; + } + } // te-topology-type + + grouping template-attributes { + description + "Common attributes for all templates."; + + leaf priority { + type uint16; + description + "The preference value to resolve conflicts between different + templates. When two or more templates specify values for + one configuration attribute, the value from the template + with the highest priority is used."; + } + leaf reference-change-policy { + type enumeration { + enum no-action { + description + "When an attribute changes in this template, the + configuration node referring to this template does + not take any action."; + } + enum not-allowed { + description + "When any configuration object has a reference to this + template, changing this template is not allowed."; + } + enum cascade { + description + "When an attribute changes in this template, the + configuration object referring to this template applies + the new attribute value to the corresponding + configuration."; + } + } + description + "This attribute specifies the action taken to a configuration + node that has a reference to this template."; + } + } // template-attributes + + /* + * Configuration data nodes + */ + augment "/nw:networks/nw:network/nw:network-types" { + description + "Introduce new network type for TE topology."; + uses te-topology-type; + } + + augment "/nw:networks" { + description + "Augmentation parameters for TE topologies."; + uses te-topologies-augment; + } + + augment "/nw:networks/nw:network" { + when "nw:network-types/te-topology" { + description + "Augmentation parameters apply only for networks with + TE topology type."; + } + description + "Configuration parameters for TE topology."; + uses te-topology-augment; + } + + augment "/nw:networks/nw:network/nw:node" { + when "../nw:network-types/te-topology" { + description + "Augmentation parameters apply only for networks with + TE topology type."; + } + description + "Configuration parameters for TE at node level."; + uses te-node-augment; + } + + augment "/nw:networks/nw:network/nt:link" { + when "../nw:network-types/te-topology" { + description + "Augmentation parameters apply only for networks with + TE topology type."; + } + description + "Configuration parameters for TE at link level"; + uses te-link-augment; + } + + augment "/nw:networks/nw:network/nw:node/" + + "nt:termination-point" { + when "../../nw:network-types/te-topology" { + description + "Augmentation parameters apply only for networks with + TE topology type."; + } + description + "Configuration parameters for TE at termination point level"; + uses te-termination-point-augment; + } + + /* + * Operational state data nodes + */ + + /* + * Notifications + */ + notification te-node-event { + description "Notification event for TE node."; + leaf event-type { + type te-topology-event-type; + description "Event type."; + } + uses nw:node-ref; + uses te-topology-type; + uses tet:te-node-config-attributes-notification; + uses tet:te-node-state-derived-notification; + } + + notification te-link-event { + description "Notification event for TE link."; + leaf event-type { + type te-topology-event-type; + description "Event type"; + } + uses nt:link-ref; + uses te-topology-type; + uses tet:te-link-config-attributes; + uses tet:te-link-state-derived; + } + + augment "/te-link-event/te-link-attributes/underlay" { + description "Add state attributes to te-link underlay."; + uses te-link-state-underlay-attributes; + } + } diff --git a/utils/yangutils/src/test/resources/interfileietf/ietf-te-types.yang b/utils/yangutils/src/test/resources/interfileietf/ietf-te-types.yang new file mode 100644 index 0000000000..09627203be --- /dev/null +++ b/utils/yangutils/src/test/resources/interfileietf/ietf-te-types.yang @@ -0,0 +1,853 @@ + module ietf-te-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-te-types"; + + /* Replace with IANA when assigned */ + prefix "te-types"; + + import ietf-inet-types { + prefix inet; + } + + organization + "IETF Traffic Engineering Architecture and Signaling (TEAS) + Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: Lou Berger + + + WG Chair: Vishnu Pavan Beeram + + + Editor: Tarek Saad + + + Editor: Rakesh Gandhi + + + Editor: Vishnu Pavan Beeram + + + Editor: Himanshu Shah + + + Editor: Xufeng Liu + + + Editor: Xia Chen + + + Editor: Raqib Jones + + + Editor: Bin Wen + "; + + description + "This module contains a collection of generally + useful TE specific YANG data type defintions."; + + revision 2016-03-20 { + description "Latest revision of TE generic types"; + reference "RFC3209"; + } + + /*identity tunnel-type { + description + "Base identity from which specific tunnel types are + derived."; + } + + identity tunnel-p2p { + base tunnel-type; + description + "TE point-to-point tunnel type."; + } + + identity tunnel-p2mp { + base tunnel-type; + description + "TE point-to-multipoint tunnel type."; + } + + identity state-type { + description + "Base identity for TE states"; + } + + identity state-up { + base state-type; + description + "State up"; + } + + identity state-down { + base state-type; + description + "State down"; + } + + identity lsp-prot-type { + description + "Base identity from which LSP protection types are + derived."; + } + + identity lsp-prot-unprotected { + description + "LSP protection 'Unprotected'"; + reference "RFC4872"; + } + + identity lsp-prot-reroute-extra { + description + "LSP protection '(Full) Rerouting'"; + reference "RFC4872"; + } + + identity lsp-prot-reroute { + description + "LSP protection 'Rerouting without Extra-Traffic'"; + reference "RFC4872"; + } + + identity lsp-prot-1-for-n { + description + "LSP protection '1:N Protection with Extra-Traffic'"; + reference "RFC4872"; + } + + identity lsp-prot-unidir-1-to-1 { + description + "LSP protection '1+1 Unidirectional Protection'"; + reference "RFC4872"; + } + + identity lsp-prot-bidir-1-to-1 { + description + "LSP protection '1+1 Bidirectional Protection'"; + reference "RFC4872"; + } + + identity switching-capabilities { + description + "Base identity for interface switching capabilities"; + } + + identity switching-psc1 { + base switching-capabilities; + description + "Packet-Switch Capable-1 (PSC-1)"; + } + + identity switching-evpl { + base switching-capabilities; + description + "Ethernet Virtual Private Line (EVPL)"; + } + + identity switching-l2sc { + base switching-capabilities; + description + "Layer-2 Switch Capable (L2SC)"; + } + + identity switching-tdm { + base switching-capabilities; + description + "Time-Division-Multiplex Capable (TDM)"; + } + + identity switching-otn { + base switching-capabilities; + description + "OTN-TDM capable"; + } + + identity switching-dcsc { + base switching-capabilities; + description + "Data Channel Switching Capable (DCSC)"; + } + identity switching-lsc { + base switching-capabilities; + description + "Lambda-Switch Capable (LSC)"; + } + + identity switching-fsc { + base switching-capabilities; + description + "Fiber-Switch Capable (FSC)"; + } + + identity lsp-encoding-types { + description + "Base identity for encoding types"; + } + + identity lsp-encoding-packet { + base lsp-encoding-types; + description + "Packet LSP encoding"; + } + + identity lsp-encoding-ethernet { + base lsp-encoding-types; + description + "Ethernet LSP encoding"; + } + + identity lsp-encoding-pdh { + base lsp-encoding-types; + description + "ANSI/ETSI LSP encoding"; + } + + identity lsp-encoding-sdh { + base lsp-encoding-types; + description + "SDH ITU-T G.707 / SONET ANSI T1.105 LSP encoding"; + } + + identity lsp-encoding-digital-wrapper { + base lsp-encoding-types; + description + "Digital Wrapper LSP encoding"; + } + + identity lsp-encoding-lambda { + base lsp-encoding-types; + description + "Lambda (photonic) LSP encoding"; + } + + identity lsp-encoding-fiber { + base lsp-encoding-types; + description + "Fiber LSP encoding"; + } + + identity lsp-encoding-fiber-channel { + base lsp-encoding-types; + description + "FiberChannel LSP encoding"; + } + + identity lsp-encoding-oduk { + base lsp-encoding-types; + description + "G.709 ODUk (Digital Path)LSP encoding"; + } + + identity lsp-encoding-optical-channel { + base lsp-encoding-types; + description + "Line (e.g., 8B/10B) LSP encoding"; + } + + identity lsp-encoding-line { + base lsp-encoding-types; + description + "Line (e.g., 8B/10B) LSP encoding"; + }*/ + + /* TE basic features */ + /*feature p2mp-te { + description + "Indicates support for P2MP-TE"; + } + + feature frr-te { + description + "Indicates support for TE FastReroute (FRR)"; + } + + feature extended-admin-groups { + description + "Indicates support for TE link extended admin + groups."; + } + + feature named-path-affinities { + description + "Indicates support for named path affinities"; + } + + feature named-extended-admin-groups { + description + "Indicates support for named extended admin groups"; + } + + feature named-srlg-groups { + description + "Indicates support for named SRLG groups"; + } + + feature named-path-constraints { + description + "Indicates support for named path constraints"; + }*/ + + grouping explicit-route-subobject { + description + "The explicit route subobject grouping"; + choice type { + description + "The explicit route subobject type"; + case ipv4-address { + description + "IPv4 address explicit route subobject"; + leaf v4-address { + type inet:ipv4-address; + description + "An IPv4 address. This address is + treated as a prefix based on the + prefix length value below. Bits beyond + the prefix are ignored on receipt and + SHOULD be set to zero on transmission."; + } + leaf v4-prefix-length { + type uint8; + description + "Length in bits of the IPv4 prefix"; + } + leaf v4-loose { + type boolean; + description + "Describes whether the object is loose + if set, or otherwise strict"; + } + } + case ipv6-address { + description + "IPv6 address Explicit Route Object"; + leaf v6-address { + type inet:ipv6-address; + description + "An IPv6 address. This address is + treated as a prefix based on the + prefix length value below. Bits + beyond the prefix are ignored on + receipt and SHOULD be set to zero + on transmission."; + } + leaf v6-prefix-length { + type uint8; + description + "Length in bits of the IPv4 prefix"; + } + leaf v6-loose { + type boolean; + description + "Describes whether the object is loose + if set, or otherwise strict"; + } + } + case as-number { + leaf as-number { + type uint16; + description "AS number"; + } + description + "Autonomous System explicit route subobject"; + } + case unnumbered-link { + leaf router-id { + type inet:ip-address; + description + "A router-id address"; + } + leaf interface-id { + type uint32; + description "The interface identifier"; + } + description + "Unnumbered link explicit route subobject"; + reference + "RFC3477: Signalling Unnumbered Links in + RSVP-TE"; + } + case label { + leaf value { + type uint32; + description "the label value"; + } + description + "The Label ERO subobject"; + } + /* AS domain sequence..? */ + } + } + + grouping record-route-subobject { + description + "The record route subobject grouping"; + choice type { + description + "The record route subobject type"; + case ipv4-address { + leaf v4-address { + type inet:ipv4-address; + description + "An IPv4 address. This address is + treated as a prefix based on the prefix + length value below. Bits beyond the + prefix are ignored on receipt and + SHOULD be set to zero on transmission."; + } + leaf v4-prefix-length { + type uint8; + description + "Length in bits of the IPv4 prefix"; + } + leaf v4-flags { + type uint8; + description + "IPv4 address sub-object flags"; + reference "RFC3209"; + } + } + case ipv6-address { + leaf v6-address { + type inet:ipv6-address; + description + "An IPv6 address. This address is + treated as a prefix based on the + prefix length value below. Bits + beyond the prefix are ignored on + receipt and SHOULD be set to zero + on transmission."; + } + leaf v6-prefix-length { + type uint8; + description + "Length in bits of the IPv4 prefix"; + } + leaf v6-flags { + type uint8; + description + "IPv6 address sub-object flags"; + reference "RFC3209"; + } + } + case label { + leaf value { + type uint32; + description "the label value"; + } + leaf flags { + type uint8; + description + "Label sub-object flags"; + reference "RFC3209"; + } + description + "The Label ERO subobject"; + } + } + } + + /*identity route-usage-type { + description + "Base identity for route usage"; + } + + identity route-include-ero { + base route-usage-type; + description + "Include ERO from route"; + } + + identity route-exclude-ero { + base route-usage-type; + description + "Exclude ERO from route"; + } + + identity route-exclude-srlg { + base route-usage-type; + description + "Exclude SRLG from route"; + } + + identity path-metric-type { + description + "Base identity for path metric type"; + } + + identity path-metric-te { + base path-metric-type; + description + "TE path metric"; + } + + identity path-metric-igp { + base path-metric-type; + description + "IGP path metric"; + } + + identity path-tiebreaker-type { + description + "Base identity for path tie-breaker type"; + } + + identity path-tiebreaker-minfill { + base path-tiebreaker-type; + description + "Min-Fill LSP path placement"; + } + + identity path-tiebreaker-maxfill { + base path-tiebreaker-type; + description + "Max-Fill LSP path placement"; + } + + identity path-tiebreaker-randoom { + base path-tiebreaker-type; + description + "Random LSP path placement"; + } + + identity bidir-provisioning-mode { + description + "Base identity for bidirectional provisioning + mode."; + } + + identity bidir-provisioning-single-sided { + base bidir-provisioning-mode; + description + "Single-sided bidirectional provioning mode"; + } + + identity bidir-provisioning-double-sided { + base bidir-provisioning-mode; + description + "Double-sided bidirectional provioning mode"; + } + + identity bidir-association-type { + description + "Base identity for bidirectional association type"; + } + + identity bidir-assoc-corouted { + base bidir-association-type; + description + "Co-routed bidirectional association type"; + } + + identity bidir-assoc-non-corouted { + base bidir-association-type; + description + "Non co-routed bidirectional association type"; + } + + identity resource-affinities-type { + description + "Base identity for resource affinities"; + } + + identity resource-aff-include-all { + base resource-affinities-type; + description + "The set of attribute filters associated with a + tunnel all of which must be present for a link + to be acceptable"; + } + + identity resource-aff-include-any { + base resource-affinities-type; + description + "The set of attribute filters associated with a + tunnel any of which must be present for a link + to be acceptable"; + } + + identity resource-aff-exclude-any { + base resource-affinities-type; + description + "The set of attribute filters associated with a + tunnel any of which renders a link unacceptable"; + }*/ + + typedef admin-group { + type binary { +// length 32; + } + description + "Administrative group/Resource class/Color."; + } + + typedef extended-admin-group { + type binary; + description + "Extended administrative group/Resource class/Color."; + } + + typedef admin-groups { + type union { + type admin-group; + type extended-admin-group; + } + description "TE administrative group derived type"; + } + + typedef srlg { + type uint32; + description "SRLG type"; + } + + /*identity path-computation-srlg-type { + description + "Base identity for SRLG path computation"; + } + + identity srlg-ignore { + base path-computation-srlg-type; + description + "Ignores SRLGs in path computation"; + } + + identity srlg-strict { + base path-computation-srlg-type; + description + "Include strict SRLG check in path computation"; + } + + identity srlg-preferred { + base path-computation-srlg-type; + description + "Include preferred SRLG check in path computation"; + } + + identity srlg-weighted { + base path-computation-srlg-type; + description + "Include weighted SRLG check in path computation"; + }*/ + + typedef te-metric { + type uint32; + description + "TE link metric"; + } + + typedef topology-id { + type string { + pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; + } + description + "An identifier for a topology."; + } + + /** + * TE tunnel generic groupings + **/ + + /* Tunnel path selection parameters */ + grouping tunnel-path-selection { + description + "Tunnel path selection properties grouping"; + container path-selection { + description + "Tunnel path selection properties container"; + leaf topology { + type te-types:topology-id; + description + "The tunnel path is computed using the specific + topology identified by this identifier"; + } + leaf cost-limit { + type uint32 { + range "1..4294967295"; + } + description + "The tunnel path cost limit."; + } + leaf hop-limit { + type uint8 { + range "1..255"; + } + description + "The tunnel path hop limit."; + } + leaf metric-type { + type string; + description + "The tunnel path metric type."; + } + leaf tiebreaker-type { + type string; + description + "The tunnel path computation tie breakers."; + } + leaf ignore-overload { + type boolean; + description + "The tunnel path can traverse overloaded node."; + } + uses tunnel-path-affinities; + uses tunnel-path-srlgs; + } + } + + grouping tunnel-path-affinities { + description + "Path affinities grouping"; + container tunnel-path-affinities { + if-feature named-path-affinities; + description + "Path affinities container"; + choice style { + description + "Path affinities representation style"; + case values { + leaf value { + type uint32 { + range "0..4294967295"; + } + description + "Affinity value"; + } + leaf mask { + type uint32 { + range "0..4294967295"; + } + description + "Affinity mask"; + } + } + case named { + list constraints { + key "usage"; + leaf usage { + type string; + description "Affinities usage"; + } + container constraint { + description + "Container for named affinities"; + list affinity-names { + key "name"; + leaf name { + type string; + description + "Affinity name"; + } + description + "List of named affinities"; + } + } + description + "List of named affinity constraints"; + } + } + } + } + } + + grouping tunnel-path-srlgs { + description + "Path SRLG properties grouping"; + container tunnel-path-srlgs { + description + "Path SRLG properties container"; + choice style { + description + "Type of SRLG representation"; + case values { + leaf usage { + type string; + description "SRLG usage"; + } + leaf-list values { + type te-types:srlg; + description "SRLG value"; + } + } + case named { + list constraints { + key "usage"; + leaf usage { + type string; + description "SRLG usage"; + } + container constraint { + description + "Container for named SRLG list"; + list srlg-names { + key "name"; + leaf name { + type string; + description + "The SRLG name"; + } + description + "List named SRLGs"; + } + } + description + "List of named SRLG constraints"; + } + } + } + } + } + + grouping tunnel-bidir-assoc-properties { + description + "TE tunnel associated bidirectional properties + grouping"; + container bidirectional { + description + "TE tunnel associated bidirectional attributes."; + container association { + description + "Tunnel bidirectional association properties"; + leaf id { + type uint16; + description + "The TE tunnel association identifier."; + } + leaf source { + type inet:ip-address; + description + "The TE tunnel association source."; + } + leaf global-source { + type inet:ip-address; + description + "The TE tunnel association global + source."; + } + leaf type { + type string; + description + "The TE tunnel association type."; + } + leaf provisioing { + type string; + description + "Describes the provisioning model of the + associated bidirectional LSP"; + reference + "draft-ietf-teas-mpls-tp-rsvpte-ext- + associated-lsp, section-3.2"; + } + } + } + } + /*** End of TE tunnel groupings ***/ + + /** + * TE interface generic groupings + **/ + } diff --git a/utils/yangutils/src/test/resources/interfileietf/ietf-yang-types.yang b/utils/yangutils/src/test/resources/interfileietf/ietf-yang-types.yang new file mode 100644 index 0000000000..9a543faf6d --- /dev/null +++ b/utils/yangutils/src/test/resources/interfileietf/ietf-yang-types.yang @@ -0,0 +1,490 @@ + module ietf-yang-types { + + yang-version 1; + + namespace + "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + + prefix yang; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision "2013-07-15" { + description + "This revision adds the following new data types: + - yang-identifier + - hex-string + - uuid + - dotted-quad"; + reference + "RFC 6991: Common YANG Data Types"; + + } + + revision "2010-09-24" { + description "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + + } + + + typedef counter32 { + type uint32; + description + "The counter32 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter32 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter32 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter32. + + In the value set and its semantics, this type is equivalent + to the Counter32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + + } + + typedef zero-based-counter32 { + type counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter32 textual convention of the SMIv2."; + reference + "RFC 4502: Remote Network Monitoring Management Information + Base Version 2"; + + } + + typedef counter64 { + type uint64; + description + "The counter64 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter64 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter64 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter64. + + In the value set and its semantics, this type is equivalent + to the Counter64 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + + } + + typedef zero-based-counter64 { + type counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + + + + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter64 textual convention of the SMIv2."; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + + } + + typedef gauge32 { + type uint32; + description + "The gauge32 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^32-1 (4294967295 decimal), and + the minimum value cannot be smaller than 0. The value of + a gauge32 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge32 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the Gauge32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + + } + + typedef gauge64 { + type uint64; + description + "The gauge64 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^64-1 (18446744073709551615), and + the minimum value cannot be smaller than 0. The value of + a gauge64 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge64 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the CounterBasedGauge64 SMIv2 textual convention defined + in RFC 2856"; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + + } + + typedef object-identifier { + type string { + pattern + '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))(\.(0|([1-9]\d*)))*'; + } + description + "The object-identifier type represents administratively + assigned names in a registration-hierarchical-name tree. + + Values of this type are denoted as a sequence of numerical + non-negative sub-identifier values. Each sub-identifier + value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers + are separated by single dots and without any intermediate + whitespace. + + The ASN.1 standard restricts the value space of the first + sub-identifier to 0, 1, or 2. Furthermore, the value space + of the second sub-identifier is restricted to the range + 0 to 39 if the first sub-identifier is 0 or 1. Finally, + the ASN.1 standard requires that an object identifier + has always at least two sub-identifiers. The pattern + captures these restrictions. + + Although the number of sub-identifiers is not limited, + module designers should realize that there may be + implementations that stick with the SMIv2 limit of 128 + sub-identifiers. + + This type is a superset of the SMIv2 OBJECT IDENTIFIER type + since it is not restricted to 128 sub-identifiers. Hence, + this type SHOULD NOT be used to represent the SMIv2 OBJECT + IDENTIFIER type; the object-identifier-128 type SHOULD be + used instead."; + reference + "ISO9834-1: Information technology -- Open Systems + Interconnection -- Procedures for the operation of OSI + Registration Authorities: General procedures and top + arcs of the ASN.1 Object Identifier tree"; + + } + + typedef object-identifier-128 { + type object-identifier { + pattern '\d*(\.\d*){1,127}'; + } + description + "This type represents object-identifiers restricted to 128 + sub-identifiers. + + In the value set and its semantics, this type is equivalent + to the OBJECT IDENTIFIER type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + + } + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + pattern + '.|..|[^xX].*|.[^mM].*|..[^lL].*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 12 of RFC 6020. An identifier must + start with an alphabetic character or an underscore + followed by an arbitrary sequence of alphabetic or + numeric characters, underscores, hyphens, or dots. + + A YANG identifier MUST NOT start with any possible + combination of the lowercase or uppercase character + sequence 'xml'."; + reference + "RFC 6020: YANG - A Data Modeling Language for the Network + Configuration Protocol (NETCONF)"; + + } + + typedef date-and-time { + type string { + pattern + '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-]\d{2}:\d{2})'; + } + description + "The date-and-time type is a profile of the ISO 8601 + standard for representation of dates and times using the + Gregorian calendar. The profile is defined by the + date-time production in Section 5.6 of RFC 3339. + + The date-and-time type is compatible with the dateTime XML + schema type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The date-and-time time-offset -00:00 indicates an unknown + time zone (see RFC 3339) while -00:00 and +00:00 and Z + all represent the same time zone in dateTime. + + (c) The canonical format (see below) of data-and-time values + differs from the canonical format used by the dateTime XML + schema type, which requires all times to be in UTC using + the time-offset 'Z'. + + This type is not equivalent to the DateAndTime textual + convention of the SMIv2 since RFC 3339 uses a different + separator between full-date and full-time and provides + higher resolution of time-secfrac. + + The canonical format for date-and-time values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause date-and-time values + to change accordingly. Such changes might happen periodically + in case a server follows automatically daylight saving time + (DST) time zone offset changes. The canonical format for + date-and-time values with an unknown time zone (usually + referring to the notion of local time) uses the time-offset + -00:00."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; + + } + + typedef timeticks { + type uint32; + description + "The timeticks type represents a non-negative integer that + represents the time, modulo 2^32 (4294967296 decimal), in + hundredths of a second between two epochs. When a schema + node is defined that uses this type, the description of + the schema node identifies both of the reference epochs. + + In the value set and its semantics, this type is equivalent + to the TimeTicks type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + + } + + typedef timestamp { + type timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node at which a specific occurrence + happened. The specific occurrence must be defined in the + description of any schema node defined using this type. When + the specific occurrence occurred prior to the last time the + associated timeticks attribute was zero, then the timestamp + value is zero. Note that this requires all timestamp values + to be reset to zero when the value of the associated timeticks + attribute reaches 497+ days and wraps around to zero. + + The associated timeticks schema node must be specified + in the description of any schema node using this type. + + In the value set and its semantics, this type is equivalent + to the TimeStamp textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + + } + + typedef phys-address { + type string { + pattern + '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "Represents media- or physical-level addresses represented + as a sequence octets, each octet represented by two hexadecimal + numbers. Octets are separated by colons. The canonical + representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the PhysAddress textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + + } + + typedef mac-address { + type string { + pattern + '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + } + description + "The mac-address type represents an IEEE 802 MAC address. + The canonical representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the MacAddress textual convention of the SMIv2."; + reference + "IEEE 802: IEEE Standard for Local and Metropolitan Area + Networks: Overview and Architecture + RFC 2579: Textual Conventions for SMIv2"; + + } + + typedef xpath1.0 { + type string; + description + "This type represents an XPATH 1.0 expression. + + When a schema node is defined that uses this type, the + description of the schema node MUST specify the XPath + context in which the XPath expression is evaluated."; + reference + "XPATH: XML Path Language (XPath) Version 1.0"; + + } + + typedef hex-string { + type string { + pattern + '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "A hexadecimal string with octets represented as hex digits + separated by colons. The canonical representation uses + lowercase characters."; + } + + typedef uuid { + type string { + pattern + '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; + } + description + "A Universally Unique IDentifier in the string representation + defined in RFC 4122. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + "; + reference + "RFC 4122: A Universally Unique IDentifier (UUID) URN + Namespace"; + + } + + typedef dotted-quad { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; + } + description + "An unsigned 32-bit number expressed in the dotted-quad + notation, i.e., four octets written as decimal numbers + and separated with the '.' (full stop) character."; + } + } // module ietf-yang-types + diff --git a/utils/yangutils/src/test/resources/interfilewithusesreferringtype/ietf-network.yang b/utils/yangutils/src/test/resources/interfilewithusesreferringtype/ietf-network.yang new file mode 100644 index 0000000000..3d96560df4 --- /dev/null +++ b/utils/yangutils/src/test/resources/interfilewithusesreferringtype/ietf-network.yang @@ -0,0 +1,14 @@ + module ietf-network { + yang-version 1; + namespace "urn:ietf:params:xml:ns:yang:ietf-network"; + prefix nd; + + container networks { + container network-types { + description + "Serves as an augmentation target. + The network type is indicated through corresponding + presence containers augmented into this container."; + } + } +} diff --git a/utils/yangutils/src/test/resources/interfilewithusesreferringtype/ietf-te-topology.yang b/utils/yangutils/src/test/resources/interfilewithusesreferringtype/ietf-te-topology.yang new file mode 100644 index 0000000000..24344036e4 --- /dev/null +++ b/utils/yangutils/src/test/resources/interfilewithusesreferringtype/ietf-te-topology.yang @@ -0,0 +1,51 @@ + module ietf-te-topology { + yang-version 1; + namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology"; + // replace with IANA namespace when assigned + + prefix "tet"; + + import ietf-network { + prefix "nw"; + } + + grouping te-topologies-augment { + description + "Augmentation for TE topologies."; + leaf reference-change-policy { + type enumeration { + enum no-action { + description + "When an attribute changes in this template, the + configuration node referring to this template does + not take any action."; + } + enum not-allowed { + description + "When any configuration object has a reference to this + template, changing this template is not allowed."; + } + enum cascade { + description + "When an attribute changes in this template, the + configuration object referring to this template applies + the new attribute value to the corresponding + configuration."; + } + } + description + "This attribute specifies the action taken to a configuration + node that has a reference to this template."; + } + } // te-topologies-augment + + + + augment "/nw:networks" { + description + "Augmentation parameters for TE topologies."; + uses te-topologies-augment; + } + + +} diff --git a/utils/yangutils/src/test/resources/usesInContainer/GroupingError.yang b/utils/yangutils/src/test/resources/usesInContainer/GroupingError.yang new file mode 100644 index 0000000000..8c7c01de3a --- /dev/null +++ b/utils/yangutils/src/test/resources/usesInContainer/GroupingError.yang @@ -0,0 +1,64 @@ + +module ietf-sd-onos-service-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-sd-onos-service-types"; + prefix service-types ; + + grouping qos-if-car { + description "qos parameter." ; + list qos-if-car { + key "direction"; + description "cars qos policy." ; + leaf direction { + type enumeration { + enum inbound{ + value 0 ; + description "inbound." ; + } + enum outbound { + value 1 ; + description "outbound." ; + } + } + description "qos for interface car" ; + } +} +} + + container qos-policy { + description "The qos policy of the vpn service." ; + container qos-if-cars { + description "qos policy if car." ; + list qos-if-car { + key "direction"; + uses qos-if-car; + description "List of qos parameters." ; + } + } + } + + rpc close-l3vpn { + description "Close l3vpn." ; + input { + leaf l3vpn-id { + type string; + description "vpn id." ; + } + container ac-status { + description "Access status of the vpn." ; + list acs{ + key "id"; + description "Access information." ; + leaf id { + type string; + description "Access id." ; + } + leaf admin-status { + type string; + description "Administration status." ; + } + } + } + } + } +}