VinodKumarS-Huawei
Committed by Gerrit Code Review

[ONOS-4636]YANG Grouping linking bug fix + YANG Code review comment fix

Change-Id: I68ee8dd08266a02593e217cef1a9bb010037d673
(cherry picked from commit 2ee9e7e8)
Showing 72 changed files with 5917 additions and 862 deletions
......@@ -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.
}
......@@ -130,6 +135,12 @@ public class YangInput extends YangNode
}
@Override
public void setListOfLeaf(List<YangLeaf> leafsList) {
listOfLeaf = leafsList;
}
@Override
public void addLeaf(YangLeaf leaf) {
getListOfLeaf().add(leaf);
}
......@@ -140,6 +151,11 @@ public class YangInput extends YangNode
}
@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.
......@@ -107,6 +107,11 @@ public class YangLeaf
private String defaultValueInString;
/**
* YANG Node in which the leaf is contained.
*/
YangLeavesHolder containedIn;
/**
* Creates a YANG leaf.
*/
public YangLeaf() {
......@@ -281,6 +286,30 @@ public class YangLeaf
}
/**
* 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.
*
* @return returns LEAF_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.
......@@ -124,6 +124,11 @@ public class YangLeafList
private YangType<?> dataType;
/**
* YANG Node in which the leaf is contained.
*/
YangLeavesHolder containedIn;
/**
* Creates a YANG leaf-list.
*/
public YangLeafList() {
......@@ -298,6 +303,30 @@ public class YangLeafList
}
/**
* 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.
*
* @return returns LEAF_LIST_DATA
......
......@@ -33,6 +33,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.
*
* @param leaf the leaf to be added
......@@ -47,6 +54,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.
*
* @param leafList the leaf-list to be added
......
......@@ -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.
}
......@@ -161,6 +166,11 @@ public class YangNotification extends YangNode
}
@Override
public void setListOfLeaf(List<YangLeaf> leafsList) {
listOfLeaf = leafsList;
}
@Override
public void addLeaf(YangLeaf leaf) {
getListOfLeaf().add(leaf);
}
......@@ -171,6 +181,11 @@ public class YangNotification extends YangNode
}
@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.
}
......@@ -134,11 +139,22 @@ public class YangOutput extends YangNode
}
@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;
......@@ -96,12 +99,30 @@ 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.
*/
public 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));
}
if (referredGrouping.getListOfLeafList() != null
&& referredGrouping.getListOfLeafList().size() != 0) {
addListOfLeafListOfGrouping(
cloneListOfLeafList(referredGrouping.getListOfLeafList(),
usesParentLeavesHolder));
}
YangNode childInGrouping = referredGrouping.getChild();
while (childInGrouping != null) {
if ((childInGrouping instanceof YangEnumeration)
|| (childInGrouping instanceof YangUnion)
|| (childInGrouping instanceof YangTypeDef)) {
/*
* No need to copy the leaves, union / enum class,
* as these will be generated in the scope of grouping
*/
childInGrouping = childInGrouping.getNextSibling();
continue;
} else if ((childInGrouping instanceof YangUses)) {
addResolvedUsesInfoOfGrouping((YangUses) childInGrouping,
usesParentLeavesHolder);
} else {
addNodeOfGrouping(childInGrouping);
}
childInGrouping = childInGrouping.getNextSibling();
}
usesParentLeavesHolder.addLeaf(leaf);
}
/**
* 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);
}
if (referredGrouping.getListOfLeafList() != null) {
for (YangLeafList leafList : referredGrouping.getListOfLeafList()) {
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 {
((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leafList.getName(),
YangConstructType.LEAF_LIST_DATA);
} catch (DataModelException e) {
((CollisionDetector) usesParentNode).detectCollidingChild(leaf.getName(),
YangConstructType.LEAF_DATA);
clonedLeaf = leaf.clone();
} catch (CloneNotSupportedException | DataModelException e) {
throw new LinkerException(e.getMessage());
}
usesParentLeavesHolder.addLeafList(leafList);
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 {
YangNode.cloneSubTree(getRefGroup(), usesParentNode);
} catch (DataModelException e) {
((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.
......
/*
* 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
}
/*
* 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 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 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.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,
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
*/
public boolean addImportInfo(JavaQualifiedTypeInfo newImportInfo) {
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.
*/
......@@ -295,12 +303,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.
*
* @return 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))) {
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;
} else {
String className;
if (targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule) {
className = getCapitalCase(fileInfo.getJavaName()) + "Service";
} else {
className = getCapitalCase(fileInfo.getJavaName());
}
if (!qualifiedTypeInfo.getPkgInfo().equals(parentsClassInfo.getPackage())) {
parentImportData.addImportInfo(qualifiedTypeInfo);
isQualified = false;
isQualified = parentImportData.addImportInfo(qualifiedTypeInfo,
className, fileInfo.getPackage());
}
} 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,12 +399,35 @@ public class YangJavaRpc
YangPluginConfig yangPluginConfig) {
YangLeavesHolder holder = (YangLeavesHolder) node;
List<YangLeaf> listOfLeaves = holder.getListOfLeaf();
YangLeaf leaf = holder.getListOfLeaf().get(0);
setLeafHolderFlag(node, true);
return getAttributeInfoForLeaf(leaf, yangPluginConfig);
}
/**
* Process input/output node when one leaf list is present.
*
* @param node input/output node
* @param yangPluginConfig plugin configurations
* @return java attribute for node
*/
private JavaAttributeInfo processNodeWhenOnlyOneLeafListIsPresent(YangNode node,
YangPluginConfig yangPluginConfig) {
for (YangLeaf leaf : listOfLeaves) {
if (!(leaf instanceof JavaLeafInfoContainer)) {
throw new TranslatorException("Leaf does not have java information");
YangLeavesHolder holder = (YangLeavesHolder) node;
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();
......@@ -365,29 +436,18 @@ public class YangJavaRpc
javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()),
javaLeaf.getDataType(),
addTypeImport(javaLeaf.getDataType(), false, yangPluginConfig), false);
setLeafHolderFlag(node, true);
return javaAttributeInfo;
}
return null;
}
/**
* Process input/output node when one leaf list is present.
* Returns java attribute info for leaf list.
*
* @param node input/output node
* @param leafList YANG leaf list
* @param yangPluginConfig plugin configurations
* @return java attribute for node
* @return java attribute info for leaf list
*/
private JavaAttributeInfo processNodeWhenOnlyOneLeafListIsPresent(YangNode node,
private JavaAttributeInfo getAttributeInfoForLeafList(YangLeafList leafList,
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");
}
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);
......@@ -445,6 +500,88 @@ public class YangJavaRpc
}
/**
* 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.
*
* @param node input/output node
......@@ -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);
updatePackageInfo(this, yangPlugin);
if (!(getParentNodeInGenCode(this) instanceof JavaCodeGeneratorInfo)) {
throw new TranslatorException("invalid container of uses");
}
JavaCodeGeneratorInfo javaCodeGeneratorInfo = (JavaCodeGeneratorInfo) getParentNodeInGenCode(this);
if (javaCodeGeneratorInfo instanceof YangGrouping) {
/*
* Do nothing, since it will taken care in the groupings uses.
*/
return;
}
for (List<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(
"Failed to prepare generate code entry for container node " + this.getName());
throw new TranslatorException(e.getCause());
}
}
/**
* Create a java file using the YANG uses info.
*
* @throws TranslatorException translator operation fail
*/
@Override
public void generateCodeExit() throws TranslatorException {
// no code generation will be done for uses.
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
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);
return modulePkg + PERIOD + getCamelCase(module.getName(), conflictResolver).toLowerCase();
} else if (parent instanceof YangJavaSubModule) {
YangJavaSubModule submodule = (YangJavaSubModule) parent;
String subModulePkg = getRootPackage(submodule.getVersion(),
} else if (yangNode instanceof YangJavaSubModule) {
YangJavaSubModule submodule = (YangJavaSubModule) yangNode;
pkg = getRootPackage(submodule.getVersion(),
submodule.getNameSpaceFromModule(submodule.getBelongsTo()),
submodule.getRevision().getRevDate(), conflictResolver);
return subModulePkg + PERIOD + getCamelCase(submodule.getName(), conflictResolver).toLowerCase();
} 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()));
}
return parentInfo.getPackage() + PERIOD + parentInfo.getJavaName().toLowerCase();
}
}
......
......@@ -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.
*/
......@@ -330,33 +327,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.
*
* @param imports 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.
*/
......@@ -1018,6 +1019,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.
*/
public static final String IMMEDIATE = "immediate";
......@@ -1134,6 +1140,16 @@ public final class UtilConstants {
+ "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.
*/
private UtilConstants() {
......
......@@ -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();
// 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));
// 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 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;
......
module ietf-inet-types {
yang-version 1;
namespace
"urn:ietf:params:xml:ns:yang:ietf-inet-types";
prefix inet;
typedef uri {
type string;
}
}
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.)";
}
}
}
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.";
}
}
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;
}
}
}
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
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";
}
}
}
}
}
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).";
}
}
}
}
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
}
module ietf-te-topology {
yang-version 1;
namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology";
// replace with IANA namespace when assigned
prefix "tet";
import ietf-inet-types {
prefix "inet";
}
import ietf-schedule {
prefix "sch";
}
import ietf-te-types {
prefix "te-types";
}
import ietf-network {
prefix "nw";
}
import ietf-network-topology {
prefix "nt";
}
organization
"Traffic Engineering Architecture and Signaling (TEAS)
Working Group";
contact
"WG Web: <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: Xufeng Liu
<mailto:xliu@kuatrotech.com>
Editor: Igor Bryskin
<mailto:Igor.Bryskin@huawei.com>
Editor: Vishnu Pavan Beeram
<mailto:vbeeram@juniper.net>
Editor: Tarek Saad
<mailto:tsaad@cisco.com>
Editor: Himanshu Shah
<mailto:hshah@ciena.com>
Editor: Oscar Gonzalez De Dios
<mailto:oscar.gonzalezdedios@telefonica.com>";
description "TE topology model";
revision "2016-03-17" {
description "Initial revision";
reference "TBD";
}
/*
* Features
*/
/*feature configuration-schedule {
description
"This feature indicates that the system supports
configuration scheduling.";
}
feature te-topology-hierarchy {
description
"This feature indicates that the system allows underlay
and/or overlay TE topology hierarchy.";
}
feature te-performance-metric {
description
"This feature indicates that the system supports
TE performance metric defined in
RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
}
feature template {
description
"This feature indicates that the system supports
template configuration.";
}*/
/*
* Typedefs
*/
typedef performance-metric-normality {
type enumeration {
enum "unknown" {
value 0;
description
"Unknown.";
}
enum "normal" {
value 1;
description
"Normal.";
}
enum "abnormal" {
value 2;
description
"Abnormal. The anomalous bit is set.";
}
}
description
"Indicates whether a performance metric is normal, abnormal, or
unknown.";
reference
"RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
}
typedef te-admin-status {
type enumeration {
enum up {
description
"Enabled.";
}
enum down {
description
"Disabled.";
}
enum testing {
description
"In some test mode.";
}
enum preparing-maintenance {
description
"Resource is disabled in the control plane to prepare for
graceful shutdown for maintenance purposes.";
reference
"RFC5817: Graceful Shutdown in MPLS and Generalized MPLS
Traffic Engineering Networks";
}
enum maintenance {
description
"Resource is disabled in the data plane for maintenance
purposes.";
}
}
description
"Defines a type representing the administrative status of
a TE resource.";
}
typedef te-global-id {
type uint32;
description
"An identifier to uniquely identify an operator, which can be
either a provider or a client.
The definition of this type is taken from RFC6370 and RFC5003.
This attribute type is used solely to provide a globally
unique context for TE topologies.";
}
typedef te-link-access-type {
type enumeration {
enum point-to-point {
description
"The link is point-to-point.";
}
enum multi-access {
description
"The link is multi-access, including broacast and NBMA.";
}
}
description
"Defines a type representing the access type of a TE link.";
reference
"RFC3630: Traffic Engineering (TE) Extensions to OSPF
Version 2.";
}
typedef te-node-id {
type inet:ip-address;
description
"An identifier for a node in a topology.
The identifier is represented as an IPv4 or IPv6 address.
This attribute is mapped to Router ID in
RFC3630, RFC5329, RFC5305, and RFC 6119.";
}
typedef te-oper-status {
type enumeration {
enum up {
description
"Operational up.";
}
enum down {
description
"Operational down.";
}
enum testing {
description
"In some test mode.";
}
enum unknown {
description
"Status cannot be determined for some reason.";
}
enum preparing-maintenance {
description
"Resource is disabled in the control plane to prepare for
graceful shutdown for maintenance purposes.";
reference
"RFC5817: Graceful Shutdown in MPLS and Generalized MPLS
Traffic Engineering Networks";
}
enum maintenance {
description
"Resource is disabled in the data plane for maintenance
purposes.";
}
}
description
"Defines a type representing the operational status of
a TE resource.";
}
typedef te-recovery-status {
type enumeration {
enum normal {
description
"Both the recovery and working spans are fully
allocated and active, data traffic is being
transported over (or selected from) the working
span, and no trigger events are reported.";
}
enum recovery-started {
description
"The recovery action has been started, but not completed.";
}
enum recovery-succeeded {
description
"The recovery action has succeeded. The working span has
reported a failure/degrade condition and the user traffic
is being transported (or selected) on the recovery span.";
}
enum recovery-failed {
description
"The recovery action has failed.";
}
enum reversion-started {
description
"The reversion has started.";
}
enum reversion-failed {
description
"The reversion has failed.";
}
enum recovery-unavailable {
description
"The recovery is unavailable -- either as a result of an
operator Lockout command or a failure condition detected
on the recovery span.";
}
enum recovery-admin {
description
"The operator has issued a command switching the user
traffic to the recovery span.";
}
enum wait-to-restore {
description
"The recovery domain is recovering from a failuer/degrade
condition on the working span that is being controlled by
the Wait-to-Restore (WTR) timer.";
}
}
description
"Defines the status of a recovery action.";
reference
"RFC4427: Recovery (Protection and Restoration) Terminology
for Generalized Multi-Protocol Label Switching (GMPLS).
RFC6378: MPLS Transport Profile (MPLS-TP) Linear Protection";
}
typedef te-template-name {
type string {
pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*';
}
description
"A type for the name of a TE node template or TE link
template.";
}
typedef te-topology-event-type {
type enumeration {
enum "add" {
value 0;
description
"A TE node or te-link has been added.";
}
enum "remove" {
value 1;
description
"A TE node or te-link has been removed.";
}
enum "update" {
value 2;
description
"A TE node or te-link has been updated.";
}
}
description "TE Event type for notifications";
} // te-topology-event-type
typedef te-topology-id {
type string {
pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*';
}
description
"An identifier for a topology.";
}
typedef te-tp-id {
type union {
type uint32; // Unnumbered
type inet:ip-address; // IPv4 or IPv6 address
}
description
"An identifier for a TE link endpoint on a node.
This attribute is mapped to local or remote link identifier in
RFC3630 and RFC5305.";
}
/*
* Identities
*/
/*
* Groupings
*/
grouping information-source-attributes {
description
"The attributes identifying source that has provided the
related information, and the source credibility.";
leaf information-source {
type enumeration {
enum "unknown" {
description "The source is unknown.";
}
enum "locally-configured" {
description "Configured entity.";
}
enum "ospfv2" {
description "OSPFv2.";
}
enum "ospfv3" {
description "OSPFv3.";
}
enum "isis" {
description "ISIS.";
}
enum "system-processed" {
description "System processed entity.";
}
enum "other" {
description "Other source.";
}
}
description
"Indicates the source of the information.";
}
container information-source-state {
description
"The container contains state attributes related to
the information source.";
leaf credibility-preference {
type uint16;
description
"The preference value to calculate the traffic
engineering database credibility value used for
tie-break selection between different
information-source values.
Higher value is more preferable.";
}
container topology {
description
"When the information is processed by the system,
the attributes in this container indicate which topology
is used to process to generate the result information.";
uses te-topology-ref;
} // topology
leaf routing-instance {
type string;
description
"When applicable, this is the name of a routing instance
from which the information is learned.";
} // routing-information
}
} // information-source-attributes
grouping performance-metric-attributes {
description
"Link performance information in real time.";
reference
"RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
leaf unidirectional-delay {
type uint32 {
range 0..16777215;
}
description "Delay or latency in micro seconds.";
}
leaf unidirectional-min-delay {
type uint32 {
range 0..16777215;
}
description "Minimum delay or latency in micro seconds.";
}
leaf unidirectional-max-delay {
type uint32 {
range 0..16777215;
}
description "Maximum delay or latency in micro seconds.";
}
leaf unidirectional-delay-variation {
type uint32 {
range 0..16777215;
}
description "Delay variation in micro seconds.";
}
leaf unidirectional-packet-loss {
type decimal64 {
/*fraction-digits 6;
range "0 .. 50.331642";*/
}
description
"Packet loss as a percentage of the total traffic sent
over a configurable interval. The finest precision is
0.000003%.";
}
leaf unidirectional-residual-bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Residual bandwidth that subtracts tunnel
reservations from Maximum Bandwidth (or link capacity)
[RFC3630] and provides an aggregated remainder across QoS
classes.";
}
leaf unidirectional-available-bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Available bandwidth that is defined to be residual
bandwidth minus the measured bandwidth used for the
actual forwarding of non-RSVP-TE LSP packets. For a
bundled link, available bandwidth is defined to be the
sum of the component link available bandwidths.";
}
leaf unidirectional-utilized-bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Bandwidth utilization that represents the actual
utilization of the link (i.e. as measured in the router).
For a bundled link, bandwidth utilization is defined to
be the sum of the component link bandwidth
utilizations.";
}
} // performance-metric-attributes
grouping performance-metric-normality-attributes {
description
"Link performance metric normality attributes.";
reference
"RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
leaf unidirectional-delay {
type performance-metric-normality;
description "Delay normality.";
}
leaf unidirectional-min-delay {
type performance-metric-normality;
description "Minimum delay or latency normality.";
}
leaf unidirectional-max-delay {
type performance-metric-normality;
description "Maximum delay or latency normality.";
}
leaf unidirectional-delay-variation {
type performance-metric-normality;
description "Delay variation normality.";
}
leaf unidirectional-packet-loss {
type performance-metric-normality;
description "Packet loss normality.";
}
leaf unidirectional-residual-bandwidth {
type performance-metric-normality;
description "Residual bandwidth normality.";
}
leaf unidirectional-available-bandwidth {
type performance-metric-normality;
description "Available bandwidth normality.";
}
leaf unidirectional-utilized-bandwidth {
type performance-metric-normality;
description "Bandwidth utilization normality.";
}
} // performance-metric-normality-attributes
grouping performance-metric-throttle-container {
description
"A container controlling performance metric throttle.";
container performance-metric-throttle {
if-feature te-performance-metric;
/*must "suppression-interval >= measure-interval" {
error-message
"suppression-interval cannot be less then
measure-interval.";
description
"Constraint on suppression-interval and
measure-interval.";
}*/
description
"Link performance information in real time.";
reference
"RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
leaf unidirectional-delay-offset {
type uint32 {
range 0..16777215;
}
description
"Offset value to be added to the measured delay value.";
}
leaf measure-interval {
type uint32;
default 30;
description
"Interval in seconds to measure the extended metric
values.";
}
leaf advertisement-interval {
type uint32;
description
"Interval in seconds to advertise the extended metric
values.";
}
leaf suppression-interval {
type uint32 {
range "1..max";
}
default 120;
description
"Interval in seconds to suppress advertising the extended
metric values.";
}
container threshold-out {
uses performance-metric-attributes;
description
"If the measured parameter falls outside an upper bound
for all but the min delay metric (or lower bound for
min-delay metric only) and the advertised value is not
already outside that bound, anomalous announcement will be
triggered.";
}
container threshold-in {
uses performance-metric-attributes;
description
"If the measured parameter falls inside an upper bound
for all but the min delay metric (or lower bound for
min-delay metric only) and the advertised value is not
already inside that bound, normal (anomalous-flag cleared)
announcement will be triggered.";
}
container threshold-accelerated-advertisement {
description
"When the difference between the last advertised value and
current measured value exceed this threshold, anomalous
announcement will be triggered.";
uses performance-metric-attributes;
}
}
} // performance-metric-throttle-container
grouping te-link-augment {
description
"Augmentation for TE link.";
container te {
presence "TE support.";
description
"Indicates TE support.";
container config {
description
"Configuration data.";
uses te-link-config;
} // config
container state {
config false;
description
"Operational state data.";
uses te-link-config;
uses te-link-state-derived;
} // state
} // te
} // te-link-augment
grouping te-link-config {
description
"TE link configuration grouping.";
choice bundle-stack-level {
description
"The TE link can be partitioned into bundled
links, or component links.";
case bundle {
container bundled-links {
description
"A set of bundled links.";
reference
"RFC4201: Link Bundling in MPLS Traffic Engineering
(TE).";
list bundled-link {
key "sequence";
description
"Specify a bundled interface that is
further partitioned.";
leaf sequence {
type uint32;
description
"Identify the sequence in the bundle.";
}
leaf src-tp-ref {
type nt:tp-id;
description
"Reference to another TE termination point on the
same souruce node.";
}
leaf des-tp-ref {
type nt:tp-id;
description
"Reference to another TE termination point on the
same destination node.";
}
} // list bundled-link
}
}
case component {
container component-links {
description
"A set of component links";
list component-link {
key "sequence";
description
"Specify a component interface that is
sufficient to unambiguously identify the
appropriate resources";
leaf sequence {
type uint32;
description
"Identify the sequence in the bundle.";
}
leaf src-interface-ref {
type string;
description
"Reference to component link interface on the
source node.";
}
leaf des-interface-ref {
type string;
description
"Reference to component link interface on the
destinatioin node.";
}
}
}
}
} // bundle-stack-level
leaf-list te-link-template {
if-feature template;
type te-template-name;
description
"The reference to a TE link template.";
}
uses te-link-config-attributes;
} // te-link-config
grouping te-link-config-attributes {
description
"Link configuration attributes in a TE topology.";
container te-link-attributes {
description "Link attributes in a TE topology.";
uses sch:schedules;
leaf access-type {
type te-link-access-type;
description
"Link access type, which can be point-to-point or
multi-access.";
}
leaf is-abstract {
type empty;
description "Present if the link is abstract.";
}
leaf name {
type string;
description "Link Name.";
}
container underlay {
if-feature te-topology-hierarchy;
presence
"Indicates the underlay exists for this link.";
description "Attributes of the te-link underlay.";
reference
"RFC4206: Label Switched Paths (LSP) Hierarchy with
Generalized Multi-Protocol Label Switching (GMPLS)
Traffic Engineering (TE)";
uses te-link-underlay-attributes;
} // underlay
leaf admin-status {
type te-admin-status;
description
"The administrative state of the link.";
}
uses performance-metric-throttle-container;
uses te-link-info-attributes;
} // te-link-attributes
} // te-link-config-attributes
grouping te-link-info-attributes {
description
"Advertised TE information attributes.";
leaf link-index {
type uint64;
description
"The link identifier. If OSPF is used, this represents an
ospfLsdbID. If IS-IS is used, this represents an isisLSPID.
If a locally configured link is used, this object represents
a unique value, which is locally defined in a router.";
}
leaf administrative-group {
type te-types:admin-groups;
description
"Administrative group or color of the link.
This attribute covers both administrative group (defined in
RFC3630, RFC5329, and RFC5305), and extended administrative
group (defined in RFC7308).";
}
leaf max-link-bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Maximum bandwidth that can be seen on this link in this
direction. Units in bytes per second.";
reference
"RFC3630: Traffic Engineering (TE) Extensions to OSPF
Version 2.
RFC5305: IS-IS Extensions for Traffic Engineering.";
}
leaf max-resv-link-bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Maximum amount of bandwidth that can be reserved in this
direction in this link. Units in bytes per second.";
reference
"RFC3630: Traffic Engineering (TE) Extensions to OSPF
Version 2.
RFC5305: IS-IS Extensions for Traffic Engineering.";
}
list unreserved-bandwidth {
key "priority";
max-elements "8";
description
"Unreserved bandwidth for 0-7 priority levels. Units in
bytes per second.";
reference
"RFC3630: Traffic Engineering (TE) Extensions to OSPF
Version 2.
RFC5305: IS-IS Extensions for Traffic Engineering.";
leaf priority {
type uint8 {
range "0..7";
}
description "Priority.";
}
leaf bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Unreserved bandwidth for this level.";
}
}
leaf te-default-metric {
type uint32;
description
"Traffic Engineering Metric.";
}
container performance-metric {
if-feature te-performance-metric;
description
"Link performance information in real time.";
reference
"RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.";
container measurement {
description
"Measured performance metric values. Static configuration
and manual overrides of these measurements are also
allowed.";
uses performance-metric-attributes;
}
container normality
{
description
"Performance metric normality values.";
uses performance-metric-normality-attributes;
}
}
leaf link-protection-type {
type enumeration {
enum "unprotected" {
description "Unprotected.";
}
enum "extra-traffic" {
description "Extra traffic.";
}
enum "shared" {
description "Shared.";
}
enum "1-for-1" {
description "One for one protection.";
}
enum "1-plus-1" {
description "One plus one protection.";
}
enum "enhanced" {
description "Enhanced protection.";
}
}
description
"Link Protection Type desired for this link.";
reference
"RFC4202: Routing Extensions in Support of
Generalized Multi-Protocol Label Switching (GMPLS).";
}
list interface-switching-capability {
key "switching-capability";
description
"List of Interface Switching Capabilities Descriptors (ISCD)
for this link.";
reference
"RFC3471: Generalized Multi-Protocol Label Switching (GMPLS)
Signaling Functional Description.
RFC4203: OSPF Extensions in Support of Generalized
Multi-Protocol Label Switching (GMPLS).";
leaf switching-capability {
type string;
description
"Switching Capability for this interface.";
}
leaf encoding {
type string;
description
"Encoding supported by this interface.";
}
list max-lsp-bandwidth {
key "priority";
max-elements "8";
description
"Maximum LSP Bandwidth at priorities 0-7.";
leaf priority {
type uint8 {
range "0..7";
}
description "Priority.";
}
leaf bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Max LSP Bandwidth for this level";
}
}
container time-division-multiplex-capable {
when "../switching-capability = 'TDM'" {
description "Valid only for TDM";
}
description
"Interface has time-division multiplex capabilities.";
leaf minimum-lsp-bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Minimum LSP Bandwidth. Units in bytes per second.";
}
leaf indication {
type enumeration {
enum "standard" {
description
"Indicates support of standard SONET/SDH.";
}
enum "arbitrary" {
description
"Indicates support of arbitrary SONET/SDH.";
}
}
description
"Indication whether the interface supports Standard or
Arbitrary SONET/SDH";
}
}
list interface-adjustment-capability {
key "upper-sc";
description
"List of Interface Adjustment Capability Descriptors (IACD)
for this link.";
reference
"RFC6001: Generalized MPLS (GMPLS) Protocol Extensions
for Multi-Layer and Multi-Region Networks (MLN/MRN).";
leaf upper-sc {
type string;
description
"Switching Capability for this interface.";
}
leaf upper-encoding {
type string;
description
"Encoding supported by this interface.";
}
list max-lsp-bandwidth {
key "priority";
max-elements "8";
description
"Maximum LSP Bandwidth at priorities 0-7.";
leaf priority {
type uint8 {
range "0..7";
}
description "Priority.";
}
leaf bandwidth {
type decimal64 {
/*fraction-digits 2;*/
}
description
"Max LSP Bandwidth for this level.";
}
}
} // interface-adjustment-capability
} // interface-switching-capability
container te-srlgs {
description
"A list of SLRGs.";
leaf-list values {
type te-types:srlg;
description "SRLG value.";
reference
"RFC4202: Routing Extensions in Support of
Generalized Multi-Protocol Label Switching (GMPLS).";
}
}
} // te-link-info-attributes
grouping te-link-state-derived {
description
"Link state attributes in a TE topology.";
leaf oper-status {
type te-oper-status;
description
"The current operational state of the link.";
}
uses information-source-attributes;
list alt-information-sources {
key "information-source";
description
"A list of information sources learned but not used.";
uses information-source-attributes;
uses te-link-info-attributes;
}
container recovery {
description
"Status of the recovery process.";
leaf restoration-status {
type te-recovery-status;
description
"Restoration status.";
}
leaf protection-status {
type te-recovery-status;
description
"Protection status.";
}
}
container underlay {
if-feature te-topology-hierarchy;
description "State attributes for te-link underlay.";
uses te-link-state-underlay-attributes;
}
} // te-link-state-derived
grouping te-link-state-underlay-attributes {
description "State attributes for te-link underlay.";
leaf dynamic {
type boolean;
description
"true if the underlay is dynamically created.";
}
leaf committed {
type boolean;
description
"true if the underlay is committed.";
}
} // te-link-state-underlay-attributes
grouping te-link-underlay-attributes {
description "Attributes for te-link underlay.";
reference
"RFC4206: Label Switched Paths (LSP) Hierarchy with
Generalized Multi-Protocol Label Switching (GMPLS)
Traffic Engineering (TE)";
container underlay-primary-path {
description
"The service path on the underlay topology that
supports this link.";
uses te-topology-ref;
list path-element {
key "path-element-id";
description
"A list of path elements describing the service path.";
leaf path-element-id {
type uint32;
description "To identify the element in a path.";
}
uses te-path-element;
}
} // underlay-primary-path
list underlay-backup-path {
key "index";
description
"A list of backup service paths on the underlay topology that
protect the underlay primary path. If the primary path is
not protected, the list contains zero elements. If the
primary path is protected, the list contains one or more
elements.";
leaf index {
type uint32;
description
"A sequence number to identify a backup path.";
}
uses te-topology-ref;
list path-element {
key "path-element-id";
description
"A list of path elements describing the backup service
path";
leaf path-element-id {
type uint32;
description "To identify the element in a path.";
}
uses te-path-element;
}
} // underlay-backup-path
leaf underlay-protection-type {
type uint16;
description
"Underlay protection type desired for this link";
}
container underlay-trail-src {
uses nt:tp-ref;
description
"Source TE link of the underlay trail.";
}
container underlay-trail-des {
uses nt:tp-ref;
description
"Destination TE link of the underlay trail.";
}
} // te-link-underlay-attributes
grouping te-node-augment {
description
"Augmentation for TE node.";
container te {
presence "TE support.";
description
"Indicates TE support.";
leaf te-node-id {
type te-node-id;
mandatory true;
description
"The identifier of a node in the TE topology.
A node is specific to a topology to which it belongs.";
}
container config {
description
"Configuration data.";
uses te-node-config;
} // config
container state {
config false;
description
"Operational state data.";
uses te-node-config;
uses te-node-state-derived;
} // state
list tunnel-termination-point {
key "tunnel-tp-id";
description
"A termination point can terminate a tunnel.";
leaf tunnel-tp-id {
type binary;
description
"Tunnel termination point identifier.";
}
container config {
description
"Configuration data.";
uses te-node-tunnel-termination-capability;
}
container state {
config false;
description
"Operational state data.";
uses te-node-tunnel-termination-capability;
leaf switching-capability {
type string;
mandatory true;
description
"Switching Capability.";
}
leaf encoding {
type string;
mandatory true;
description
"Encoding type.";
}
} // state
} // tunnel-termination-point
} // te
} // te-node-augment
grouping te-node-config {
description "TE node configuration grouping.";
leaf-list te-node-template {
if-feature template;
type te-template-name;
description
"The reference to a TE node template.";
}
uses te-node-config-attributes;
} // te-node-config
grouping te-node-config-attributes {
description "Configuration node attributes in a TE topology.";
container te-node-attributes {
description "Containing node attributes in a TE topology.";
uses sch:schedules;
leaf admin-status {
type te-admin-status;
description
"The administrative state of the link.";
}
uses te-node-connectivity-matrix;
uses te-node-info-attributes;
} // te-node-attributes
} // te-node-config-attributes
grouping te-node-config-attributes-notification {
description
"Configuration node attributes for template in a TE topology.";
container te-node-attributes {
description "Containing node attributes in a TE topology.";
uses sch:schedules;
leaf admin-status {
type te-admin-status;
description
"The administrative state of the link.";
}
uses te-node-connectivity-matrix-abs;
uses te-node-info-attributes;
} // te-node-attributes
} // te-node-config-attributes-notification
grouping te-node-config-attributes-template {
description
"Configuration node attributes for template in a TE topology.";
container te-node-attributes {
description "Containing node attributes in a TE topology.";
uses sch:schedules;
leaf admin-status {
type te-admin-status;
description
"The administrative state of the link.";
}
uses te-node-info-attributes;
} // te-node-attributes
} // te-node-config-attributes-template
grouping te-node-connectivity-matrix {
description "Connectivity matrix on a TE node.";
list connectivity-matrix {
key "id";
description
"Represents node's switching limitations, i.e. limitations
in interconnecting network TE links across the node.";
reference
"RFC7579: General Network Element Constraint Encoding
for GMPLS-Controlled Networks.";
leaf id {
type uint32;
description "Identifies the connectivity-matrix entry.";
}
container from {
leaf tp-ref {
type nt:tp-id;
description
"Relative reference to source termination point.";
}
description
"Reference to source NTP.";
}
container to {
leaf tp-ref {
type nt:tp-id;
description
"Relative reference to destination termination point.";
}
description
"Reference to destination NTP.";
}
leaf is-allowed {
type boolean;
description
"true - switching is allowed,
false - switching is disallowed.";
}
}
} // te-node-connectivity-matrix
grouping te-node-connectivity-matrix-abs {
description
"Connectivity matrix on a TE node, using absolute
paths to reference termination points.";
list connectivity-matrix {
key "id";
description
"Represents node's switching limitations, i.e. limitations
in interconnecting network TE links across the node.";
reference
"RFC7579: General Network Element Constraint Encoding
for GMPLS-Controlled Networks.";
leaf id {
type uint32;
description "Identifies the connectivity-matrix entry.";
}
container from {
uses nt:tp-ref;
description
"Reference to source NTP.";
}
container to {
uses nt:tp-ref;
description
"Reference to destination NTP.";
}
leaf is-allowed {
type boolean;
description
"true - switching is allowed,
false - switching is disallowed.";
}
}
} // te-node-connectivity-matrix-abs
grouping te-node-info-attributes {
description
"Advertised TE information attributes.";
leaf domain-id {
type uint32;
description
"Identifies the domain that this node belongs.
This attribute is used to support inter-domain links.";
reference
"RFC5152: A Per-Domain Path Computation Method for
Establishing Inter-Domain Traffic Engineering (TE)
Label Switched Paths (LSPs).
RFC5392: OSPF Extensions in Support of Inter-Autonomous
System (AS) MPLS and GMPLS Traffic Engineering.
RFC5316: ISIS Extensions in Support of Inter-Autonomous
System (AS) MPLS and GMPLS Traffic Engineering.";
}
leaf is-abstract {
type empty;
description
"Present if the node is abstract, not present if the node
is actual.";
}
leaf name {
type inet:domain-name;
description "Node name.";
}
leaf-list signaling-address {
type inet:ip-address;
description "Node signaling address.";
}
container underlay-topology {
if-feature te-topology-hierarchy;
description
"When an abstract node encapsulates a topology,
the attributes in this container point to said topology.";
uses te-topology-ref;
}
} // te-node-info-attributes
grouping te-node-state-derived {
description "Node state attributes in a TE topology.";
leaf oper-status {
type te-oper-status;
description
"The current operational state of the node.";
}
leaf is-multi-access-dr {
type empty;
description
"The presence of this attribute indicates that this TE node
is a pseudonode elected as a designated router.";
reference
"RFC3630: Traffic Engineering (TE) Extensions to OSPF
Version 2.
RFC1195: Use of OSI IS-IS for Routing in TCP/IP and Dual
Environments.";
}
uses information-source-attributes;
list alt-information-sources {
key "information-source";
description
"A list of information sources learned but not used.";
uses information-source-attributes;
uses te-node-connectivity-matrix;
uses te-node-info-attributes;
}
} // te-node-state-derived
grouping te-node-state-derived-notification {
description "Node state attributes in a TE topology.";
leaf oper-status {
type te-oper-status;
description
"The current operational state of the node.";
}
leaf is-multi-access-dr {
type empty;
description
"The presence of this attribute indicates that this TE node
is a pseudonode elected as a designated router.";
reference
"RFC3630: Traffic Engineering (TE) Extensions to OSPF
Version 2.
RFC1195: Use of OSI IS-IS for Routing in TCP/IP and Dual
Environments.";
}
uses information-source-attributes;
list alt-information-sources {
key "information-source";
description
"A list of information sources learned but not used.";
uses information-source-attributes;
uses te-node-connectivity-matrix-abs;
uses te-node-info-attributes;
}
} // te-node-state-derived-notification
grouping te-node-tunnel-termination-capability {
description
"Termination capability of a tunnel termination point on a
TE node.";
list termination-capability {
key "link-tp";
description
"The termination capabilities between
tunnel-termination-point and link termination-point.
The capability information can be used to compute
the tunnel path.";
leaf link-tp {
type nt:tp-id;
description
"Link termination point.";
}
} // termination-capability
} // te-node-tunnel-termination-capability
grouping te-path-element {
description
"A group of attributes defining an element in a TE path
such as TE node, TE link, TE atomic resource or label.";
uses te-types:explicit-route-subobject;
} // te-path-element
grouping te-termination-point-augment {
description
"Augmentation for TE termination point.";
container te {
presence "TE support.";
description
"Indicates TE support.";
leaf te-tp-id {
type te-tp-id;
mandatory true;
description
"An identifier to uniquely identify a TE termination
point.";
}
container config {
description
"Configuration data.";
uses te-termination-point-config;
} // config
container state {
config false;
description
"Operational state data.";
uses te-termination-point-config;
} // state
} // te
} // te-termination-point-augment
grouping te-termination-point-config {
description
"TE termination point configuration grouping.";
uses sch:schedules;
} // te-termination-point-config
grouping te-topologies-augment {
description
"Augmentation for TE topologies.";
container te {
presence "TE support.";
description
"Indicates TE support.";
container templates {
description
"Configuration parameters for templates used for TE
topology.";
list node-template {
if-feature template;
key "name";
leaf name {
type te-template-name;
description
"The name to identify a TE node template.";
}
description
"The list of TE node templates used to define sharable
and reusable TE node attributes.";
uses template-attributes;
uses te-node-config-attributes-template;
} // node-template
list link-template {
if-feature template;
key "name";
leaf name {
type te-template-name;
description
"The name to identify a TE link template.";
}
description
"The list of TE link templates used to define sharable
and reusable TE link attributes.";
uses template-attributes;
uses te-link-config-attributes;
} // link-template
} // templates
} // te
} // te-topologies-augment
grouping te-topology-augment {
description
"Augmentation for TE topology.";
container te {
presence "TE support.";
description
"Indicates TE support.";
leaf provider-id {
type te-global-id;
mandatory true;
description
"An identifier to uniquely identify a provider.";
}
leaf client-id {
type te-global-id;
mandatory true;
description
"An identifier to uniquely identify a client.";
}
leaf te-topology-id {
type te-topology-id;
mandatory true;
description
"It is presumed that a datastore will contain many
topologies. To distinguish between topologies it is
vital to have UNIQUE topology identifiers.";
}
container config {
description
"Configuration data.";
uses te-topology-config;
} // config
container state {
config false;
description
"Operational state data.";
uses te-topology-config;
} // state
} // te
} // te-topology-augment
grouping te-topology-config {
description
"TE topology configuration grouping.";
uses sch:schedules;
leaf preference {
type uint8 {
range "1..255";
}
description
"Specifies a preference for this topology. A lower number
indicates a higher preference.";
}
} // te-topology-config
grouping te-topology-ref {
description
"References a TE topology.";
leaf provider-id-ref {
type te-global-id;
description
"A reference to a provider-id.";
}
leaf client-id-ref {
type te-global-id;
description
"A reference to a client-id.";
}
leaf te-topology-id-ref {
type tet:te-topology-id;
description
"A reference to a te-topology-id.";
}
leaf network-id-ref {
type nw:network-id;
description
"A reference to a network-id in base ietf-network module.";
}
} // te-topology-ref
grouping te-topology-type {
description
"Identifies the TE topology type.";
container te-topology {
presence "Indicates TE topology.";
description
"Its presence identifies the TE topology type.";
}
} // te-topology-type
grouping template-attributes {
description
"Common attributes for all templates.";
leaf priority {
type uint16;
description
"The preference value to resolve conflicts between different
templates. When two or more templates specify values for
one configuration attribute, the value from the template
with the highest priority is used.";
}
leaf reference-change-policy {
type enumeration {
enum no-action {
description
"When an attribute changes in this template, the
configuration node referring to this template does
not take any action.";
}
enum not-allowed {
description
"When any configuration object has a reference to this
template, changing this template is not allowed.";
}
enum cascade {
description
"When an attribute changes in this template, the
configuration object referring to this template applies
the new attribute value to the corresponding
configuration.";
}
}
description
"This attribute specifies the action taken to a configuration
node that has a reference to this template.";
}
} // template-attributes
/*
* Configuration data nodes
*/
augment "/nw:networks/nw:network/nw:network-types" {
description
"Introduce new network type for TE topology.";
uses te-topology-type;
}
augment "/nw:networks" {
description
"Augmentation parameters for TE topologies.";
uses te-topologies-augment;
}
augment "/nw:networks/nw:network" {
when "nw:network-types/te-topology" {
description
"Augmentation parameters apply only for networks with
TE topology type.";
}
description
"Configuration parameters for TE topology.";
uses te-topology-augment;
}
augment "/nw:networks/nw:network/nw:node" {
when "../nw:network-types/te-topology" {
description
"Augmentation parameters apply only for networks with
TE topology type.";
}
description
"Configuration parameters for TE at node level.";
uses te-node-augment;
}
augment "/nw:networks/nw:network/nt:link" {
when "../nw:network-types/te-topology" {
description
"Augmentation parameters apply only for networks with
TE topology type.";
}
description
"Configuration parameters for TE at link level";
uses te-link-augment;
}
augment "/nw:networks/nw:network/nw:node/"
+ "nt:termination-point" {
when "../../nw:network-types/te-topology" {
description
"Augmentation parameters apply only for networks with
TE topology type.";
}
description
"Configuration parameters for TE at termination point level";
uses te-termination-point-augment;
}
/*
* Operational state data nodes
*/
/*
* Notifications
*/
notification te-node-event {
description "Notification event for TE node.";
leaf event-type {
type te-topology-event-type;
description "Event type.";
}
uses nw:node-ref;
uses te-topology-type;
uses tet:te-node-config-attributes-notification;
uses tet:te-node-state-derived-notification;
}
notification te-link-event {
description "Notification event for TE link.";
leaf event-type {
type te-topology-event-type;
description "Event type";
}
uses nt:link-ref;
uses te-topology-type;
uses tet:te-link-config-attributes;
uses tet:te-link-state-derived;
}
augment "/te-link-event/te-link-attributes/underlay" {
description "Add state attributes to te-link underlay.";
uses te-link-state-underlay-attributes;
}
}
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
**/
}
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
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.";
}
}
}
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;
}
}
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." ;
}
}
}
}
}
}