null
. null
values) the method will return
+ * (i.e. contains null
values) the method will throw
* IllegalArgumentException.
*
- * @throws IllegalArgumentException
- *
* @param context
* Schema Context
* @param schemaPath
* Schema Path to search for
* @return SchemaNode from the end of the Schema Path or null
* if the Node is not present.
+ * @throws IllegalArgumentException if context or schemaPath is not correct.
*/
public static SchemaNode findDataSchemaNode(final SchemaContext context, final SchemaPath schemaPath) {
Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
@@ -110,8 +114,6 @@ public final class SchemaContextUtil {
* method will return specified Data Schema Node, otherwise the operation
* will fail and method will return null
.
*
- * @throws IllegalArgumentException
- *
* @param context
* Schema Context
* @param module
@@ -122,19 +124,35 @@ public final class SchemaContextUtil {
* Non-conditional Revision Aware XPath, or null
if the
* DataSchemaNode is not present in Schema Context.
*/
- public static SchemaNode findDataSchemaNode(final SchemaContext context, final Module module, final RevisionAwareXPath nonCondXPath) {
+ // FIXME: This entire method is ill-defined, as the resolution process depends on where the XPath is defined --
+ // notably RPCs, actions and notifications modify the data tree temporarily. See sections 6.4.1 and 9.9.2
+ // of RFC7950.
+ //
+ // Most notably we need to understand whether the XPath is being resolved in the data tree, or as part of
+ // a notification/action/RPC, as then the SchemaContext grows tentative nodes ... which could be addressed
+ // via a derived SchemaContext (i.e. this class would have to have a
+ //
+ // SchemaContext notificationSchemaContext(SchemaContext delegate, NotificationDefinition notif)
+ //
+ // which would then be passed in to a method similar to this one. In static contexts, like MD-SAL codegen,
+ // that feels like an overkill.
+ public static SchemaNode findDataSchemaNode(final SchemaContext context, final Module module,
+ final RevisionAwareXPath nonCondXPath) {
Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
Preconditions.checkArgument(module != null, "Module reference cannot be NULL");
Preconditions.checkArgument(nonCondXPath != null, "Non Conditional Revision Aware XPath cannot be NULL");
final String strXPath = nonCondXPath.toString();
if (strXPath != null) {
- Preconditions.checkArgument(strXPath.indexOf('[') == -1, "Revision Aware XPath may not contain a condition");
+ Preconditions.checkArgument(strXPath.indexOf('[') == -1,
+ "Revision Aware XPath may not contain a condition");
if (nonCondXPath.isAbsolute()) {
- final Listnull
.
*
- * @throws IllegalArgumentException
- *
* @param context
* Schema Context
* @param module
@@ -179,6 +195,18 @@ public final class SchemaContextUtil {
* given relative Revision Aware XPath, otherwise will return
* null
.
*/
+ // FIXME: This entire method is ill-defined, as the resolution process depends on where the XPath is defined --
+ // notably RPCs, actions and notifications modify the data tree temporarily. See sections 6.4.1 and 9.9.2
+ // of RFC7950.
+ //
+ // Most notably we need to understand whether the XPath is being resolved in the data tree, or as part of
+ // a notification/action/RPC, as then the SchemaContext grows tentative nodes ... which could be addressed
+ // via a derived SchemaContext (i.e. this class would have to have a
+ //
+ // SchemaContext notificationSchemaContext(SchemaContext delegate, NotificationDefinition notif)
+ //
+ // which would then be passed in to a method similar to this one. In static contexts, like MD-SAL codegen,
+ // that feels like an overkill.
public static SchemaNode findDataSchemaNodeForRelativeXPath(final SchemaContext context, final Module module,
final SchemaNode actualSchemaNode, final RevisionAwareXPath relativeXPath) {
Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
@@ -193,9 +221,10 @@ public final class SchemaContextUtil {
if (actualNodePath != null) {
final Iterablenull
references
* the method will throw IllegalArgumentException
*
- * @throws IllegalArgumentException
- *
* @param context
* Schema Context
* @param schemaNode
* Schema Node
- * @return Yang Module for specified Schema Context and Schema Node, if
- * Schema Node is NOT present, the method will returns
- * null
+ * @return Yang Module for specified Schema Context and Schema Node, if Schema Node is NOT present, the method will
+ * return null
*/
public static Module findParentModule(final SchemaContext context, final SchemaNode schemaNode) {
Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL!");
@@ -224,39 +250,40 @@ public final class SchemaContextUtil {
+ "set properly (Schema Path is NULL)");
final QName qname = schemaNode.getPath().getLastComponent();
- Preconditions.checkState(qname != null,
- "Schema Path contains invalid state of path parts. " +
- "The Schema Path MUST contain at least ONE QName which defines namespace and Local name of path.");
- return context.findModuleByNamespaceAndRevision(qname.getNamespace(), qname.getRevision());
+ Preconditions.checkState(qname != null, "Schema Path contains invalid state of path parts. "
+ + "The Schema Path MUST contain at least ONE QName which defines namespace and Local name of path.");
+ return context.findModule(qname.getModule()).orElse(null);
}
public static SchemaNode findNodeInSchemaContext(final SchemaContext context, final Iterablenull
values, the method will throws IllegalArgumentException
*
- * @throws IllegalArgumentException
- *
* @param context
* Schema Context
* @param parentModule
@@ -464,8 +543,13 @@ public final class SchemaContextUtil {
* @param xpath
* XPath String
* @return return a list of QName
+ *
+ * @throws IllegalArgumentException if any arguments are null
+ *
*/
- private static Listnull
the method will throw IllegalArgumentException
*
- * @throws IllegalArgumentException
- *
* @param context
* Schema Context
* @param parentModule
@@ -499,8 +581,11 @@ public final class SchemaContextUtil {
* @param prefixedPathPart
* Prefixed Path Part string
* @return QName from prefixed Path Part String.
+ * @throws IllegalArgumentException if any arguments are null
*/
- private static QName stringPathPartToQName(final SchemaContext context, final Module parentModule, final String prefixedPathPart) {
+ private static QName stringPathPartToQName(final SchemaContext context, final Module parentModule,
+ final String prefixedPathPart) {
+ // FIXME: 2.0.0: this should throw NPE, not IAE
Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
Preconditions.checkArgument(parentModule != null, "Parent Module reference cannot be NULL");
Preconditions.checkArgument(prefixedPathPart != null, "Prefixed Path Part cannot be NULL!");
@@ -510,13 +595,14 @@ public final class SchemaContextUtil {
final String modulePrefix = prefixedName.next();
final Module module = resolveModuleForPrefix(context, parentModule, modulePrefix);
- Preconditions.checkArgument(module != null, "Failed to resolve xpath: no module found for prefix %s in module %s",
- modulePrefix, parentModule.getName());
+ Preconditions.checkArgument(module != null,
+ "Failed to resolve xpath: no module found for prefix %s in module %s", modulePrefix,
+ parentModule.getName());
return QName.create(module.getQNameModule(), prefixedName.next());
- } else {
- return QName.create(parentModule.getNamespace(), parentModule.getRevision(), prefixedPathPart);
}
+
+ return QName.create(parentModule.getNamespace(), parentModule.getRevision(), prefixedPathPart);
}
/**
@@ -532,8 +618,6 @@ public final class SchemaContextUtil {
* If Schema Context, Module or Prefix are referring to null
* the method will return IllegalArgumentException
*
- * @throws IllegalArgumentException
- *
* @param context
* Schema Context
* @param module
@@ -542,8 +626,11 @@ public final class SchemaContextUtil {
* Module Prefix
* @return Module for given prefix in specified Schema Context if is
* present, otherwise returns null
+ * @throws IllegalArgumentException if any arguments are null
*/
- private static Module resolveModuleForPrefix(final SchemaContext context, final Module module, final String prefix) {
+ private static Module resolveModuleForPrefix(final SchemaContext context, final Module module,
+ final String prefix) {
+ // FIXME: 2.0.0: this should throw NPE, not IAE
Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
Preconditions.checkArgument(module != null, "Module reference cannot be NULL");
Preconditions.checkArgument(prefix != null, "Prefix string cannot be NULL");
@@ -555,14 +642,14 @@ public final class SchemaContextUtil {
final Set
+ * Because {@code typeDefinition} is definied via typedef statement, only absolute path is meaningful.
+ */
+ public static TypeDefinition> getBaseTypeForLeafRef(final LeafrefTypeDefinition typeDefinition,
+ final SchemaContext schemaContext, final QName qname) {
+ final RevisionAwareXPath pathStatement = typeDefinition.getPathStatement();
+ final RevisionAwareXPath strippedPathStatement = new RevisionAwareXPathImpl(
+ stripConditionsFromXPathString(pathStatement), pathStatement.isAbsolute());
+ if (!strippedPathStatement.isAbsolute()) {
+ return null;
}
- if (nodeType instanceof ExtendedType) {
- while (nodeType.getBaseType() instanceof ExtendedType) {
- nodeType = nodeType.getBaseType();
- }
-
- QNameModule typeDefModuleQname = nodeType.getQName().getModule();
- return schemaContext.findModuleByNamespaceAndRevision(typeDefModuleQname.getNamespace(),
- typeDefModuleQname.getRevision());
- } else if (nodeType.getBaseType() != null) {
- while (nodeType.getBaseType() != null) {
- nodeType = nodeType.getBaseType();
- }
+ final Optional
- * If the Schema Node is not present in Schema Context the
- * operation will return null
.
- * If Schema Context or Schema Node contains null
references
- * the method will throw IllegalArgumentException
- *
- * @throws IllegalArgumentException
- *
- * @param schemaContext
- * Schema Context
- * @param schemaNode
- * Schema Node
- * @return Yang Module for specified Schema Context and Schema Node, if
- * Schema Node is NOT present, the method will returns
- * null
- */
- @Deprecated
- public static Module findParentModuleByType(final SchemaContext schemaContext, final SchemaNode schemaNode) {
+ private static Module findParentModuleOfReferencingType(final SchemaContext schemaContext,
+ final SchemaNode schemaNode) {
Preconditions.checkArgument(schemaContext != null, "Schema Context reference cannot be NULL!");
- Preconditions.checkArgument(schemaNode != null, "Schema Node cannot be NULL!");
- TypeDefinition> nodeType = null;
+ Preconditions.checkArgument(schemaNode instanceof TypedDataSchemaNode, "Unsupported node %s", schemaNode);
- if (schemaNode instanceof LeafSchemaNode) {
- nodeType = ((LeafSchemaNode) schemaNode).getType();
- } else if (schemaNode instanceof LeafListSchemaNode) {
- nodeType = ((LeafListSchemaNode) schemaNode).getType();
- }
-
- if (!BaseTypes.isYangBuildInType(nodeType) && nodeType.getBaseType() != null) {
- while (nodeType.getBaseType() != null && !BaseTypes.isYangBuildInType(nodeType.getBaseType())) {
+ TypeDefinition> nodeType = ((TypedDataSchemaNode) schemaNode).getType();
+ if (nodeType.getBaseType() != null) {
+ while (nodeType.getBaseType() != null) {
nodeType = nodeType.getBaseType();
}
- QNameModule typeDefModuleQname = nodeType.getQName().getModule();
-
- return schemaContext.findModuleByNamespaceAndRevision(typeDefModuleQname.getNamespace(),
- typeDefModuleQname.getRevision());
+ return schemaContext.findModule(nodeType.getQName().getModule()).orElse(null);
}
return SchemaContextUtil.findParentModule(schemaContext, schemaNode);
}
- /**
- * Returns base type for {@code typeDefinition} which belongs to module specified via {@code qName}. This handle case
- * when leafref type isn't specified as type substatement of leaf or leaf-list but is defined in other module as typedef
- * which is then imported to referenced module.
- *
- * Because {@code typeDefinition} is definied via typedef statement, only absolute path is meaningful.
- *
- * @param typeDefinition
- * @param schemaContext
- * @param qName
- * @return
- */
- public static TypeDefinition> getBaseTypeForLeafRef(final LeafrefTypeDefinition typeDefinition,
- final SchemaContext schemaContext, final QName qName) {
- final RevisionAwareXPath pathStatement = typeDefinition.getPathStatement();
- final RevisionAwareXPath strippedPathStatement = new RevisionAwareXPathImpl(stripConditionsFromXPathString(pathStatement), pathStatement.isAbsolute());
- if (!strippedPathStatement.isAbsolute()) {
- return null;
- }
-
- final Module parentModule = schemaContext.findModuleByNamespaceAndRevision(qName.getNamespace(),qName.getRevision());
- final DataSchemaNode dataSchemaNode = (DataSchemaNode) SchemaContextUtil.findDataSchemaNode(schemaContext, parentModule, strippedPathStatement);
- final TypeDefinition> targetTypeDefinition = typeDefinition(dataSchemaNode);
- if (targetTypeDefinition instanceof LeafrefTypeDefinition) {
- return getBaseTypeForLeafRef(((LeafrefTypeDefinition) targetTypeDefinition), schemaContext, dataSchemaNode);
- } else {
- return targetTypeDefinition;
- }
- }
-
private static final Pattern STRIP_PATTERN = Pattern.compile("\\[[^\\[\\]]*\\]");
/**
@@ -785,7 +807,6 @@ public final class SchemaContextUtil {
* @param pathStatement
* xPath to target node
* @return string representation of xPath without conditions
- *
*/
@VisibleForTesting
static String stripConditionsFromXPathString(final RevisionAwareXPath pathStatement) {
@@ -835,7 +856,7 @@ public final class SchemaContextUtil {
} else if (node instanceof LeafSchemaNode) {
return typeDefinition((LeafSchemaNode) node);
} else {
- throw new IllegalArgumentException("Unhandled parameter types: " + Collections.