YANG Grouping Linker Support
Change-Id: I2fec0c0bb4d1584e82ffba3228106897ccad2bf5
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/Resolvable.java b/src/main/java/org/onosproject/yangutils/datamodel/Resolvable.java
index 5e837a2..ab3462f 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/Resolvable.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/Resolvable.java
@@ -26,7 +26,7 @@
* 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 @@
* 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
*/
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/ResolvableStatus.java b/src/main/java/org/onosproject/yangutils/datamodel/ResolvableStatus.java
index 71b4e20..2514441 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/ResolvableStatus.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/ResolvableStatus.java
@@ -22,17 +22,24 @@
public enum ResolvableStatus {
/**
- * Identifies that resolvable entity is resolved.
- */
- RESOLVED,
-
- /**
* Identifies that resolvable entity is unresolved.
*/
UNRESOLVED,
/**
- * Identifies that resolvable entity is partially resolved.
+ * Identifies that resolvable entity's reference is linked.
*/
- PARTIALLY_RESOLVED;
+ LINKED,
+
+ /**
+ * Identifies that resolvable entity is IntraFile resolved (i.e. complete
+ * linking with in the intra file).
+ */
+ INTRA_FILE_RESOLVED,
+
+ /**
+ * Identifies that resolvable entity is resolved.
+ */
+ RESOLVED;
+
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java b/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
index 374e2ab..adac640 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
@@ -75,6 +75,7 @@
* | when | 7.19.5 | 0..1 |-TODO |
* +--------------+---------+-------------+------------------+
*/
+
/**
* Representation of data model node to maintain information defined in YANG augment.
*/
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangEntityToResolveInfo.java b/src/main/java/org/onosproject/yangutils/datamodel/YangEntityToResolveInfo.java
new file mode 100644
index 0000000..7e3d819
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangEntityToResolveInfo.java
@@ -0,0 +1,85 @@
+/*
+ * 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;
+ }
+}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangImport.java b/src/main/java/org/onosproject/yangutils/datamodel/YangImport.java
index b079d3f..4ab3f2a 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangImport.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangImport.java
@@ -59,10 +59,12 @@
* | 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 @@
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
@@ -118,7 +115,7 @@
* Returns the prefix used to identify the entities from the imported module.
*
* @return the prefix used to identify the entities from the imported
- * module
+ * module
*/
public String getPrefixId() {
return prefixId;
@@ -167,7 +164,8 @@
* @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 @@
* @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;
- }
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangInclude.java b/src/main/java/org/onosproject/yangutils/datamodel/YangInclude.java
index 9010368..4892613 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangInclude.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangInclude.java
@@ -33,10 +33,12 @@
* | 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 @@
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 @@
* @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 @@
* @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;
- }
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangResolutionInfo.java b/src/main/java/org/onosproject/yangutils/datamodel/YangResolutionInfo.java
index b6c2f7c..c9c0064 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangResolutionInfo.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangResolutionInfo.java
@@ -20,19 +20,22 @@
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 @@
// 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 @@
* 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);
+ // Push the initial entity to resolve in stack.
+ addInPartialResolvedStack(getEntityToResolveInfo());
- // Get holder of entity to resolve
- YangNode curNode = getHolderOfEntityToResolve();
-
- 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;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+ break;
+ }
+ default: {
+ throw new DataModelException("Data Model Exception: Unsupported, linker state");
+ }
+
+ }
+
+ } else {
+ throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
- curNode = curNode.getParent();
+
}
- // 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");
- dataModelException.setLine(getLineNumber());
- dataModelException.setCharPosition(getCharPosition());
- throw dataModelException;
+ }
+
+ /**
+ * Resolve the current entity in the stack.
+ */
+ private void resolveTopOfStack() {
+ ((Resolvable) getCurrentEntityToResolveFromStack()).resolve();
+
+ 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.
*
- * @param node current node
- * @param parentNode parent node of current node
- * @return flag to indicate whether resolution is done
- * @throws DataModelException
+ * @throws DataModelException data model error
*/
- private boolean resolveLinkingForNodesChildAndSibling(YangNode node, YangNode parentNode)
+ private void linkTopOfStackReferenceUpdateStack()
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;
- }
- }
- 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();
- }
+
+ if (!isSelfFileReference()) {
+ /*
+ * TODO: use mojo utilities to load the referred module/sub-module
+ * and get the reference to the corresponding referred entity
+ */
+
+ ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(INTRA_FILE_RESOLVED);
+ return;
}
- 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
- */
- private boolean resolveLinkingForNode(YangNode node, YangNode parentNode) throws DataModelException {
-
- /*
- * Check if name of node name matches with the entity name under
- * resolution.
+ /**
+ * Try to resolve the top of the stack and update partial resolved stack
+ * if there is recursive references
*/
- 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.
+ YangNode potentialAncestorWithReferredNode = getPartialResolvedStack().peek()
+ .getHolderOfEntityToResolve();
+
+ /**
+ * Traverse up in the ancestor tree to check if the referred node is
+ * defined
+ */
+ while (potentialAncestorWithReferredNode != null) {
+
+ /**
+ * Check for the referred node defined in a ancestor scope
+ */
+ YangNode potentialReferredNode = potentialAncestorWithReferredNode.getChild();
+ if (isReferredNodeInSiblingListProcessed(potentialReferredNode)) {
+ return;
+ }
+
+ potentialAncestorWithReferredNode = potentialAncestorWithReferredNode.getParent();
+ }
+ }
+
+ /**
+ * 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 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 (prefix == null) {
+ return true;
+ }
+ return prefix.contentEquals(resolutionInfoRootNodePrefix);
+
+ }
+
+ /**
+ * Check for the referred node defined in a ancestor scope.
+ *
+ * @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 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);
+
+ /**
+ * resolve the reference and update the partial resolution stack
+ * with any further recursive references
*/
- if (isReferenceFullyResolved()) {
- // Resolve the stack which is complete.
- resolveCompleteStack();
- return true;
- } else if (isReferencePartiallyResolved()) {
- /*
- * Update the resolution type to partially resolved for all
- * type/uses in stack
- */
- 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.
- */
- if (isExternalPrefixPresent(node)) {
- /*
- * Update the resolution type to partially resolved for
- * all type/uses in stack
- */
- 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.
- */
- isMoreReferenceDetected = true;
- return false;
- }
- }
+ addUnresolvedRecursiveReferenceToStack(potentialReferredNode);
+
+ /*
+ * return true, since the reference is linked and any recursive
+ * unresolved references is added to the stack
+ */
+ return true;
}
+
+ potentialReferredNode = potentialReferredNode.getNextSibling();
}
return false;
}
/**
- * Update resolution type to partial for all type/uses in stack.
+ * Check if the potential referred node is the actual referred node.
*
- * @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)) {
- 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());
- }
- // Don't add to stack in case of YANG grouping.
-
- // Resolve the complete stack.
- resolveCompleteStack();
- }
-
- /**
- * Check if the referred type/uses is partially resolved.
- *
- * @return true if reference is partially resolved, otherwise false
- */
- 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;
- }
-
- /**
- * Check if the referred type/uses is resolved.
- *
- * @return true if reference is resolved, otherwise false
- */
- private boolean isReferenceFullyResolved() {
- if (getPartialResolvedStack().peek() instanceof YangType) {
- /*
- * Checks if type is partially resolved.
- */
- if (((YangType) getPartialResolvedStack().peek()).getResolvableStatus() == ResolvableStatus.RESOLVED) {
- return true;
- }
- } else if (getPartialResolvedStack().peek() instanceof YangUses) {
- if (((YangUses) getPartialResolvedStack().peek()).getResolvableStatus() == ResolvableStatus.RESOLVED) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Check if node is of resolve type i.e. of type typedef or grouping.
- *
- * @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 @@
* 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 @@
/**
* 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 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 referredNode grouping/typedef node
+ * @throws DataModelException a violation of data model rules
+ */
+ private void addUnresolvedRecursiveReferenceToStack(YangNode referredNode)
+ throws DataModelException {
+ if (getCurrentEntityToResolveFromStack() instanceof YangType) {
+ /*
+ * Checks if typedef type is derived
+ */
+ if (((YangTypeDef) referredNode).getTypeDefBaseType().getDataType()
+ == YangDataTypes.DERIVED) {
+
+ YangEntityToResolveInfo<YangType<?>> unResolvedEntityInfo = new YangEntityToResolveInfo<YangType<?>>();
+ unResolvedEntityInfo.setEntityToResolve(((YangTypeDef) referredNode)
+ .getTypeDefBaseType());
+ unResolvedEntityInfo.setHolderOfEntityToResolve(referredNode);
+ addInPartialResolvedStack((YangEntityToResolveInfo<T>) unResolvedEntityInfo);
+ }
+
+ } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
+ /*
+ * Search if the grouping has any un resolved uses child, if so
+ * return true, else return false.
+ */
+ addUnResolvedUsesToStack(referredNode);
} else {
throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
}
}
/**
- * Checks if typedef/grouping has further reference to type/typedef.
+ * Return if there is any unresolved uses in grouping.
*
* @param node grouping/typedef node
- * @return true if referred entity is resolved, otherwise false
- * @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) {
- /*
- * Search if the grouping has any uses child, if so return false,
- * else return true.
- */
- if (getUsesInGrouping(node) == null) {
- return false;
- }
- } else {
- throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
- }
- return true;
- }
+ private void addUnResolvedUsesToStack(YangNode node) {
- /**
- * 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();
+ /**
+ * Search the grouping node's children for presence of uses node.
+ */
+ YangNode curNode = node.getChild();
while (curNode != null) {
if (curNode instanceof YangUses) {
- break;
+ ResolvableStatus curResolveStatus = ((Resolvable) curNode).getResolvableStatus();
+ if (curResolveStatus == UNRESOLVED) {
+ /**
+ * The current uses is not resolved, add it to partial
+ * resolved stack
+ */
+ YangEntityToResolveInfo<YangUses> unResolvedEntityInfo = new YangEntityToResolveInfo<YangUses>();
+ unResolvedEntityInfo.setEntityToResolve((YangUses) curNode);
+ unResolvedEntityInfo.setHolderOfEntityToResolve(node);
+ addInPartialResolvedStack((YangEntityToResolveInfo<T>) unResolvedEntityInfo);
+
+ }
}
curNode = curNode.getNextSibling();
}
- return (YangUses) curNode;
- }
- /**
- * 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);
- }
- /*
- * 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
- */
- 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));
- } else {
- throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
- }
- }
-
- /**
- * Check if prefix is associated with type/uses.
- *
- * @param node typedef/grouping node
- * @return true if prefix is present, otherwise false
- * @throws DataModelException a violation of data model rules
- */
- 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;
- }
-
- /**
- * Returns prefix of imported module.
- *
- * @return prefix of imported module
- */
- public String getPrefix() {
- return prefix;
- }
-
- /**
- * Sets prefix of imported module.
- *
- * @param prefix of imported module
- */
- public void setPrefix(String prefix) {
- this.prefix = prefix;
- }
-
- /**
- * 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;
- }
-
- /**
- * 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,29 +490,12 @@
}
/**
- * Returns status of resolution.
- *
- * @return resolution status
- */
- public boolean isResolved() {
- return isResolved;
- }
-
- /**
- * Sets status of resolution.
- *
- * @param isResolved resolution status
- */
- public void setIsResolved(boolean isResolved) {
- this.isResolved = isResolved;
- }
-
- /**
- * Returns stack of YANG type with partially resolved YANG construct hierarchy.
+ * Returns stack of YANG type with partially resolved YANG construct
+ * hierarchy.
*
* @return partial resolved YANG construct stack
*/
- public Stack<T> getPartialResolvedStack() {
+ private Stack<YangEntityToResolveInfo<T>> getPartialResolvedStack() {
return partialResolvedStack;
}
@@ -632,7 +504,45 @@
*
* @param partialResolvedStack partial resolved YANG construct stack
*/
- public void setPartialResolvedStack(Stack<T> partialResolvedStack) {
+ private void setPartialResolvedStack(Stack<YangEntityToResolveInfo<T>> partialResolvedStack) {
this.partialResolvedStack = partialResolvedStack;
}
+
+ /**
+ * Sets stack of YANG type with partially resolved YANG construct hierarchy.
+ *
+ * @param partialResolvedInfo partial resolved YANG construct stack
+ */
+ private void addInPartialResolvedStack(YangEntityToResolveInfo<T> partialResolvedInfo) {
+ getPartialResolvedStack().push(partialResolvedInfo);
+ }
+
+ /**
+ * 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.
+ *
+ * @return next entity in the stack that needs to be resolved
+ */
+ 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;
+ }
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangRpc.java b/src/main/java/org/onosproject/yangutils/datamodel/YangRpc.java
index 15a6626..ce8b632 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangRpc.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangRpc.java
@@ -104,9 +104,9 @@
@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() + "\"");
}
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangType.java b/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
index 37d8a05..5b18fac 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
@@ -20,6 +20,8 @@
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 @@
*
* @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 @@
* 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 @@
* @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 @@
* @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 @@
@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:
}
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java b/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
index 7b0204c..35998d4 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
@@ -179,7 +179,7 @@
*
* @return the data type
*/
- public YangType<?> getDataType() {
+ public YangType<?> getTypeDefBaseType() {
return dataType;
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangUnion.java b/src/main/java/org/onosproject/yangutils/datamodel/YangUnion.java
index 21aabc0..c75068c 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangUnion.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangUnion.java
@@ -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.
*
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java b/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
index c4025b6..22b9700 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
@@ -48,10 +48,13 @@
* | 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 @@
* 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 @@
* @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 @@
* @throws DataModelException a violation of data model rules
*/
@Override
- public void validateDataOnExit() throws DataModelException {
+ public void validateDataOnExit()
+ throws DataModelException {
// TODO auto-generated method stub, to be implemented by parser
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java b/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
index 76e8f36..643eda5 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
@@ -20,6 +20,7 @@
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.exceptions.DataModelException;
import org.onosproject.yangutils.utils.YangConstructType;
+
/**
* Represents utilities for data model tree.
*/
@@ -43,7 +45,7 @@
* Detects the colliding identifier name in a given YANG node and its child.
*
* @param identifierName name for which collision detection is to be
- * checked
+ * 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,7 +79,7 @@
*
* @param leavesHolder leaves node against which collision to be checked
* @param identifierName name for which collision detection is to be
- * checked
+ * checked
* @throws DataModelException a violation of data model rules
*/
private static void detectCollidingLeaf(YangLeavesHolder leavesHolder, String identifierName)
@@ -96,7 +98,7 @@
*
* @param leavesHolder leaves node against which collision to be checked
* @param identifierName name for which collision detection is to be
- * checked
+ * checked
* @throws DataModelException a violation of data model rules
*/
private static void detectCollidingLeafList(YangLeavesHolder leavesHolder, String identifierName)
@@ -114,13 +116,17 @@
* Add a resolution information.
*
* @param resolutionInfo information about the YANG construct which has to
- * be resolved
+ * 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 @@
}
}
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());
}
}
}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java b/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
index 6edd6a6..03d82d1 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/utils/YangDataModelFactory.java
@@ -20,6 +20,7 @@
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.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 @@
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 @@
* 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: {