Vinod Kumar S

YANG Grouping Linker Support

Change-Id: I2fec0c0bb4d1584e82ffba3228106897ccad2bf5
Showing 40 changed files with 701 additions and 518 deletions
......@@ -26,7 +26,7 @@ public interface Resolvable {
* Returns the status of resolution. If completely resolved returns enum
* value "RESOLVED", if not returns "UNRESOLVED", in case reference of
* grouping/typedef is added to uses/type but it's not resolved
* "PARTIALLY_RESOLVED" is returned.
* "INTRA_FILE_RESOLVED" is returned.
*
* @return status of resolution
*/
......@@ -36,7 +36,7 @@ public interface Resolvable {
* Set the status of type/uses resolution. If completely resolved set enum
* value "RESOLVED", if not set it to "UNRESOLVED", in case reference of
* grouping/typedef is added to uses/type but it's not resolved
* "PARTIALLY_RESOLVED" should be set.
* "INTRA_FILE_RESOLVED" should be set.
*
* @param resolvableStatus status of resolution
*/
......
......@@ -22,17 +22,24 @@ package org.onosproject.yangutils.datamodel;
public enum ResolvableStatus {
/**
* Identifies that resolvable entity is resolved.
* Identifies that resolvable entity is unresolved.
*/
RESOLVED,
UNRESOLVED,
/**
* Identifies that resolvable entity is unresolved.
* Identifies that resolvable entity's reference is linked.
*/
UNRESOLVED,
LINKED,
/**
* Identifies that resolvable entity is partially resolved.
* Identifies that resolvable entity is IntraFile resolved (i.e. complete
* linking with in the intra file).
*/
PARTIALLY_RESOLVED;
INTRA_FILE_RESOLVED,
/**
* Identifies that resolvable entity is resolved.
*/
RESOLVED;
}
......
......@@ -75,6 +75,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
* | when | 7.19.5 | 0..1 |-TODO |
* +--------------+---------+-------------+------------------+
*/
/**
* Representation of data model node to maintain information defined in YANG augment.
*/
......
/*
* 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.datamodel;
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
/**
* Represents information about entity being resolved.
*/
public class YangEntityToResolveInfo<T> {
// Parsable node for which resolution is to be performed.
private T entityToResolve;
// Holder of the YANG construct for which resolution has to be carried out.
private YangNode holderOfEntityToResolve;
/**
* Retrieves the entity to be resolved.
*
* @return entity to be resolved
*/
public T getEntityToResolve() {
return entityToResolve;
}
/**
* Sets entity to be resolved.
*
* @param entityToResolve entity to be resolved
*/
public void setEntityToResolve(T entityToResolve) {
this.entityToResolve = entityToResolve;
}
/**
* Retrieves the parent node which contains the entity to be resolved.
*
* @return parent node which contains the entity to be resolved
*/
public YangNode getHolderOfEntityToResolve() {
return holderOfEntityToResolve;
}
/**
* Sets parent node which contains the entity to be resolved.
*
* @param holderOfEntityToResolve parent node which contains the entity to be resolved
*/
public void setHolderOfEntityToResolve(YangNode holderOfEntityToResolve) {
this.holderOfEntityToResolve = holderOfEntityToResolve;
}
public String getEntityPrefix()
throws DataModelException {
if (getEntityToResolve() == null) {
return null;
}
String prefix;
T entityToResolve = (T) getEntityToResolve();
if (entityToResolve instanceof YangType) {
prefix = ((YangType<?>) entityToResolve).getPrefix();
} else if (entityToResolve instanceof YangUses) {
prefix = ((YangUses) entityToResolve).getPrefix();
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
return prefix;
}
}
......@@ -59,10 +59,12 @@ import org.onosproject.yangutils.utils.YangConstructType;
* | revision-date | 7.1.5.1 | 0..1 | string |
* +---------------+---------+-------------+------------------+
*/
/**
* Represents the information about the imported modules.
*/
public class YangImport implements Parsable {
public class YangImport
implements Parsable {
/**
* Name of the module that is being imported.
......@@ -75,11 +77,6 @@ public class YangImport implements Parsable {
private String prefixId;
/**
* Resolution information root node which is also the data model root node.
*/
private HasResolutionInfo resolutionInfoNode;
/**
* Reference:RFC 6020.
*
* The import's "revision-date" statement is used to specify the exact
......@@ -167,7 +164,8 @@ public class YangImport implements Parsable {
* @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
}
......@@ -178,26 +176,9 @@ public class YangImport implements Parsable {
* @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
}
/**
* Returns the resolution information node.
*
* @return the resolution information node
*/
public HasResolutionInfo getResolutionInfoNode() {
return resolutionInfoNode;
}
/**
* Sets the dresolution information node.
*
* @param resolutionInfoNode the resolution information node
*/
public void setResolutionInfoNode(HasResolutionInfo resolutionInfoNode) {
this.resolutionInfoNode = resolutionInfoNode;
}
}
......
......@@ -33,10 +33,12 @@ import org.onosproject.yangutils.utils.YangConstructType;
* | revision-date | 7.1.5.1 | 0..1 | string |
* +---------------+---------+-------------+------------------+
*/
/**
* Represents the information about the included sub-modules.
*/
public class YangInclude implements Parsable {
public class YangInclude
implements Parsable {
/**
* Name of the sub-module that is being included.
......@@ -50,11 +52,6 @@ public class YangInclude implements Parsable {
private String revision;
/**
* Resolution information root node which is also the data model root node.
*/
private HasResolutionInfo resolutionInfoNode;
/**
* Creates a YANG include.
*/
public YangInclude() {
......@@ -112,7 +109,8 @@ public class YangInclude implements Parsable {
* @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,26 +121,10 @@ public class YangInclude implements Parsable {
* @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
}
/**
* Returns the resolution information node.
*
* @return the resolution information node
*/
public HasResolutionInfo getResolutionInfoNode() {
return resolutionInfoNode;
}
/**
* Sets the dresolution information node.
*
* @param resolutionInfoNode the resolution information node
*/
public void setResolutionInfoNode(HasResolutionInfo resolutionInfoNode) {
this.resolutionInfoNode = resolutionInfoNode;
}
}
......
......@@ -20,19 +20,22 @@ import java.util.Stack;
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
import static org.onosproject.yangutils.datamodel.ResolvableStatus.INTRA_FILE_RESOLVED;
import static org.onosproject.yangutils.datamodel.ResolvableStatus.LINKED;
import static org.onosproject.yangutils.datamodel.ResolvableStatus.RESOLVED;
import static org.onosproject.yangutils.datamodel.ResolvableStatus.UNRESOLVED;
/**
* Represents resolution object which will be resolved by linker.
*
* @param <T> type of resolution entity uses / type
*/
public class YangResolutionInfo<T> {
// Prefix associated with the linking.
private String prefix;
// Parsable node for which resolution is to be performed.
private T entityToResolve;
// Holder of the YANG construct for which resolution has to be carried out.
private YangNode holderOfEntityToResolve;
/**
* Information about the entity that needs to be resolved.
*/
private YangEntityToResolveInfo<T> entityToResolveInfo;
// Error Line number.
private int lineNumber;
......@@ -40,24 +43,20 @@ public class YangResolutionInfo<T> {
// Error character position.
private int charPosition;
// Status of resolution.
private boolean isResolved;
/*
* Stack for type/uses is maintained for hierarchical references, this is
* used during resolution.
*/
private Stack<T> partialResolvedStack;
// Flag to indicate whether more references are detected.
private boolean isMoreReferenceDetected;
private Stack<YangEntityToResolveInfo<T>> partialResolvedStack;
// Module/Sub-module prefix.
private String resolutionInfoRootNodePrefix;
/**
* Create a resolution information object.
* It is private to ensure the overloaded method be invoked to create an
* object.
*/
@SuppressWarnings("unused")
private YangResolutionInfo() {
}
......@@ -66,293 +65,268 @@ public class YangResolutionInfo<T> {
* Creates a resolution information object with all the inputs.
*
* @param dataNode current parsable data node
* @param resolutionType type of resolution whether grouping/typedef
* @param holderNode parent YANG node
* @param prefix imported module prefix
* @param lineNumber error line number
* @param charPositionInLine error character position in line
*/
public YangResolutionInfo(T dataNode, ResolutionType resolutionType,
YangNode holderNode, String prefix, int lineNumber,
int charPositionInLine) {
this.setHolderOfEntityToResolve(holderNode);
this.setEntityToResolve(dataNode);
this.setPrefix(prefix);
this.setLineNumber(lineNumber);
this.setCharPosition(charPositionInLine);
setPartialResolvedStack(new Stack<T>());
}
/**
* Creates a resolution information object with all the inputs except prefix.
*
* @param dataNode current parsable data node
* @param resolutionType type of resolution whether grouping/typedef
* @param holderNode parent YANG node
* @param lineNumber error line number
* @param charPositionInLine error character position in line
*/
public YangResolutionInfo(T dataNode, ResolutionType resolutionType,
YangNode holderNode, int lineNumber,
int charPositionInLine) {
this.setHolderOfEntityToResolve(holderNode);
this.setEntityToResolve(dataNode);
public YangResolutionInfo(T dataNode, YangNode holderNode, int lineNumber, int charPositionInLine) {
setEntityToResolveInfo(new YangEntityToResolveInfo<T>());
getEntityToResolveInfo().setEntityToResolve(dataNode);
getEntityToResolveInfo().setHolderOfEntityToResolve(holderNode);
this.setLineNumber(lineNumber);
this.setCharPosition(charPositionInLine);
setPartialResolvedStack(new Stack<YangEntityToResolveInfo<T>>());
}
/**
* Resolve linking with all the ancestors node for a resolution info.
*
* @param resolutionInfoNodePrefix module/sub-module prefix
* @throws DataModelException DataModelException a violation of data model rules
* @throws DataModelException DataModelException a violation of data model
* rules
*/
public void resolveLinkingForResolutionInfo(String resolutionInfoNodePrefix) throws DataModelException {
public void resolveLinkingForResolutionInfo(String resolutionInfoNodePrefix)
throws DataModelException {
this.resolutionInfoRootNodePrefix = resolutionInfoNodePrefix;
// Current node to resolve, it can be a YANG type or YANG uses.
T entityToResolve = getEntityToResolve();
T entityToResolve = getEntityToResolveInfo().getEntityToResolve();
// Check if linking is already done
if (entityToResolve instanceof Resolvable) {
Resolvable resolvable = (Resolvable) entityToResolve;
if (resolvable.getResolvableStatus() == ResolvableStatus.RESOLVED ||
resolvable.getResolvableStatus() == ResolvableStatus.PARTIALLY_RESOLVED) {
if (resolvable.getResolvableStatus() == RESOLVED) {
/**
* entity is already resolved, so nothing to do
*/
return;
}
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
// Push the initial YANG type to the stack.
getPartialResolvedStack().push(entityToResolve);
// Get holder of entity to resolve
YangNode curNode = getHolderOfEntityToResolve();
// Push the initial entity to resolve in stack.
addInPartialResolvedStack(getEntityToResolveInfo());
resolveLinkingWithAncestors(curNode);
linkAndResolvePartialResolvedStack();
}
/**
* Resolves linking with ancestors.
*
* @param curNode current node for which ancestors to be checked
* @throws DataModelException a violation of data model rules
*/
private void resolveLinkingWithAncestors(YangNode curNode) throws DataModelException {
private void linkAndResolvePartialResolvedStack()
throws DataModelException {
while (curNode != null) {
YangNode node = curNode.getChild();
if (resolveLinkingForNodesChildAndSibling(node, curNode)) {
return;
while (getPartialResolvedStack().size() != 0) {
// Current node to resolve, it can be a YANG type or YANG uses.
T entityToResolve = getCurrentEntityToResolveFromStack();
// Check if linking is already done
if (entityToResolve instanceof Resolvable) {
Resolvable resolvable = (Resolvable) entityToResolve;
switch (resolvable.getResolvableStatus()) {
case RESOLVED: {
/*
* If the entity is already resolved in the stack, then
* pop it and continue with the remaining stack elements
* to resolve
*/
getPartialResolvedStack().pop();
break;
}
curNode = curNode.getParent();
case LINKED: {
/*
* If the top of the stack is already linked then
* resolve the references and pop the entity and
* continue with remaining stack elements to resolve
*/
resolveTopOfStack();
getPartialResolvedStack().pop();
break;
}
// If curNode is null, it indicates an error condition in YANG file.
DataModelException dataModelException = new DataModelException("YANG file error: Unable to find base " +
"typedef/grouping for given type/uses");
case INTRA_FILE_RESOLVED: {
/*
* TODO: this needs to be deleted, when inter-file
* resolution is implmeneted
*/
getPartialResolvedStack().pop();
break;
}
case UNRESOLVED: {
linkTopOfStackReferenceUpdateStack();
if (resolvable.getResolvableStatus() == UNRESOLVED) {
// If current entity is still not resolved, then linking/resolution has failed.
DataModelException dataModelException =
new DataModelException("YANG file error: Unable to find base "
+ "typedef/grouping for given type/uses");
dataModelException.setLine(getLineNumber());
dataModelException.setCharPosition(getCharPosition());
throw dataModelException;
}
/**
* Resolves linking for a node child and siblings.
*
* @param node current node
* @param parentNode parent node of current node
* @return flag to indicate whether resolution is done
* @throws DataModelException
*/
private boolean resolveLinkingForNodesChildAndSibling(YangNode node, YangNode parentNode)
throws DataModelException {
while ((node != null)) {
isMoreReferenceDetected = false;
// Check if node is of type, typedef or grouping
if (isNodeOfResolveType(node)) {
if (resolveLinkingForNode(node, parentNode)) {
return true;
break;
}
default: {
throw new DataModelException("Data Model Exception: Unsupported, linker state");
}
if (isMoreReferenceDetected) {
/*
* If more reference are present, tree traversal must start from
* first child again, to check the availability of
* typedef/grouping.
*/
node = parentNode.getChild();
}
} else {
node = node.getNextSibling();
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
}
return false;
}
/**
* Resolves linking for a node.
*
* @param node current node
* @param parentNode parent node of current node
* @return flag to indicate whether resolution is done
* @throws DataModelException a violation of data model rules
* Resolve the current entity in the stack.
*/
private boolean resolveLinkingForNode(YangNode node, YangNode parentNode) throws DataModelException {
private void resolveTopOfStack() {
((Resolvable) getCurrentEntityToResolveFromStack()).resolve();
/*
* Check if name of node name matches with the entity name under
* resolution.
*/
if (isNodeNameSameAsResolutionInfoName(node)) {
// Adds reference of entity to the node under resolution.
addReferredEntityLink(node);
// Check if referred entity has further reference to uses/type.
if (!(isMoreReferencePresent(node))) {
// Resolve all the entities in stack.
resolveStackAndAddToStack(node);
return true;
} else {
// Adds referred type/uses to the stack.
addToPartialResolvedStack(node);
/*
* Check whether referred type is resolved, partially resolved
* or unresolved.
if (((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus()
!= INTRA_FILE_RESOLVED) {
// Sets the resolution status in inside the type/uses.
((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(RESOLVED);
}
}
/**
* Resolves linking for a node child and siblings.
*
* @throws DataModelException data model error
*/
if (isReferenceFullyResolved()) {
// Resolve the stack which is complete.
resolveCompleteStack();
return true;
} else if (isReferencePartiallyResolved()) {
private void linkTopOfStackReferenceUpdateStack()
throws DataModelException {
if (!isSelfFileReference()) {
/*
* Update the resolution type to partially resolved for all
* type/uses in stack
* TODO: use mojo utilities to load the referred module/sub-module
* and get the reference to the corresponding referred entity
*/
updateResolutionTypeToPartial();
return true;
} else {
/*
* Check if prefix is present to find that the derived
* reference is for intra file or inter file, if it's
* inter-file return and stop further processing.
((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(INTRA_FILE_RESOLVED);
return;
}
/**
* Try to resolve the top of the stack and update partial resolved stack
* if there is recursive references
*/
if (isExternalPrefixPresent(node)) {
/*
* Update the resolution type to partially resolved for
* all type/uses in stack
YangNode potentialAncestorWithReferredNode = getPartialResolvedStack().peek()
.getHolderOfEntityToResolve();
/**
* Traverse up in the ancestor tree to check if the referred node is
* defined
*/
updateResolutionTypeToPartial();
return true;
} else {
/*
* If prefix is not present it indicates intra-file
* dependency in this case set the node back to first
* child, as referred entity may appear in any order and
* continue with the resolution.
while (potentialAncestorWithReferredNode != null) {
/**
* Check for the referred node defined in a ancestor scope
*/
isMoreReferenceDetected = true;
return false;
}
}
YangNode potentialReferredNode = potentialAncestorWithReferredNode.getChild();
if (isReferredNodeInSiblingListProcessed(potentialReferredNode)) {
return;
}
potentialAncestorWithReferredNode = potentialAncestorWithReferredNode.getParent();
}
return false;
}
/**
* Update resolution type to partial for all type/uses in stack.
* Check if the reference in self file or in external file.
*
* @return true if self file reference, false otherwise
* @throws DataModelException a violation of data model rules
*/
private void updateResolutionTypeToPartial() throws DataModelException {
// For all entries in stack calls for the resolution in type/uses.
for (T entity : getPartialResolvedStack()) {
if (!(entity instanceof Resolvable)) {
private boolean isSelfFileReference()
throws DataModelException {
String prefix;
if (getCurrentEntityToResolveFromStack() instanceof YangType) {
prefix = ((YangType<?>) getCurrentEntityToResolveFromStack()).getPrefix();
} else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
prefix = ((YangUses) getCurrentEntityToResolveFromStack()).getPrefix();
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
if (((Resolvable) entity).getResolvableStatus() == ResolvableStatus.UNRESOLVED) {
// Sets the resolution status in inside the type/uses.
((Resolvable) entity).setResolvableStatus(ResolvableStatus.PARTIALLY_RESOLVED);
}
}
}
/**
* Adds referred type/uses to the stack and resolve the stack.
*
* @param node typedef/grouping node
* @throws DataModelException a violation of data model rules
*/
private void resolveStackAndAddToStack(YangNode node) throws DataModelException {
if (getEntityToResolve() instanceof YangType) {
// Adds to the stack only for YANG typedef.
getPartialResolvedStack().push((T) ((YangTypeDef) node).getDataType());
if (prefix == null) {
return true;
}
// Don't add to stack in case of YANG grouping.
return prefix.contentEquals(resolutionInfoRootNodePrefix);
// Resolve the complete stack.
resolveCompleteStack();
}
/**
* Check if the referred type/uses is partially resolved.
* Check for the referred node defined in a ancestor scope.
*
* @return true if reference is partially resolved, otherwise false
* @param potentialReferredNode potential referred node
* @return status of resolution and updating the partial resolved stack with
* the any recursive references
* @throws DataModelException data model errors
*/
private boolean isReferencePartiallyResolved() {
if (getPartialResolvedStack().peek() instanceof YangType) {
/*
* Checks if type is partially resolved.
*/
if (((YangType) getPartialResolvedStack().peek())
.getResolvableStatus() == ResolvableStatus.PARTIALLY_RESOLVED) {
return true;
}
} else if (getPartialResolvedStack().peek() instanceof YangUses) {
if (((YangUses) getPartialResolvedStack().peek())
.getResolvableStatus() == ResolvableStatus.PARTIALLY_RESOLVED) {
return true;
}
}
return false;
}
private boolean isReferredNodeInSiblingListProcessed(YangNode potentialReferredNode)
throws DataModelException {
while (potentialReferredNode != null) {
// Check if the potential referred node is the actual referred node
if (isReferredNode(potentialReferredNode)) {
// Adds reference link of entity to the node under resolution.
addReferredEntityLink(potentialReferredNode);
/**
* Check if the referred type/uses is resolved.
*
* @return true if reference is resolved, otherwise false
* resolve the reference and update the partial resolution stack
* with any further recursive references
*/
private boolean isReferenceFullyResolved() {
if (getPartialResolvedStack().peek() instanceof YangType) {
addUnresolvedRecursiveReferenceToStack(potentialReferredNode);
/*
* Checks if type is partially resolved.
* return true, since the reference is linked and any recursive
* unresolved references is added to the stack
*/
if (((YangType) getPartialResolvedStack().peek()).getResolvableStatus() == ResolvableStatus.RESOLVED) {
return true;
}
} else if (getPartialResolvedStack().peek() instanceof YangUses) {
if (((YangUses) getPartialResolvedStack().peek()).getResolvableStatus() == ResolvableStatus.RESOLVED) {
return true;
}
potentialReferredNode = potentialReferredNode.getNextSibling();
}
return false;
}
/**
* Check if node is of resolve type i.e. of type typedef or grouping.
* Check if the potential referred node is the actual referred node.
*
* @param node typedef/grouping node
* @param potentialReferredNode typedef/grouping node
* @return true if node is of resolve type otherwise false
* @throws DataModelException a violation of data model rules
*/
private boolean isNodeOfResolveType(YangNode node) throws DataModelException {
if (getPartialResolvedStack().peek() instanceof YangType && entityToResolve instanceof YangType) {
if (node instanceof YangTypeDef) {
return true;
private boolean isReferredNode(YangNode potentialReferredNode)
throws DataModelException {
if (getCurrentEntityToResolveFromStack() instanceof YangType) {
if (potentialReferredNode instanceof YangTypeDef) {
/*
* Check if name of node name matches with the entity being
* resolved
*/
return isNodeNameSameAsResolutionInfoName(potentialReferredNode);
}
} else if (getPartialResolvedStack().peek() instanceof YangUses && entityToResolve instanceof YangUses) {
if (node instanceof YangGrouping) {
return true;
} else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
if (potentialReferredNode instanceof YangGrouping) {
/*
* Check if name of node name matches with the entity being
* resolved
*/
return isNodeNameSameAsResolutionInfoName(potentialReferredNode);
}
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
......@@ -369,13 +343,18 @@ public class YangResolutionInfo<T> {
* false
* @throws DataModelException a violation of data model rules
*/
private boolean isNodeNameSameAsResolutionInfoName(YangNode node) throws DataModelException {
if (getPartialResolvedStack().peek() instanceof YangType) {
if (node.getName().equals(((YangType<?>) getPartialResolvedStack().peek()).getDataTypeName())) {
private boolean isNodeNameSameAsResolutionInfoName(YangNode node)
throws DataModelException {
if (getCurrentEntityToResolveFromStack() instanceof YangType) {
if (node.getName().contentEquals(
((YangType<?>) getCurrentEntityToResolveFromStack())
.getDataTypeName())) {
return true;
}
} else if (getPartialResolvedStack().peek() instanceof YangUses) {
if (node.getName().equals(((YangUses) getPartialResolvedStack().peek()).getName())) {
} else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
if (node.getName().contentEquals(
((YangUses) getCurrentEntityToResolveFromStack()).getName())) {
return true;
}
} else {
......@@ -387,181 +366,91 @@ public class YangResolutionInfo<T> {
/**
* Adds reference of grouping/typedef in uses/type.
*
* @param node grouping/typedef node
* @param referredNode grouping/typedef node being referred
* @throws DataModelException a violation of data model rules
*/
private void addReferredEntityLink(YangNode node) throws DataModelException {
if (getPartialResolvedStack().peek() instanceof YangType) {
YangDerivedInfo<?> derivedInfo = (YangDerivedInfo<?>) ((YangType<?>) getPartialResolvedStack().peek())
.getDataTypeExtendedInfo();
derivedInfo.setReferredTypeDef((YangTypeDef) node);
} else if (getPartialResolvedStack().peek() instanceof YangUses) {
((YangUses) getPartialResolvedStack().peek()).setRefGroup((YangGrouping) node);
private void addReferredEntityLink(YangNode referredNode)
throws DataModelException {
if (getCurrentEntityToResolveFromStack() instanceof YangType) {
YangDerivedInfo<?> derivedInfo = (YangDerivedInfo<?>)
((YangType<?>) getCurrentEntityToResolveFromStack()).getDataTypeExtendedInfo();
derivedInfo.setReferredTypeDef((YangTypeDef) referredNode);
} else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
((YangUses) getCurrentEntityToResolveFromStack())
.setRefGroup((YangGrouping) referredNode);
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
// Sets the resolution status in inside the type/uses.
((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(LINKED);
}
/**
* Checks if typedef/grouping has further reference to type/typedef.
* Checks if type/grouping has further reference to typedef/ unresolved
* uses. Add it to the partial resolve stack and return the status of
* addition to stack.
*
* @param node grouping/typedef node
* @return true if referred entity is resolved, otherwise false
* @param referredNode grouping/typedef node
* @throws DataModelException a violation of data model rules
*/
private boolean isMoreReferencePresent(YangNode node) throws DataModelException {
if (getEntityToResolve() instanceof YangType) {
/*
* Checks if typedef type is built-in type
*/
if ((((YangTypeDef) node).getDataType().getDataType() != YangDataTypes.DERIVED)) {
return false;
}
} else if (getEntityToResolve() instanceof YangUses) {
private void addUnresolvedRecursiveReferenceToStack(YangNode referredNode)
throws DataModelException {
if (getCurrentEntityToResolveFromStack() instanceof YangType) {
/*
* Search if the grouping has any uses child, if so return false,
* else return true.
* Checks if typedef type is derived
*/
if (getUsesInGrouping(node) == null) {
return false;
}
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
return true;
}
if (((YangTypeDef) referredNode).getTypeDefBaseType().getDataType()
== YangDataTypes.DERIVED) {
/**
* Return if there is any uses in grouping.
*
* @param node grouping/typedef node
* @return if there is any uses in grouping, otherwise return null
*/
private YangUses getUsesInGrouping(YangNode node) {
YangNode curNode = ((YangGrouping) node).getChild();
while (curNode != null) {
if (curNode instanceof YangUses) {
break;
}
curNode = curNode.getNextSibling();
}
return (YangUses) curNode;
YangEntityToResolveInfo<YangType<?>> unResolvedEntityInfo = new YangEntityToResolveInfo<YangType<?>>();
unResolvedEntityInfo.setEntityToResolve(((YangTypeDef) referredNode)
.getTypeDefBaseType());
unResolvedEntityInfo.setHolderOfEntityToResolve(referredNode);
addInPartialResolvedStack((YangEntityToResolveInfo<T>) unResolvedEntityInfo);
}
/**
* Resolve the complete stack.
*
* @throws DataModelException a violation of data model rules
*/
private void resolveCompleteStack() throws DataModelException {
// For all entries in stack calls for the resolution in type/uses.
for (T entity : getPartialResolvedStack()) {
if (!(entity instanceof Resolvable)) {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
((Resolvable) entity).resolve();
// Sets the resolution status in inside the type/uses.
((Resolvable) entity).setResolvableStatus(ResolvableStatus.RESOLVED);
}
} else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
/*
* Sets the resolution status in resolution info present in resolution
* list.
*/
setIsResolved(true);
}
/**
* Adds to partial resolved stack.
*
* @param node grouping/typedef node
* @throws DataModelException a violation of data model rules
* Search if the grouping has any un resolved uses child, if so
* return true, else return false.
*/
private void addToPartialResolvedStack(YangNode node) throws DataModelException {
if (getPartialResolvedStack().peek() instanceof YangType) {
// Adds to the stack only for YANG typedef.
getPartialResolvedStack().push((T) ((YangTypeDef) node).getDataType());
} else if (getPartialResolvedStack().peek() instanceof YangUses) {
getPartialResolvedStack().push((T) getUsesInGrouping(node));
addUnResolvedUsesToStack(referredNode);
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
}
/**
* Check if prefix is associated with type/uses.
* Return if there is any unresolved uses in grouping.
*
* @param node typedef/grouping node
* @return true if prefix is present, otherwise false
* @throws DataModelException a violation of data model rules
* @param node grouping/typedef node
*/
private boolean isExternalPrefixPresent(YangNode node) throws DataModelException {
if (getEntityToResolve() instanceof YangType) {
if (((YangTypeDef) node).getDataType().getPrefix() != null &&
(!((YangTypeDef) node).getDataType().getPrefix().equals(resolutionInfoRootNodePrefix))) {
return true;
}
} else if (getEntityToResolve() instanceof YangUses) {
if (getUsesInGrouping(node).getPrefix() != null) {
return true;
}
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
return false;
}
private void addUnResolvedUsesToStack(YangNode node) {
/**
* Returns prefix of imported module.
*
* @return prefix of imported module
* Search the grouping node's children for presence of uses node.
*/
public String getPrefix() {
return prefix;
}
YangNode curNode = node.getChild();
while (curNode != null) {
if (curNode instanceof YangUses) {
ResolvableStatus curResolveStatus = ((Resolvable) curNode).getResolvableStatus();
if (curResolveStatus == UNRESOLVED) {
/**
* Sets prefix of imported module.
*
* @param prefix of imported module
* The current uses is not resolved, add it to partial
* resolved stack
*/
public void setPrefix(String prefix) {
this.prefix = prefix;
}
YangEntityToResolveInfo<YangUses> unResolvedEntityInfo = new YangEntityToResolveInfo<YangUses>();
unResolvedEntityInfo.setEntityToResolve((YangUses) curNode);
unResolvedEntityInfo.setHolderOfEntityToResolve(node);
addInPartialResolvedStack((YangEntityToResolveInfo<T>) unResolvedEntityInfo);
/**
* Returns parsable entity which is to be resolved.
*
* @return parsable entity which is to be resolved
*/
public T getEntityToResolve() {
return entityToResolve;
}
/**
* Sets parsable entity to be resolved.
*
* @param entityToResolve YANG entity to be resolved
*/
public void setEntityToResolve(T entityToResolve) {
this.entityToResolve = entityToResolve;
}
/**
* Returns parent YANG node holder for the entity to be resolved.
*
* @return parent YANG node holder
*/
public YangNode getHolderOfEntityToResolve() {
return holderOfEntityToResolve;
curNode = curNode.getNextSibling();
}
/**
* Sets parent YANG node holder for the entity to be resolved.
*
* @param holderOfEntityToResolve parent YANG node holder
*/
public void setHolderOfEntityToResolve(YangNode holderOfEntityToResolve) {
this.holderOfEntityToResolve = holderOfEntityToResolve;
return;
}
/**
......@@ -601,38 +490,59 @@ public class YangResolutionInfo<T> {
}
/**
* Returns status of resolution.
* Returns stack of YANG type with partially resolved YANG construct
* hierarchy.
*
* @return resolution status
* @return partial resolved YANG construct stack
*/
public boolean isResolved() {
return isResolved;
private Stack<YangEntityToResolveInfo<T>> getPartialResolvedStack() {
return partialResolvedStack;
}
/**
* Sets status of resolution.
* Sets stack of YANG type with partially resolved YANG construct hierarchy.
*
* @param isResolved resolution status
* @param partialResolvedStack partial resolved YANG construct stack
*/
public void setIsResolved(boolean isResolved) {
this.isResolved = isResolved;
private void setPartialResolvedStack(Stack<YangEntityToResolveInfo<T>> partialResolvedStack) {
this.partialResolvedStack = partialResolvedStack;
}
/**
* Returns stack of YANG type with partially resolved YANG construct hierarchy.
* Sets stack of YANG type with partially resolved YANG construct hierarchy.
*
* @return partial resolved YANG construct stack
* @param partialResolvedInfo partial resolved YANG construct stack
*/
public Stack<T> getPartialResolvedStack() {
return partialResolvedStack;
private void addInPartialResolvedStack(YangEntityToResolveInfo<T> partialResolvedInfo) {
getPartialResolvedStack().push(partialResolvedInfo);
}
/**
* Sets stack of YANG type with partially resolved YANG construct hierarchy.
* Retrieves the next entity in the stack that needs to be resolved. It is
* assumed that the caller ensures that the stack is not empty.
*
* @param partialResolvedStack partial resolved YANG construct stack
* @return next entity in the stack that needs to be resolved
*/
public void setPartialResolvedStack(Stack<T> partialResolvedStack) {
this.partialResolvedStack = partialResolvedStack;
private T getCurrentEntityToResolveFromStack() {
return getPartialResolvedStack().peek().getEntityToResolve();
}
/**
* Retrieves information about the entity that needs to be resolved.
*
* @return information about the entity that needs to be resolved
*/
public YangEntityToResolveInfo<T> getEntityToResolveInfo() {
return entityToResolveInfo;
}
/**
* Sets information about the entity that needs to be resolved.
*
* @param entityToResolveInfo information about the entity that needs to be
* resolved
*/
public void setEntityToResolveInfo(YangEntityToResolveInfo<T> entityToResolveInfo) {
this.entityToResolveInfo = entityToResolveInfo;
}
}
......
......@@ -104,9 +104,9 @@ public class YangRpc extends YangNode implements YangCommonInfo, Parsable,
@Override
public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException {
if (this.getName().equals(identifierName)) {
if (getName().equals(identifierName)) {
throw new DataModelException("YANG file error: Duplicate input identifier detected, same as rpc \""
+ this.getName() + "\"");
+ getName() + "\"");
}
}
......
......@@ -20,6 +20,8 @@ import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
import org.onosproject.yangutils.parser.Parsable;
import org.onosproject.yangutils.utils.YangConstructType;
import static org.onosproject.yangutils.datamodel.ResolvableStatus.INTRA_FILE_RESOLVED;
/*
* Reference:RFC 6020.
* The "type" statement takes as an argument a string that is the name
......@@ -49,7 +51,8 @@ import org.onosproject.yangutils.utils.YangConstructType;
*
* @param <T> YANG data type info
*/
public class YangType<T> implements Parsable, Resolvable {
public class YangType<T>
implements Parsable, Resolvable {
/**
* YANG node identifier.
......@@ -89,7 +92,7 @@ public class YangType<T> implements Parsable, Resolvable {
* Status of resolution. If completely resolved enum value is "RESOLVED",
* if not enum value is "UNRESOLVED", in case reference of grouping/typedef
* is added to uses/type but it's not resolved value of enum should be
* "PARTIALLY_RESOLVED".
* "INTRA_FILE_RESOLVED".
*/
private ResolvableStatus resolvableStatus;
......@@ -262,7 +265,8 @@ public class YangType<T> implements Parsable, Resolvable {
* @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
}
......@@ -273,7 +277,8 @@ public class YangType<T> implements Parsable, Resolvable {
* @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
}
......@@ -290,6 +295,20 @@ public class YangType<T> implements Parsable, Resolvable {
@Override
public void resolve() {
//TODO: implement the method.
/*
Inherit the Restriction from the referred typedef definition.
*/
if (getDataType() != YangDataTypes.DERIVED) {
throw new RuntimeException("Resolve should only be called for derrived data types");
}
YangDerivedInfo<?> derrivedInfo = (YangDerivedInfo<?>) getDataTypeExtendedInfo();
YangType<?> baseType = derrivedInfo.getReferredTypeDef().getTypeDefBaseType();
if (YangDataTypes.DERIVED == baseType.getDataType()) {
if (baseType.getResolvableStatus() == INTRA_FILE_RESOLVED) {
setResolvableStatus(INTRA_FILE_RESOLVED);
}
}
//TODO:
}
}
......
......@@ -179,7 +179,7 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable {
*
* @return the data type
*/
public YangType<?> getDataType() {
public YangType<?> getTypeDefBaseType() {
return dataType;
}
......
......@@ -16,13 +16,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.parser.Parsable;
import org.onosproject.yangutils.utils.YangConstructType;
import java.util.LinkedList;
import java.util.List;
/*
* Reference RFC 6020.
*
......
......@@ -48,10 +48,13 @@ import org.onosproject.yangutils.utils.YangConstructType;
* | when | 7.19.5 | 0..1 | -TODO |
* +--------------+---------+-------------+------------------+
*/
/**
* Represents data model node to maintain information defined in YANG uses.
*/
public class YangUses extends YangNode implements YangCommonInfo, Parsable, Resolvable {
public class YangUses
extends YangNode
implements YangCommonInfo, Parsable, Resolvable {
/**
* YANG node identifier.
......@@ -82,7 +85,7 @@ public class YangUses extends YangNode implements YangCommonInfo, Parsable, Reso
* Status of resolution. If completely resolved enum value is "RESOLVED",
* if not enum value is "UNRESOLVED", in case reference of grouping/typedef
* is added to uses/type but it's not resolved value of enum should be
* "PARTIALLY_RESOLVED".
* "INTRA_FILE_RESOLVED".
*/
private ResolvableStatus resolvableStatus;
......@@ -189,7 +192,8 @@ public class YangUses extends YangNode implements YangCommonInfo, Parsable, Reso
* @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
}
......@@ -199,7 +203,8 @@ public class YangUses extends YangNode implements YangCommonInfo, Parsable, Reso
* @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
}
......
......@@ -20,6 +20,7 @@ import java.util.List;
import org.onosproject.yangutils.datamodel.CollisionDetector;
import org.onosproject.yangutils.datamodel.HasResolutionInfo;
import org.onosproject.yangutils.datamodel.YangImport;
import org.onosproject.yangutils.datamodel.YangLeaf;
import org.onosproject.yangutils.datamodel.YangLeafList;
import org.onosproject.yangutils.datamodel.YangLeavesHolder;
......@@ -28,6 +29,7 @@ import org.onosproject.yangutils.datamodel.YangResolutionInfo;
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
import org.onosproject.yangutils.utils.YangConstructType;
/**
* Represents utilities for data model tree.
*/
......@@ -117,10 +119,14 @@ public final class DataModelUtils {
* be resolved
* @throws DataModelException a violation of data model rules
*/
public static void addResolutionInfo(YangResolutionInfo resolutionInfo) throws DataModelException {
public static void addResolutionInfo(YangResolutionInfo resolutionInfo)
throws DataModelException {
/* get the module node to add maintain the list of nested reference */
YangNode curNode = resolutionInfo.getHolderOfEntityToResolve();
YangNode curNode = resolutionInfo.getEntityToResolveInfo()
.getHolderOfEntityToResolve();
while (!(curNode instanceof HasResolutionInfo)) {
curNode = curNode.getParent();
if (curNode == null) {
......@@ -128,25 +134,58 @@ public final class DataModelUtils {
}
}
HasResolutionInfo resolutionNode = (HasResolutionInfo) curNode;
if (!isPrefixValid(resolutionInfo.getEntityToResolveInfo().getEntityPrefix(),
resolutionNode)) {
throw new DataModelException("The prefix used is not valid");
}
resolutionNode.addToResolutionList(resolutionInfo);
}
private static boolean isPrefixValid(String entityPrefix, HasResolutionInfo resolutionNode) {
if (entityPrefix == null) {
return true;
}
if (resolutionNode.getPrefix().contentEquals(entityPrefix)) {
return true;
}
if (resolutionNode.getImportList() != null) {
for (YangImport importedInfo : resolutionNode.getImportList()) {
if (importedInfo.getPrefixId().contentEquals(entityPrefix)) {
return true;
}
}
}
if (resolutionNode.getIncludeList() != null) {
/**
* TODO: check if the prefix matches with the imported data
for (YangInclude includedInfo : resolutionNode.getIncludeList()) {
if (includedInfo.contentEquals(prefix)) {
return true;
}
}*/
}
return false;
}
/**
* Resolve linking for a resolution list.
*
* @param resolutionList resolution list for which linking to be done
* @param resolutionInfoNode module/sub-module node
* @param dataModelRootNode module/sub-module node
* @throws DataModelException a violation of data model rules
*/
public static void resolveLinkingForResolutionList(List<YangResolutionInfo> resolutionList,
HasResolutionInfo resolutionInfoNode)
HasResolutionInfo dataModelRootNode)
throws DataModelException {
for (YangResolutionInfo resolutionInfo : resolutionList) {
if (resolutionInfo.getPrefix() == null ||
resolutionInfo.getPrefix().equals(resolutionInfoNode.getPrefix())) {
resolutionInfo.resolveLinkingForResolutionInfo(resolutionInfoNode.getPrefix());
}
resolutionInfo.resolveLinkingForResolutionInfo(dataModelRootNode.getPrefix());
}
}
}
......
......@@ -20,6 +20,7 @@ import org.onosproject.yangutils.datamodel.YangCase;
import org.onosproject.yangutils.datamodel.YangChoice;
import org.onosproject.yangutils.datamodel.YangContainer;
import org.onosproject.yangutils.datamodel.YangGrouping;
import org.onosproject.yangutils.datamodel.YangLeaf;
import org.onosproject.yangutils.datamodel.YangList;
import org.onosproject.yangutils.datamodel.YangModule;
import org.onosproject.yangutils.datamodel.YangSubModule;
......@@ -34,6 +35,7 @@ import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaCase;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaChoice;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaContainer;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGrouping;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaLeaf;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaList;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule;
......@@ -51,7 +53,7 @@ import org.onosproject.yangutils.translator.exception.TranslatorException;
public final class YangDataModelFactory {
/**
* Creates a YANG data model factory object.
* Utility class, hence private to prevent creating objects.
*/
private YangDataModelFactory() {
}
......@@ -261,6 +263,23 @@ public final class YangDataModelFactory {
* generated
* @return the corresponding inherited node based on the target language
*/
public static YangLeaf getYangLeaf(GeneratedLanguage targetLanguage) {
switch (targetLanguage) {
case JAVA_GENERATION: {
return new YangJavaLeaf();
}
default: {
throw new RuntimeException("Only YANG to Java is supported.");
}
}
}
/**
* Returns based on the target language generate the inherited data model node.
*
* @param targetLanguage target language in which YANG mapping needs to be
* generated
* @return the corresponding inherited node based on the target language
*/
public static YangRpc getYangRpcNode(GeneratedLanguage targetLanguage) {
switch (targetLanguage) {
case JAVA_GENERATION: {
......
......@@ -40,8 +40,9 @@ import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA
*/
/**
* Represents listener based call back function corresponding to the "description"
* rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
* Represents listener based call back function corresponding to the
* "description" rule defined in ANTLR grammar file for corresponding ABNF rule
* in RFC 6020.
*/
public final class DescriptionListener {
......@@ -52,9 +53,8 @@ public final class DescriptionListener {
}
/**
* It is called when parser receives an input matching the grammar
* rule (description), perform validations and updates the data model
* tree.
* It is called when parser receives an input matching the grammar rule
* (description), perform validations and updates the data model tree.
*
* @param listener listener's object
* @param ctx context object of the grammar rule
......
......@@ -45,8 +45,8 @@ import static org.onosproject.yangutils.utils.YangConstructType.KEY_DATA;
*/
/**
* Represesnts listener based call back function corresponding to the "key"
* rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
* Represesnts listener based call back function corresponding to the "key" rule
* defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
*/
public final class KeyListener {
......@@ -57,9 +57,8 @@ public final class KeyListener {
}
/**
* It is called when parser receives an input matching the grammar
* rule (key), perform validations and updates the data model
* tree.
* It is called when parser receives an input matching the grammar rule
* (key), perform validations and updates the data model tree.
*
* @param listener listener's object
* @param ctx context object of the grammar rule
......
......@@ -27,10 +27,13 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
import org.onosproject.yangutils.parser.exceptions.ParserException;
import org.onosproject.yangutils.parser.impl.TreeWalkListener;
import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangLeaf;
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.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;
......@@ -108,7 +111,7 @@ public final class LeafListener {
int charPositionInLine = ctx.getStart().getCharPositionInLine();
detectCollidingChildUtil(listener, line, charPositionInLine, identifier, LEAF_DATA);
YangLeaf leaf = new YangLeaf();
YangLeaf leaf = getYangLeaf(JAVA_GENERATION);
leaf.setLeafName(identifier);
Parsable tmpData = listener.getParsedDataStack().peek();
......
......@@ -16,7 +16,6 @@
package org.onosproject.yangutils.parser.impl.listeners;
import org.onosproject.yangutils.datamodel.ResolutionType;
import org.onosproject.yangutils.datamodel.YangDataTypes;
import org.onosproject.yangutils.datamodel.YangDerivedInfo;
import org.onosproject.yangutils.datamodel.YangLeaf;
......@@ -34,11 +33,14 @@ import org.onosproject.yangutils.parser.exceptions.ParserException;
import org.onosproject.yangutils.parser.impl.TreeWalkListener;
import org.onosproject.yangutils.utils.YangConstructType;
import static org.onosproject.yangutils.datamodel.ResolvableStatus.UNRESOLVED;
import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.addResolutionInfo;
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;
......@@ -123,17 +125,15 @@ public final class TypeListener {
ctx.string().getText(), EXIT));
}
// Get the prefix information
String prefix = ((YangType<?>) type).getPrefix();
// Create empty derived info and attach it to type extended info.
YangDerivedInfo<?> yangDerivedInfo = new YangDerivedInfo<>();
((YangType<YangDerivedInfo>) type).setDataTypeExtendedInfo(yangDerivedInfo);
type.setResolvableStatus(UNRESOLVED);
// Add resolution information to the list
YangResolutionInfo resolutionInfo = new YangResolutionInfo<YangType>(type,
ResolutionType.TYPEDEF_RESOLUTION, (YangNode) parentNodeOfLeaf, prefix, errorLine,
errorPosition);
(YangNode) parentNodeOfLeaf, errorLine, errorPosition);
addToResolutionList(resolutionInfo, ctx);
}
break;
......@@ -165,8 +165,8 @@ public final class TypeListener {
((YangType<YangDerivedInfo>) type).setDataTypeExtendedInfo(yangDerivedInfo);
// Add resolution information to the list
YangResolutionInfo resolutionInfo = new YangResolutionInfo<YangType>(type,
ResolutionType.TYPEDEF_RESOLUTION, (YangNode) parentNodeOfLeafList, prefix, errorLine,
YangResolutionInfo resolutionInfo =
new YangResolutionInfo<YangType>(type, (YangNode) parentNodeOfLeafList, errorLine,
errorPosition);
addToResolutionList(resolutionInfo, ctx);
}
......@@ -201,8 +201,8 @@ public final class TypeListener {
((YangType<YangDerivedInfo>) type).setDataTypeExtendedInfo(yangDerivedInfo);
// Add resolution information to the list
YangResolutionInfo resolutionInfo = new YangResolutionInfo<YangType>(type,
ResolutionType.TYPEDEF_RESOLUTION, (YangNode) typeDef, prefix, errorLine, errorPosition);
YangResolutionInfo resolutionInfo =
new YangResolutionInfo<YangType>(type, (YangNode) typeDef, errorLine, errorPosition);
addToResolutionList(resolutionInfo, ctx);
}
break;
......
......@@ -205,7 +205,7 @@ public final class ListenerUtil {
Calendar date = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
String dateForRevision = ((dateFormat.format(date.getTime())).replaceAll(SLASH, HYPHEN)).replaceAll(SPACE,
String dateForRevision = dateFormat.format(date.getTime()).replaceAll(SLASH, HYPHEN).replaceAll(SPACE,
EMPTY_STRING);
return dateForRevision;
}
......@@ -218,8 +218,8 @@ public final class ListenerUtil {
* @param ctx yang construct's context to get the line number and character position
* @return valid node identifier
*/
public static YangNodeIdentifier getValidNodeIdentifier(String nodeIdentifierString, YangConstructType
yangConstruct, ParserRuleContext ctx) {
public static YangNodeIdentifier getValidNodeIdentifier(String nodeIdentifierString,
YangConstructType yangConstruct, ParserRuleContext ctx) {
String tmpIdentifierString = removeQuotesAndHandleConcat(nodeIdentifierString);
String[] tmpData = tmpIdentifierString.split(Pattern.quote(COLON));
if (tmpData.length == 1) {
......
/*
* Copyright 2016 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.translator.tojava;
/**
* Maintain the java qualified access details for an attribute or a class.
*/
public interface HasJavaQualifiedTypeInfo {
/**
* Obtain the java qualified details.
*
* @return java qualified type details
*/
JavaQualifiedTypeInfo getJavaQualifiedInfo();
/**
* Assign the qualified type info.
*
* @param typeInfo qualified type information
*/
void setJavaQualifiedInfo(JavaQualifiedTypeInfo typeInfo);
}
......@@ -1055,7 +1055,7 @@ public class TempJavaCodeFragmentFiles {
public void addTypeDefAttributeToTempFiles(YangNode curNode) throws IOException {
JavaAttributeInfo javaAttributeInfo = getAttributeInfoOfTypeDef(curNode,
((YangTypeDef) curNode).getDataType(),
((YangTypeDef) curNode).getTypeDefBaseType(),
((YangTypeDef) curNode).getName(), false);
addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfo);
}
......
/*
* Copyright 2016 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.translator.tojava.javamodel;
import org.onosproject.yangutils.datamodel.YangLeaf;
import org.onosproject.yangutils.translator.tojava.HasJavaQualifiedTypeInfo;
import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
/**
* Maintains java information corresponding to the YANG leaf.
*/
public class YangJavaLeaf extends YangLeaf
implements HasJavaQualifiedTypeInfo {
private JavaQualifiedTypeInfo javaQualifiedAccess;
/**
* Create a YANG leaf object with java qualified access details.
*/
public YangJavaLeaf() {
super();
setJavaQualifiedInfo(new JavaQualifiedTypeInfo());
}
@Override
public JavaQualifiedTypeInfo getJavaQualifiedInfo() {
return javaQualifiedAccess;
}
@Override
public void setJavaQualifiedInfo(JavaQualifiedTypeInfo typeInfo) {
javaQualifiedAccess = typeInfo;
}
}
......@@ -18,6 +18,7 @@ package org.onosproject.yangutils.linker;
import java.io.IOException;
import java.util.ListIterator;
import org.junit.Test;
import org.onosproject.yangutils.datamodel.ResolvableStatus;
import org.onosproject.yangutils.datamodel.YangContainer;
......@@ -46,7 +47,8 @@ public class IntraFileTypeLinkingTest {
* Checks self resolution when typedef and leaf using type are siblings.
*/
@Test
public void processSelfResolutionWhenTypeAndTypedefAtRootLevel() throws IOException, ParserException {
public void processSelfResolutionWhenTypeAndTypedefAtRootLevel()
throws IOException, ParserException {
YangNode node = manager.getDataModel("src/test/resources/SelfResolutionWhenTypeAndTypedefAtRootLevel.yang");
......@@ -79,7 +81,8 @@ public class IntraFileTypeLinkingTest {
* level where typedef is at the root.
*/
@Test
public void processSelfFileLinkingTypedefAtRootTypeTwoLevelInHierarchy() throws IOException, ParserException {
public void processSelfFileLinkingTypedefAtRootTypeTwoLevelInHierarchy()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtRootTypeTwoLevelInHierarchy.yang");
......@@ -118,7 +121,8 @@ public class IntraFileTypeLinkingTest {
* of type.
*/
@Test
public void processSelfFileLinkingTypedefAtRootIsAfterContainerHavingType() throws IOException, ParserException {
public void processSelfFileLinkingTypedefAtRootIsAfterContainerHavingType()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtRootIsAfterContainerHavingType.yang");
......@@ -157,7 +161,8 @@ public class IntraFileTypeLinkingTest {
* holder of type.
*/
@Test
public void processSelfFileLinkingTypedefAtMiddleLevelAfterParentHolder() throws IOException, ParserException {
public void processSelfFileLinkingTypedefAtMiddleLevelAfterParentHolder()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtMiddleLevelAfterParentHolder.yang");
......@@ -194,7 +199,8 @@ public class IntraFileTypeLinkingTest {
* Checks self resolution when typedef hierarchical references are present.
*/
@Test
public void processSelfFileLinkingWithTypdefHierarchicalReference() throws IOException, ParserException {
public void processSelfFileLinkingWithTypdefHierarchicalReference()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfFileLinkingWithTypdefHierarchicalReference.yang");
......@@ -227,16 +233,16 @@ public class IntraFileTypeLinkingTest {
YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
assertThat(((YangDerivedInfo<?>) typeDef1.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
assertThat(((YangDerivedInfo<?>) typeDef1.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) yangContainer.getChild().getNextSibling()));
assertThat((typeDef1.getDataType().getResolvableStatus()),
assertThat((typeDef1.getTypeDefBaseType().getResolvableStatus()),
is(ResolvableStatus.RESOLVED));
YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
assertThat(((YangDerivedInfo<?>) typeDef2.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
assertThat(((YangDerivedInfo<?>) typeDef2.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) node.getChild()));
assertThat((typeDef2.getDataType().getResolvableStatus()),
assertThat((typeDef2.getTypeDefBaseType().getResolvableStatus()),
is(ResolvableStatus.RESOLVED));
}
......@@ -245,7 +251,8 @@ public class IntraFileTypeLinkingTest {
* with last type is unresolved.
*/
@Test
public void processSelfFileLinkingWithTypdefHierarchicalRefUnresolved() throws IOException, ParserException {
public void processSelfFileLinkingWithTypdefHierarchicalRefUnresolved()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfFileLinkingWithTypdefHierarchicalRefUnresolved.yang");
......@@ -274,28 +281,29 @@ public class IntraFileTypeLinkingTest {
assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) yangList.getChild()));
assertThat((leafInfo.getDataType().getResolvableStatus()),
is(ResolvableStatus.PARTIALLY_RESOLVED));
is(ResolvableStatus.INTRA_FILE_RESOLVED));
YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
assertThat(((YangDerivedInfo<?>) typeDef1.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
assertThat(((YangDerivedInfo<?>) typeDef1.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) yangContainer.getChild().getNextSibling()));
assertThat((typeDef1.getDataType().getResolvableStatus()),
is(ResolvableStatus.PARTIALLY_RESOLVED));
assertThat((typeDef1.getTypeDefBaseType().getResolvableStatus()),
is(ResolvableStatus.INTRA_FILE_RESOLVED));
YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
assertThat(((YangDerivedInfo<?>) typeDef2.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
assertThat(((YangDerivedInfo<?>) typeDef2.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) node.getChild()));
assertThat((typeDef2.getDataType().getResolvableStatus()),
is(ResolvableStatus.PARTIALLY_RESOLVED));
assertThat((typeDef2.getTypeDefBaseType().getResolvableStatus()),
is(ResolvableStatus.INTRA_FILE_RESOLVED));
}
/**
* Checks self resolution when type uses prefix of self module.
*/
@Test
public void processSelfFileLinkingWithTypeWithSelfModulePrefix() throws IOException, ParserException {
public void processSelfFileLinkingWithTypeWithSelfModulePrefix()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfFileLinkingWithTypeWithSelfModulePrefix.yang");
......@@ -328,16 +336,16 @@ public class IntraFileTypeLinkingTest {
YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
assertThat(((YangDerivedInfo<?>) typeDef1.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
assertThat(((YangDerivedInfo<?>) typeDef1.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) yangContainer.getChild().getNextSibling()));
assertThat((typeDef1.getDataType().getResolvableStatus()),
assertThat((typeDef1.getTypeDefBaseType().getResolvableStatus()),
is(ResolvableStatus.RESOLVED));
YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
assertThat(((YangDerivedInfo<?>) typeDef2.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
assertThat(((YangDerivedInfo<?>) typeDef2.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) node.getChild()));
assertThat((typeDef2.getDataType().getResolvableStatus()),
assertThat((typeDef2.getTypeDefBaseType().getResolvableStatus()),
is(ResolvableStatus.RESOLVED));
}
......@@ -346,7 +354,8 @@ public class IntraFileTypeLinkingTest {
* some uses external prefix.
*/
@Test
public void processSelfFileLinkingWithTypeWithSelfAndExternalPrefixMix() throws IOException, ParserException {
public void processSelfFileLinkingWithTypeWithSelfAndExternalPrefixMix()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfFileLinkingWithTypeWithSelfAndExternalPrefixMix.yang");
......@@ -375,15 +384,15 @@ public class IntraFileTypeLinkingTest {
assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) yangList.getChild()));
assertThat((leafInfo.getDataType().getResolvableStatus()),
is(ResolvableStatus.PARTIALLY_RESOLVED));
is(ResolvableStatus.INTRA_FILE_RESOLVED));
YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
assertThat(((YangDerivedInfo<?>) typeDef2.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
assertThat(((YangDerivedInfo<?>) typeDef2.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
is((YangTypeDef) node.getChild()));
assertThat((typeDef2.getDataType().getResolvableStatus()),
assertThat((typeDef2.getTypeDefBaseType().getResolvableStatus()),
is(ResolvableStatus.RESOLVED));
}
......@@ -392,7 +401,8 @@ public class IntraFileTypeLinkingTest {
* file.
*/
@Test(expected = ParserException.class)
public void processSelfResolutionWhenTypeReferredTypedefNotDefined() throws IOException, ParserException {
public void processSelfResolutionWhenTypeReferredTypedefNotDefined()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfResolutionWhenTypeReferredTypedefNotDefined.yang");
......@@ -403,7 +413,8 @@ public class IntraFileTypeLinkingTest {
* level where typedef is is not an ancestor of type.
*/
@Test(expected = ParserException.class)
public void processSelfFileLinkingTypedefNotFound() throws IOException, ParserException {
public void processSelfFileLinkingTypedefNotFound()
throws IOException, ParserException {
YangNode node = manager.getDataModel("src/test/resources/SelfFileLinkingTypedefNotFound.yang");
}
......@@ -412,7 +423,8 @@ public class IntraFileTypeLinkingTest {
* Checks hierarchical self resolution with self resolution failure scenario.
*/
@Test(expected = ParserException.class)
public void processSelfFileLinkingWithHierarchicalTypeFailureScenario() throws IOException, ParserException {
public void processSelfFileLinkingWithHierarchicalTypeFailureScenario()
throws IOException, ParserException {
YangNode node =
manager.getDataModel("src/test/resources/SelfFileLinkingWithHierarchicalTypeFailureScenario.yang");
......
......@@ -106,6 +106,6 @@ public class InputListenerTest {
YangTypeDef typeDef = (YangTypeDef) yangInput.getChild();
assertThat(typeDef.getName(), is("my-type"));
assertThat(typeDef.getStatus(), is(YangStatusType.DEPRECATED));
assertThat(typeDef.getDataType().getDataType(), is(YangDataTypes.INT32));
assertThat(typeDef.getTypeDefBaseType().getDataType(), is(YangDataTypes.INT32));
}
}
......
......@@ -128,7 +128,7 @@ public class LengthRestrictionListenerTest {
assertThat(yangNode.getName(), is("Test"));
YangTypeDef typedef = (YangTypeDef) yangNode.getChild();
YangStringRestriction stringRestriction = (YangStringRestriction) typedef.getDataType()
YangStringRestriction stringRestriction = (YangStringRestriction) typedef.getTypeDefBaseType()
.getDataTypeExtendedInfo();
YangRangeRestriction lengthRestriction = stringRestriction.getLengthRestriction();
......
......@@ -108,6 +108,6 @@ public class OutputListenerTest {
assertThat(typeDef.getStatus(), is(YangStatusType.DEPRECATED));
assertThat(typeDef.getName(), is("my-type"));
assertThat(typeDef.getStatus(), is(YangStatusType.DEPRECATED));
assertThat(typeDef.getDataType().getDataType(), is(YangDataTypes.INT32));
assertThat(typeDef.getTypeDefBaseType().getDataType(), is(YangDataTypes.INT32));
}
}
......
......@@ -108,7 +108,7 @@ public class PatternRestrictionListenerTest {
assertThat(yangNode.getName(), is("Test"));
YangTypeDef typedef = (YangTypeDef) yangNode.getChild();
YangStringRestriction stringRestriction = (YangStringRestriction) typedef.getDataType()
YangStringRestriction stringRestriction = (YangStringRestriction) typedef.getTypeDefBaseType()
.getDataTypeExtendedInfo();
YangPatternRestriction yangPatternRestriction = stringRestriction.getPatternRestriction();
......
......@@ -61,6 +61,6 @@ public class RpcListenerTest {
YangTypeDef typeDef = (YangTypeDef) yangRpc.getChild();
assertThat(typeDef.getName(), is("my-type"));
assertThat(typeDef.getStatus(), is(YangStatusType.DEPRECATED));
assertThat(typeDef.getDataType().getDataType(), is(YangDataTypes.INT32));
assertThat(typeDef.getTypeDefBaseType().getDataType(), is(YangDataTypes.INT32));
}
}
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
leaf invalid-interval {
type P:hello;
}
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
list valid {
key address;
grouping endpoint {
......
......@@ -2,20 +2,23 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
grouping endpoint {
leaf address {
type ip-address;
type P:ip-address;
}
leaf port {
type port-number;
type P:port-number;
}
}
grouping endpoint {
leaf address {
type ip-address;
type P:pip-address;
}
leaf port {
type port-number;
type P:port-number;
}
}
}
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
list valid {
key address;
leaf address {
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
container valid {
grouping endpoint {
leaf address {
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
list valid {
key address;
leaf address {
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
grouping endpoint {
leaf address {
type P:ip-address;
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
typedef Percentage {
type P:Per;
}
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
typedef Percentage {
type int32;
}
......
......@@ -2,6 +2,9 @@ module Test {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
import ietf-yang-types {
prefix "P";
}
list valid {
key address;
leaf address {
......
......@@ -6,6 +6,9 @@ module Test {
import interface-module {
prefix "if";
}
import ietf-yang-types {
prefix "P";
}
augment "/if:interfaces/if:ifEntry" {
when "if:ifType='ds0'";
leaf ds0ChannelNumber {
......
......@@ -2,6 +2,9 @@ module rock {
namespace "http://example.net/rock";
prefix "rock";
import ietf-yang-types {
prefix "P";
}
notification link-failure {
description "A link failure has been detected";
status deprecated;
......