mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-15 17:31:31 +02:00
[ONOS-4636]YANG Grouping linking bug fix + YANG Code review comment fix
Change-Id: I68ee8dd08266a02593e217cef1a9bb010037d673
This commit is contained in:
parent
19f8d3505e
commit
2ee9e7e892
@ -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<YangLeaf> leafsList) {
|
||||
@Override
|
||||
public void setListOfLeaf(List<YangLeaf> 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<YangLeafList> listOfLeafList) {
|
||||
@Override
|
||||
public void setListOfLeafList(List<YangLeafList> 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
|
||||
}
|
||||
|
||||
|
@ -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<YangLeaf> leafsList) {
|
||||
@Override
|
||||
public void setListOfLeaf(List<YangLeaf> 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<YangLeafList> listOfLeafList) {
|
||||
@Override
|
||||
public void setListOfLeafList(List<YangLeafList> 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)) {
|
||||
|
@ -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<YangLeaf> leafsList) {
|
||||
@Override
|
||||
public void setListOfLeaf(List<YangLeaf> 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<YangLeafList> listOfLeafList) {
|
||||
@Override
|
||||
public void setListOfLeafList(List<YangLeafList> 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<YangLeaf> leaves = getListOfLeaf();
|
||||
List<YangLeafList> 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<YangLeaf> leaves, List<YangLeafList> leafLists) throws DataModelException {
|
||||
private void validateConfig(List<YangLeaf> leaves, List<YangLeafList> 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() + "\"");
|
||||
|
@ -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 <T> extended information.
|
||||
*/
|
||||
public class YangDerivedInfo<T> implements LocationInfo {
|
||||
public class YangDerivedInfo<T>
|
||||
implements LocationInfo, Cloneable {
|
||||
|
||||
/**
|
||||
* YANG typedef reference.
|
||||
@ -224,8 +226,11 @@ public class YangDerivedInfo<T> 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<T> 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<T> 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<T> 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<T> 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<T> 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<T> 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<T> 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
|
||||
|
@ -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<YangEnum> 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.
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
@ -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<YangLeaf> leafsList) {
|
||||
@Override
|
||||
public void setListOfLeaf(List<YangLeaf> 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<YangLeafList> listOfLeafList) {
|
||||
@Override
|
||||
public void setListOfLeafList(List<YangLeafList> 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() + "\"");
|
||||
|
@ -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<YangLeaf> 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<YangLeafList> listOfLeafList) {
|
||||
this.listOfLeafList = listOfLeafList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLeafList(YangLeafList leafList) {
|
||||
getListOfLeafList().add(leafList);
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -32,6 +32,13 @@ public interface YangLeavesHolder {
|
||||
*/
|
||||
List<YangLeaf> getListOfLeaf();
|
||||
|
||||
/**
|
||||
* Sets the list of leaves.
|
||||
*
|
||||
* @param leafsList the list of leaf to set
|
||||
*/
|
||||
void setListOfLeaf(List<YangLeaf> leafsList);
|
||||
|
||||
/**
|
||||
* Adds leaf in data holder like container / list.
|
||||
*
|
||||
@ -46,6 +53,13 @@ public interface YangLeavesHolder {
|
||||
*/
|
||||
List<YangLeafList> getListOfLeafList();
|
||||
|
||||
/**
|
||||
* Sets the list of leaf-list.
|
||||
*
|
||||
* @param listOfLeafList the list of leaf-list to set
|
||||
*/
|
||||
void setListOfLeafList(List<YangLeafList> listOfLeafList);
|
||||
|
||||
/**
|
||||
* Adds leaf-list in data holder like container / list.
|
||||
*
|
||||
|
@ -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<String>());
|
||||
}
|
||||
@ -282,7 +284,8 @@ public class YangList extends YangNode
|
||||
*
|
||||
* @param leafsList the list of leaf to set
|
||||
*/
|
||||
private void setListOfLeaf(List<YangLeaf> leafsList) {
|
||||
@Override
|
||||
public void setListOfLeaf(List<YangLeaf> 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<YangLeafList> listOfLeafList) {
|
||||
@Override
|
||||
public void setListOfLeafList(List<YangLeafList> 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<String> keys = getKeyList();
|
||||
List<YangLeaf> leaves = getListOfLeaf();
|
||||
List<YangLeafList> 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<YangLeaf> leaves, List<YangLeafList> leafLists) throws DataModelException {
|
||||
private void validateConfig(List<YangLeaf> leaves, List<YangLeafList> 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<YangLeaf> leaves, List<YangLeafList> leafLists, List<String> keys) throws
|
||||
private void validateKey(List<YangLeaf> leaves, List<YangLeafList> leafLists, List<String> keys)
|
||||
throws
|
||||
DataModelException {
|
||||
boolean leafFound = false;
|
||||
List<YangLeaf> 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() + "\"");
|
||||
|
@ -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.
|
||||
* <p>
|
||||
*
|
||||
* The "contact" statement provides contact information for the module. The
|
||||
* argument is a string that is used to specify contact information for the
|
||||
* person or persons to whom technical queries concerning this module should
|
||||
@ -96,7 +99,7 @@ public class YangModule extends YangNode
|
||||
|
||||
/**
|
||||
* Reference:RFC 6020.
|
||||
* <p>
|
||||
*
|
||||
* The "description" statement takes as an argument a string that contains a
|
||||
* human-readable textual description of this definition. The text is
|
||||
* provided in a language (or languages) chosen by the module developer; for
|
||||
@ -131,7 +134,7 @@ public class YangModule extends YangNode
|
||||
|
||||
/**
|
||||
* Reference:RFC 6020.
|
||||
* <p>
|
||||
*
|
||||
* The "organization" statement defines the party responsible for this
|
||||
* module. The argument is a string that is used to specify a textual
|
||||
* description of the organization(s) under whose auspices this module was
|
||||
@ -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<YangResolutionInfo> unresolvedResolutionList;
|
||||
private List<YangResolutionInfo> derivedTypeResolutionList;
|
||||
|
||||
/**
|
||||
* uses resolution list.
|
||||
*/
|
||||
private List<YangResolutionInfo> 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<YangResolutionInfo>();
|
||||
derivedTypeResolutionList = new LinkedList<YangResolutionInfo>();
|
||||
usesResolutionList = new LinkedList<YangResolutionInfo>();
|
||||
importList = new LinkedList<YangImport>();
|
||||
includeList = new LinkedList<YangInclude>();
|
||||
listOfLeaf = new LinkedList<YangLeaf>();
|
||||
@ -326,6 +335,11 @@ public class YangModule extends YangNode
|
||||
return listOfLeaf;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setListOfLeaf(List<YangLeaf> leafsList) {
|
||||
listOfLeaf = leafsList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a leaf in module.
|
||||
*
|
||||
@ -346,6 +360,12 @@ public class YangModule extends YangNode
|
||||
return listOfLeafList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setListOfLeafList(List<YangLeafList> 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<YangResolutionInfo> resolutionList = getUnresolvedResolutionList();
|
||||
List<YangResolutionInfo> 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<YangResolutionInfo> resolutionList = getUnresolvedResolutionList();
|
||||
List<YangResolutionInfo> 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<YangResolutionInfo> getUnresolvedResolutionList() {
|
||||
return unresolvedResolutionList;
|
||||
public List<YangResolutionInfo> 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<YangResolutionInfo> resolutionList) {
|
||||
unresolvedResolutionList = resolutionList;
|
||||
public void setResolutionList(List<YangResolutionInfo> resolutionList,
|
||||
ResolvableType type) {
|
||||
if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) {
|
||||
derivedTypeResolutionList = resolutionList;
|
||||
} else if (type == ResolvableType.YANG_USES) {
|
||||
usesResolutionList = resolutionList;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<YangLeaf> 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<YangLeafList> listOfLeafList) {
|
||||
this.listOfLeafList = listOfLeafList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLeafList(YangLeafList leafList) {
|
||||
getListOfLeafList().add(leafList);
|
||||
|
@ -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<YangLeaf> leafsList) {
|
||||
listOfLeaf = leafsList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<YangLeafList> getListOfLeafList() {
|
||||
return listOfLeafList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setListOfLeafList(List<YangLeafList> listOfLeafList) {
|
||||
this.listOfLeafList = listOfLeafList;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addLeafList(YangLeafList leafList) {
|
||||
getListOfLeafList().add(leafList);
|
||||
|
@ -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<YangResolutionInfo> unresolvedResolutionList;
|
||||
private List<YangResolutionInfo> derivedTypeResolutionList;
|
||||
|
||||
/**
|
||||
* uses resolution list.
|
||||
*/
|
||||
private List<YangResolutionInfo> usesResolutionList;
|
||||
|
||||
/**
|
||||
* Creates a sub module node.
|
||||
*/
|
||||
public YangSubModule() {
|
||||
super(YangNodeType.SUB_MODULE_NODE);
|
||||
unresolvedResolutionList = new LinkedList<YangResolutionInfo>();
|
||||
derivedTypeResolutionList = new LinkedList<YangResolutionInfo>();
|
||||
usesResolutionList = new LinkedList<YangResolutionInfo>();
|
||||
importList = new LinkedList<YangImport>();
|
||||
includeList = new LinkedList<YangInclude>();
|
||||
listOfLeaf = new LinkedList<YangLeaf>();
|
||||
@ -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<YangResolutionInfo> resolutionList = getUnresolvedResolutionList();
|
||||
List<YangResolutionInfo> 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<YangResolutionInfo> resolutionList = getUnresolvedResolutionList();
|
||||
List<YangResolutionInfo> 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<YangLeaf> leafsList) {
|
||||
listOfLeaf = leafsList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a leaf.
|
||||
*
|
||||
@ -386,6 +403,11 @@ public class YangSubModule extends YangNode
|
||||
return listOfLeafList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setListOfLeafList(List<YangLeafList> 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<YangResolutionInfo> getUnresolvedResolutionList() {
|
||||
return unresolvedResolutionList;
|
||||
public List<YangResolutionInfo> 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<YangResolutionInfo> resolutionList) {
|
||||
this.unresolvedResolutionList = resolutionList;
|
||||
public void setResolutionList(List<YangResolutionInfo> resolutionList,
|
||||
ResolvableType type) {
|
||||
if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) {
|
||||
derivedTypeResolutionList = resolutionList;
|
||||
} else if (type == ResolvableType.YANG_USES) {
|
||||
usesResolutionList = resolutionList;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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<T>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resolve() throws LinkerException {
|
||||
public void resolve()
|
||||
throws LinkerException {
|
||||
/*
|
||||
* Check whether the data type is derived.
|
||||
*/
|
||||
|
@ -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<YangNode> resolvedGroupingNodes;
|
||||
|
||||
/**
|
||||
* Effective list of leaves of grouping that needs to replicated at YANG uses.
|
||||
*/
|
||||
List<List<YangLeaf>> resolvedGroupingLeaves;
|
||||
|
||||
/**
|
||||
* Effective list of leaf lists of grouping that needs to replicated at YANG uses.
|
||||
*/
|
||||
List<List<YangLeafList>> 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<YangNode>();
|
||||
resolvedGroupingLeaves = new LinkedList<List<YangLeaf>>();
|
||||
resolvedGroupingLeafLists = new LinkedList<List<YangLeafList>>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -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());
|
||||
if (referredGrouping.getListOfLeaf() != null
|
||||
&& referredGrouping.getListOfLeaf().size() != 0) {
|
||||
addLeavesOfGrouping(
|
||||
cloneLeavesList(referredGrouping.getListOfLeaf(),
|
||||
usesParentLeavesHolder));
|
||||
}
|
||||
usesParentLeavesHolder.addLeaf(leaf);
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
|
||||
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<YangLeaf> leavesList :
|
||||
usesInGrouping.getUsesResolvedLeavesList()) {
|
||||
addLeavesOfGrouping(cloneLeavesList(leavesList, usesHolder));
|
||||
}
|
||||
|
||||
for (List<YangLeafList> 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<YangLeaf> cloneLeavesList(List<YangLeaf> listOfLeaves,
|
||||
YangLeavesHolder usesParentNode) {
|
||||
if ((listOfLeaves == null) || listOfLeaves.size() == 0) {
|
||||
throw new LinkerException("No leaves to clone");
|
||||
}
|
||||
|
||||
List<YangLeaf> newLeavesList = new LinkedList<YangLeaf>();
|
||||
for (YangLeaf leaf : listOfLeaves) {
|
||||
YangLeaf clonedLeaf;
|
||||
try {
|
||||
YangNode.cloneSubTree(getRefGroup(), usesParentNode);
|
||||
} catch (DataModelException e) {
|
||||
((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<YangLeafList> cloneListOfLeafList(List<YangLeafList> listOfLeafList,
|
||||
YangLeavesHolder usesParentNode) {
|
||||
if ((listOfLeafList == null) || listOfLeafList.size() == 0) {
|
||||
throw new LinkerException("No leaf lists to clone");
|
||||
}
|
||||
|
||||
List<YangLeafList> newListOfLeafList = new LinkedList<YangLeafList>();
|
||||
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<YangNode> 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<YangLeaf> 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<List<YangLeaf>> 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<YangLeafList> 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<List<YangLeafList>> getUsesResolvedListOfLeafList() {
|
||||
return resolvedGroupingLeafLists;
|
||||
}
|
||||
}
|
||||
|
@ -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<YangLeaf> 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<YangLeafList> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
@ -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.
|
@ -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
|
||||
}
|
@ -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
|
||||
|
||||
}
|
@ -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<YangResolutionInfo> getUnresolvedResolutionList();
|
||||
List<YangResolutionInfo> 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<YangResolutionInfo> resolutionList);
|
||||
void setResolutionList(List<YangResolutionInfo> 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<YangFileInfo> yangFileInfoSet) throws LinkerException;
|
||||
void addReferencesToIncludeList(Set<YangFileInfo> 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<YangFileInfo> yangFileInfoSet) throws LinkerException;
|
||||
void addReferencesToImportList(Set<YangFileInfo> yangFileInfoSet)
|
||||
throws LinkerException;
|
||||
}
|
@ -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<YangFileInfo> 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<YangFileInfo> yangFileInfoSet) throws LinkerException {
|
||||
public void linkSubModulesToParentModule(Set<YangFileInfo> 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<YangFileInfo> yangFileInfoSet) throws LinkerException {
|
||||
public void processInterFileLinking(Set<YangFileInfo> 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();
|
||||
|
@ -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 <T> type of resolution entity uses / type
|
||||
*/
|
||||
public class YangResolutionInfo<T> implements LocationInfo {
|
||||
public class YangResolutionInfo<T>
|
||||
implements LocationInfo {
|
||||
|
||||
/**
|
||||
* Information about the entity that needs to be resolved.
|
||||
@ -164,7 +172,7 @@ public class YangResolutionInfo<T> 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<T> 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<T> 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<T> 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<T> 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<T> 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<T> 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<T> 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<T> 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();
|
||||
|
@ -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;
|
||||
@ -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));
|
||||
@ -177,8 +180,8 @@ public final class AugmentListener {
|
||||
* 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<YangNodeIdentifier> 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);
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
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) {
|
||||
try {
|
||||
generateCodeExit(codeGenNode);
|
||||
} catch (Exception e) {
|
||||
throw new TranslatorException(e.getMessage());
|
||||
}
|
||||
curTraversal = SIBILING;
|
||||
codeGenNode = codeGenNode.getNextSibling();
|
||||
} else {
|
||||
try {
|
||||
generateCodeExit(codeGenNode);
|
||||
} catch (Exception e) {
|
||||
throw new TranslatorException(e.getMessage());
|
||||
}
|
||||
curTraversal = PARENT;
|
||||
codeGenNode = codeGenNode.getParent();
|
||||
}
|
||||
@ -123,7 +140,8 @@ public final class JavaCodeGeneratorUtil {
|
||||
* @throws TranslatorException when fails to generate java code file the current
|
||||
* node
|
||||
*/
|
||||
private static void generateCodeExit(YangNode codeGenNode) throws TranslatorException {
|
||||
private static void generateCodeExit(YangNode codeGenNode)
|
||||
throws TranslatorException {
|
||||
|
||||
if (codeGenNode instanceof JavaCodeGenerator) {
|
||||
((JavaCodeGenerator) codeGenNode).generateCodeExit();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
*
|
||||
@ -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;
|
||||
@ -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);
|
||||
@ -802,7 +805,7 @@ public class TempJavaFragmentFiles {
|
||||
* Adds attribute for class.
|
||||
*
|
||||
* @param attr attribute info
|
||||
* @param pluginConfig plugin configurations
|
||||
* @param yangPluginConfig plugin configurations
|
||||
* @throws IOException when fails to append to temporary file
|
||||
*/
|
||||
private void addAttribute(JavaAttributeInfo attr, YangPluginConfig yangPluginConfig)
|
||||
@ -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)
|
||||
@ -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());
|
||||
}
|
||||
|
||||
@ -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,73 +1109,104 @@ 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 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 = new JavaQualifiedTypeInfo();
|
||||
if (curNode instanceof YangJavaGrouping) {
|
||||
qualifiedTypeInfo = resolveGroupingsQuailifiedInfo(curNode, pluginConfig);
|
||||
} else {
|
||||
qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(parentNode,
|
||||
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();
|
||||
|
||||
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 {
|
||||
String className;
|
||||
if (targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule) {
|
||||
className = getCapitalCase(fileInfo.getJavaName()) + "Service";
|
||||
} else {
|
||||
className = getCapitalCase(fileInfo.getJavaName());
|
||||
}
|
||||
|
||||
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;
|
||||
isQualified = parentImportData.addImportInfo(qualifiedTypeInfo,
|
||||
className, fileInfo.getPackage());
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
@ -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 yangPluginConfig plugin config
|
||||
* @throws IOException IO operation fail
|
||||
*/
|
||||
private void addLeavesInfoToTempFiles(List<YangLeaf> listOfLeaves,
|
||||
public void addLeavesInfoToTempFiles(List<YangLeaf> listOfLeaves,
|
||||
YangPluginConfig yangPluginConfig)
|
||||
throws IOException {
|
||||
if (listOfLeaves != null) {
|
||||
@ -1300,10 +1347,10 @@ public class TempJavaFragmentFiles {
|
||||
* Adds leaf list's attributes in generated files.
|
||||
*
|
||||
* @param listOfLeafList list of YANG leaves
|
||||
* @param yangPluginConfig
|
||||
* @param yangPluginConfig plugin config
|
||||
* @throws IOException IO operation fail
|
||||
*/
|
||||
private void addLeafListInfoToTempFiles(List<YangLeafList> listOfLeafList, YangPluginConfig yangPluginConfig)
|
||||
public void addLeafListInfoToTempFiles(List<YangLeafList> listOfLeafList, YangPluginConfig yangPluginConfig)
|
||||
throws IOException {
|
||||
if (listOfLeafList != null) {
|
||||
for (YangLeafList leafList : listOfLeafList) {
|
||||
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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.
|
||||
@ -376,8 +377,7 @@ public class TempJavaServiceFragmentFiles
|
||||
@Override
|
||||
public void generateJavaFile(int fileType, YangNode curNode)
|
||||
throws IOException {
|
||||
List<String> imports = new ArrayList<>();
|
||||
imports = getJavaImportData().getImports();
|
||||
List<String> imports = getJavaImportData().getImports();
|
||||
|
||||
createPackage(curNode);
|
||||
|
||||
@ -441,7 +441,8 @@ public class TempJavaServiceFragmentFiles
|
||||
*/
|
||||
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;
|
||||
@ -477,7 +478,8 @@ public class TempJavaServiceFragmentFiles
|
||||
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;
|
||||
@ -786,13 +788,14 @@ public class TempJavaServiceFragmentFiles
|
||||
* @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);
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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.
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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,8 +224,16 @@ public class YangJavaRpc
|
||||
YangNode tempNode = node.getChild();
|
||||
while (tempNode != null) {
|
||||
if (tempNode instanceof YangUses) {
|
||||
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();
|
||||
}
|
||||
node = node.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);
|
||||
}
|
||||
|
||||
@ -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");
|
||||
@ -299,7 +316,11 @@ public class YangJavaRpc
|
||||
} else if (node.getChild() != null && holder.getListOfLeaf().isEmpty()
|
||||
&& holder.getListOfLeafList().isEmpty()) {
|
||||
if (getNumberOfChildNodes(node) == 1) {
|
||||
if (node.getChild() instanceof YangUses) {
|
||||
setCodeGenFlagForNode(node, getCodeGenFlagWhenUsesIsAChildNode(node));
|
||||
} else {
|
||||
setCodeGenFlagForNode(node, false);
|
||||
}
|
||||
} else {
|
||||
setCodeGenFlagForNode(node, true);
|
||||
}
|
||||
@ -308,6 +329,33 @@ public class YangJavaRpc
|
||||
}
|
||||
}
|
||||
|
||||
/*Returns code gen flag when uses is a child node.*/
|
||||
private boolean getCodeGenFlagWhenUsesIsAChildNode(YangNode node) {
|
||||
YangUses uses = (YangUses) node.getChild();
|
||||
|
||||
List<YangNode> groupingChildResolvedNodes = uses.getUsesResolvedNodeList();
|
||||
List<List<YangLeaf>> groupingChildResolvedLeaves = uses.getUsesResolvedLeavesList();
|
||||
List<List<YangLeafList>> 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.
|
||||
*
|
||||
@ -351,24 +399,9 @@ public class YangJavaRpc
|
||||
YangPluginConfig yangPluginConfig) {
|
||||
|
||||
YangLeavesHolder holder = (YangLeavesHolder) node;
|
||||
List<YangLeaf> 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);
|
||||
YangLeaf leaf = holder.getListOfLeaf().get(0);
|
||||
setLeafHolderFlag(node, true);
|
||||
return javaAttributeInfo;
|
||||
}
|
||||
return null;
|
||||
return getAttributeInfoForLeaf(leaf, yangPluginConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -382,12 +415,39 @@ public class YangJavaRpc
|
||||
YangPluginConfig yangPluginConfig) {
|
||||
|
||||
YangLeavesHolder holder = (YangLeavesHolder) node;
|
||||
List<YangLeafList> listOfLeafList = holder.getListOfLeafList();
|
||||
|
||||
for (YangLeafList leafList : listOfLeafList) {
|
||||
if (!(leafList instanceof JavaLeafInfoContainer)) {
|
||||
throw new TranslatorException("Leaf-list does not have java information");
|
||||
YangLeafList leafList = holder.getListOfLeafList().get(0);
|
||||
setLeafHolderFlag(node, true);
|
||||
return getAttributeInfoForLeafList(leafList, yangPluginConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
@ -399,11 +459,8 @@ public class YangJavaRpc
|
||||
javaLeaf.getDataType(),
|
||||
addTypeImport(javaLeaf.getDataType(), true, yangPluginConfig),
|
||||
true);
|
||||
setLeafHolderFlag(node, true);
|
||||
return javaAttributeInfo;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process input/output node when one child node is present.
|
||||
@ -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<YangNode> groupingChildResolvedNodes = uses.getUsesResolvedNodeList();
|
||||
List<List<YangLeaf>> groupingChildResolvedLeaves = uses.getUsesResolvedLeavesList();
|
||||
List<List<YangLeafList>> 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<List<YangLeaf>> groupingChildResolvedLeaves) {
|
||||
if (!groupingChildResolvedLeaves.isEmpty() &&
|
||||
groupingChildResolvedLeaves.size() == 1) {
|
||||
List<YangLeaf> 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<List<YangLeafList>> groupingChildResolvedLeafList) {
|
||||
|
||||
if (!groupingChildResolvedLeafList.isEmpty() &&
|
||||
groupingChildResolvedLeafList.size() == 1) {
|
||||
List<YangLeafList> leaves = groupingChildResolvedLeafList.get(0);
|
||||
return leaves.size() == 1;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process input/output node when multiple leaf and child nodes are present.
|
||||
*
|
||||
@ -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());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
} catch (IOException e) {
|
||||
throw new TranslatorException(
|
||||
"Failed to prepare generate code entry for container node " + this.getName());
|
||||
}
|
||||
}
|
||||
updatePackageInfo(this, yangPlugin);
|
||||
|
||||
/**
|
||||
* Create a java file using the YANG uses info.
|
||||
*
|
||||
* @throws TranslatorException translator operation fail
|
||||
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.
|
||||
*/
|
||||
@Override
|
||||
public void generateCodeExit() throws TranslatorException {
|
||||
// no code generation will be done for uses.
|
||||
return;
|
||||
}
|
||||
|
||||
for (List<YangLeaf> leavesList :
|
||||
getUsesResolvedLeavesList()) {
|
||||
//add the resolved leaves to the parent as an attribute
|
||||
javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
|
||||
.getBeanTempFiles().addLeavesInfoToTempFiles(leavesList, yangPlugin);
|
||||
}
|
||||
|
||||
for (List<YangLeafList> 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(e.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void generateCodeExit()
|
||||
throws TranslatorException {
|
||||
/*
|
||||
* Do nothing.
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
@ -419,25 +424,83 @@ public final class AttributesJavaDataType {
|
||||
* @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<YangNode> nodesToUpdatePackage = new Stack<YangNode>();
|
||||
|
||||
/*
|
||||
* 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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<JavaQualifiedTypeInfo, Boolean> 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);
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -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,8 +111,8 @@ public final class JavaFileGeneratorUtils {
|
||||
/**
|
||||
* Returns a file object for generated file.
|
||||
*
|
||||
* @param filePath file package path
|
||||
* @param fileName file name
|
||||
* @param filePath file package path
|
||||
* @param extension file extension
|
||||
* @param handle cached file handle
|
||||
* @return file object
|
||||
@ -284,9 +284,14 @@ public final class JavaFileGeneratorUtils {
|
||||
* @throws IOException when fails to generate a file
|
||||
*/
|
||||
public static void initiateJavaFileGeneration(File file, int genType, List<String> 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) {
|
||||
@ -305,7 +310,8 @@ public final class JavaFileGeneratorUtils {
|
||||
* @throws IOException
|
||||
*/
|
||||
private static void appendContents(File file, int genType, List<String> importsList, YangNode curNode,
|
||||
String className) throws IOException {
|
||||
String className)
|
||||
throws IOException {
|
||||
|
||||
JavaFileInfo javaFileInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
|
||||
|
||||
|
@ -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.
|
||||
*/
|
||||
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
@ -198,7 +193,8 @@ public final class YangJavaModelUtils {
|
||||
* @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()
|
||||
@ -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();
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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;
|
||||
|
||||
@ -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<File> store = new LinkedList<>();
|
||||
Stack<String> stack = new Stack<>();
|
||||
stack.push(root);
|
||||
@ -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);
|
||||
|
@ -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/");
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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.
|
||||
|
@ -32,6 +32,7 @@ public class TreeWalkListenerTest {
|
||||
|
||||
@Rule
|
||||
public ExpectedException thrown = ExpectedException.none();
|
||||
|
||||
/**
|
||||
* Checks whether exception is thrown for ordered statement.
|
||||
*/
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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.)";
|
||||
}
|
||||
}
|
||||
}
|
@ -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.";
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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: <http://tools.ietf.org/wg/netmod/>
|
||||
WG List: <mailto:netmod@ietf.org>
|
||||
|
||||
WG Chair: David Kessens
|
||||
<mailto:david.kessens@nsn.com>
|
||||
|
||||
WG Chair: Juergen Schoenwaelder
|
||||
<mailto:j.schoenwaelder@jacobs-university.de>
|
||||
|
||||
Editor: Juergen Schoenwaelder
|
||||
<mailto:j.schoenwaelder@jacobs-university.de>";
|
||||
|
||||
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 <http://www.iana.org/>.
|
||||
|
||||
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
|
@ -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: <http://tools.ietf.org/wg/i2rs/>
|
||||
WG List: <mailto:i2rs@ietf.org>
|
||||
|
||||
WG Chair: Susan Hares
|
||||
<mailto:shares@ndzh.com>
|
||||
|
||||
WG Chair: Jeffrey Haas
|
||||
<mailto:jhaas@pfrc.org>
|
||||
|
||||
Editor: Alexander Clemm
|
||||
<mailto:alex@cisco.com>
|
||||
|
||||
Editor: Jan Medved
|
||||
<mailto:jmedved@cisco.com>
|
||||
|
||||
Editor: Robert Varga
|
||||
<mailto:rovarga@cisco.com>
|
||||
|
||||
Editor: Tony Tkacik
|
||||
<mailto:ttkacik@cisco.com>
|
||||
|
||||
Editor: Nitin Bahadur
|
||||
<mailto:nitin_bahadur@yahoo.com>
|
||||
|
||||
Editor: Hariharan Ananthakrishnan
|
||||
<mailto:hari@packetdesign.com>";
|
||||
|
||||
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";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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: <http://tools.ietf.org/wg/i2rs/>
|
||||
WG List: <mailto:i2rs@ietf.org>
|
||||
|
||||
WG Chair: Susan Hares
|
||||
<mailto:shares@ndzh.com>
|
||||
|
||||
WG Chair: Jeffrey Haas
|
||||
<mailto:jhaas@pfrc.org>
|
||||
|
||||
Editor: Alexander Clemm
|
||||
<mailto:alex@cisco.com>
|
||||
|
||||
Editor: Jan Medved
|
||||
<mailto:jmedved@cisco.com>
|
||||
|
||||
Editor: Robert Varga
|
||||
<mailto:rovarga@cisco.com>
|
||||
|
||||
Editor: Tony Tkacik
|
||||
<mailto:ttkacik@cisco.com>
|
||||
|
||||
Editor: Nitin Bahadur
|
||||
<mailto:nitin_bahadur@yahoo.com>
|
||||
|
||||
Editor: Hariharan Ananthakrishnan
|
||||
<mailto:hari@packetdesign.com>";
|
||||
|
||||
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).";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -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: <http://tools.ietf.org/wg/teas/>
|
||||
WG List: <mailto:teas@ietf.org>
|
||||
|
||||
WG Chair: Lou Berger
|
||||
<mailto:lberger@labn.net>
|
||||
|
||||
WG Chair: Vishnu Pavan Beeram
|
||||
<mailto:vbeeram@juniper.net>
|
||||
|
||||
Editor: Tarek Saad
|
||||
<mailto:tsaad@cisco.com>
|
||||
|
||||
Editor: Rakesh Gandhi
|
||||
<mailto:rgandhi@cisco.com>
|
||||
|
||||
Editor: Vishnu Pavan Beeram
|
||||
<mailto:vbeeram@juniper.net>
|
||||
|
||||
Editor: Himanshu Shah
|
||||
<mailto:hshah@ciena.com>
|
||||
|
||||
Editor: Xufeng Liu
|
||||
<mailto:xufeng.liu@ericsson.com>
|
||||
|
||||
Editor: Xia Chen
|
||||
<mailto:jescia.chenxia@huawei.com>
|
||||
|
||||
Editor: Raqib Jones
|
||||
<mailto:raqib@Brocade.com>
|
||||
|
||||
Editor: Bin Wen
|
||||
<mailto:Bin_Wen@cable.comcast.com>";
|
||||
|
||||
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
|
||||
**/
|
||||
}
|
@ -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: <http://tools.ietf.org/wg/netmod/>
|
||||
WG List: <mailto:netmod@ietf.org>
|
||||
|
||||
WG Chair: David Kessens
|
||||
<mailto:david.kessens@nsn.com>
|
||||
|
||||
WG Chair: Juergen Schoenwaelder
|
||||
<mailto:j.schoenwaelder@jacobs-university.de>
|
||||
|
||||
Editor: Juergen Schoenwaelder
|
||||
<mailto:j.schoenwaelder@jacobs-university.de>";
|
||||
|
||||
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
|
||||
|
@ -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.";
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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." ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user