*/
package org.opendaylight.yangtools.yang.model.util;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
import com.google.common.annotations.Beta;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Pattern;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
+import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
import org.opendaylight.yangtools.yang.model.api.ModuleImport;
import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.NotificationNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
+import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * The Schema Context Util contains support methods for searching through Schema
- * Context modules for specified schema nodes via Schema Path or Revision Aware
- * XPath. The Schema Context Util is designed as mixin, so it is not
+ * The Schema Context Util contains support methods for searching through Schema Context modules for specified schema
+ * nodes via Schema Path or Revision Aware XPath. The Schema Context Util is designed as mixin, so it is not
* instantiable.
- *
*/
public final class SchemaContextUtil {
private static final Logger LOG = LoggerFactory.getLogger(SchemaContextUtil.class);
* @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");
- Preconditions.checkArgument(schemaPath != null, "Schema Path reference cannot be NULL");
+ checkArgument(context != null, "Schema Context reference cannot be NULL");
+ checkArgument(schemaPath != null, "Schema Path reference cannot be NULL");
final Iterable<QName> prefixedPath = schemaPath.getPathFromRoot();
if (prefixedPath == null) {
* Non-conditional Revision Aware XPath, or <code>null</code> if the
* DataSchemaNode is not present in Schema Context.
*/
+ // 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");
+ checkArgument(context != null, "Schema Context reference cannot be NULL");
+ checkArgument(module != null, "Module reference cannot be NULL");
+ 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");
+ checkArgument(strXPath.indexOf('[') == -1, "Revision Aware XPath may not contain a condition");
if (nonCondXPath.isAbsolute()) {
- final List<QName> qnamedPath = xpathToQNamePath(context, module, strXPath);
- if (qnamedPath != null) {
- return findNodeInSchemaContext(context, qnamedPath);
- }
+ final List<QName> path = xpathToQNamePath(context, module, strXPath);
+
+ // We do not have enough information about resolution context, hence cannot account for actions, RPCs
+ // and notifications. We therefore attempt to make a best estimate, but this can still fail.
+ final Optional<DataSchemaNode> pureData = context.findDataTreeChild(path);
+ return pureData.isPresent() ? pureData.get() : findNodeInSchemaContext(context, path);
}
}
return null;
* given relative Revision Aware XPath, otherwise will return
* <code>null</code>.
*/
+ // 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");
- Preconditions.checkArgument(module != null, "Module reference cannot be NULL");
- Preconditions.checkArgument(actualSchemaNode != null, "Actual Schema Node reference cannot be NULL");
- Preconditions.checkArgument(relativeXPath != null, "Non Conditional Revision Aware XPath cannot be NULL");
- Preconditions.checkState(!relativeXPath.isAbsolute(),
- "Revision Aware XPath MUST be relative i.e. MUST contains ../, "
- + "for non relative Revision Aware XPath use findDataSchemaNode method");
+ checkArgument(context != null, "Schema Context reference cannot be NULL");
+ checkArgument(module != null, "Module reference cannot be NULL");
+ checkArgument(actualSchemaNode != null, "Actual Schema Node reference cannot be NULL");
+ checkArgument(relativeXPath != null, "Non Conditional Revision Aware XPath cannot be NULL");
+ checkState(!relativeXPath.isAbsolute(), "Revision Aware XPath MUST be relative i.e. MUST contains ../, "
+ + "for non relative Revision Aware XPath use findDataSchemaNode method");
final SchemaPath actualNodePath = actualSchemaNode.getPath();
if (actualNodePath != null) {
final Iterable<QName> qnamePath = resolveRelativeXPath(context, module, relativeXPath, actualSchemaNode);
- if (qnamePath != null) {
- return findNodeInSchemaContext(context, qnamePath);
- }
+ // We do not have enough information about resolution context, hence cannot account for actions, RPCs
+ // and notifications. We therefore attempt to make a best estimate, but this can still fail.
+ final Optional<DataSchemaNode> pureData = context.findDataTreeChild(qnamePath);
+ return pureData.isPresent() ? pureData.get() : findNodeInSchemaContext(context, qnamePath);
}
return null;
}
* return <code>null</code>
*/
public static Module findParentModule(final SchemaContext context, final SchemaNode schemaNode) {
- Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL!");
- Preconditions.checkArgument(schemaNode != null, "Schema Node cannot be NULL!");
- Preconditions.checkState(schemaNode.getPath() != null, "Schema Path for Schema Node is not "
- + "set properly (Schema Path is NULL)");
+ checkArgument(context != null, "Schema Context reference cannot be NULL!");
+ checkArgument(schemaNode != null, "Schema Node cannot be NULL!");
+ checkState(schemaNode.getPath() != null, "Schema Path for Schema Node is not set properly (Schema Path is "
+ + "NULL)");
final QName qname = schemaNode.getPath().getLastComponent();
- Preconditions.checkState(qname != null, "Schema Path contains invalid state of path parts. "
+ 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());
+ return context.findModule(qname.getModule()).orElse(null);
}
public static SchemaNode findNodeInSchemaContext(final SchemaContext context, final Iterable<QName> path) {
final QName current = path.iterator().next();
LOG.trace("Looking up module {} in context {}", current, path);
- final Module module = context.findModuleByNamespaceAndRevision(current.getNamespace(), current.getRevision());
- if (module == null) {
+ final Optional<Module> module = context.findModule(current.getModule());
+ if (!module.isPresent()) {
LOG.debug("Module {} not found", current);
return null;
}
- return findNodeInModule(module, path);
+ return findNodeInModule(module.get(), path);
}
/**
* @return Notification schema or null, if notification is not present in schema context.
*/
@Beta
- @Nullable
- public static NotificationDefinition getNotificationSchema(@Nonnull final SchemaContext schema,
- @Nonnull final SchemaPath path) {
- Preconditions.checkNotNull(schema, "Schema context must not be null.");
- Preconditions.checkNotNull(path, "Schema path must not be null.");
+ public static @Nullable NotificationDefinition getNotificationSchema(final @NonNull SchemaContext schema,
+ final @NonNull SchemaPath path) {
+ requireNonNull(schema, "Schema context must not be null.");
+ requireNonNull(path, "Schema path must not be null.");
for (final NotificationDefinition potential : schema.getNotifications()) {
if (path.equals(potential.getPath())) {
return potential;
* @return Notification schema or null, if notification is not present in schema context.
*/
@Beta
- @Nullable
- public static ContainerSchemaNode getRpcDataSchema(@Nonnull final SchemaContext schema,
- @Nonnull final SchemaPath path) {
- Preconditions.checkNotNull(schema, "Schema context must not be null.");
- Preconditions.checkNotNull(path, "Schema path must not be null.");
+ public static @Nullable ContainerSchemaNode getRpcDataSchema(final @NonNull SchemaContext schema,
+ final @NonNull SchemaPath path) {
+ requireNonNull(schema, "Schema context must not be null.");
+ requireNonNull(path, "Schema path must not be null.");
final Iterator<QName> it = path.getPathFromRoot().iterator();
- Preconditions.checkArgument(it.hasNext(), "Rpc must have QName.");
+ checkArgument(it.hasNext(), "Rpc must have QName.");
final QName rpcName = it.next();
- Preconditions.checkArgument(it.hasNext(), "input or output must be part of path.");
+ checkArgument(it.hasNext(), "input or output must be part of path.");
final QName inOrOut = it.next();
for (final RpcDefinition potential : schema.getOperations()) {
if (rpcName.equals(potential.getQName())) {
* @param context SchemaContext to be examined
* @return Set of ModuleIdentifiers.
*/
- public static Set<ModuleIdentifier> getConstituentModuleIdentifiers(final SchemaContext context) {
- final Set<ModuleIdentifier> ret = new HashSet<>();
+ public static Set<SourceIdentifier> getConstituentModuleIdentifiers(final SchemaContext context) {
+ final Set<SourceIdentifier> ret = new HashSet<>();
for (Module module : context.getModules()) {
ret.add(moduleToIdentifier(module));
return ret;
}
- private static ModuleIdentifier moduleToIdentifier(final Module module) {
- return ModuleIdentifierImpl.create(module.getName(), Optional.of(module.getNamespace()),
- Optional.of(module.getRevision()));
+ private static SourceIdentifier moduleToIdentifier(final Module module) {
+ return RevisionSourceIdentifier.create(module.getName(), module.getRevision());
}
private static SchemaNode findNodeInModule(final Module module, final Iterable<QName> path) {
-
- Preconditions.checkArgument(module != null, "Parent reference cannot be NULL");
- Preconditions.checkArgument(path != null, "Path reference cannot be NULL");
+ checkArgument(module != null, "Parent reference cannot be NULL");
+ checkArgument(path != null, "Path reference cannot be NULL");
if (!path.iterator().hasNext()) {
LOG.debug("No node matching {} found in node {}", path, module);
}
private static SchemaNode findNodeIn(final SchemaNode parent, final Iterable<QName> path) {
-
- Preconditions.checkArgument(parent != null, "Parent reference cannot be NULL");
- Preconditions.checkArgument(path != null, "Path reference cannot be NULL");
+ checkArgument(parent != null, "Parent reference cannot be NULL");
+ checkArgument(path != null, "Path reference cannot be NULL");
if (!path.iterator().hasNext()) {
LOG.debug("No node matching {} found in node {}", path, parent);
}
}
- if (foundNode == null && parent instanceof RpcDefinition) {
- final RpcDefinition parentRpcDefinition = (RpcDefinition) parent;
+ if (foundNode == null && parent instanceof ActionNodeContainer) {
+ foundNode = ((ActionNodeContainer) parent).getActions().stream()
+ .filter(act -> current.equals(act.getQName())).findFirst().orElse(null);
+ if (foundNode != null && nextPath.iterator().hasNext()) {
+ foundNode = findNodeIn(foundNode, nextPath);
+ }
+ }
+
+ if (foundNode == null && parent instanceof NotificationNodeContainer) {
+ foundNode = ((NotificationNodeContainer) parent).getNotifications().stream()
+ .filter(notif -> current.equals(notif.getQName())).findFirst().orElse(null);
+ if (foundNode != null && nextPath.iterator().hasNext()) {
+ foundNode = findNodeIn(foundNode, nextPath);
+ }
+ }
+
+ if (foundNode == null && parent instanceof OperationDefinition) {
+ final OperationDefinition parentRpcDefinition = (OperationDefinition) parent;
if (current.getLocalName().equals("input")) {
foundNode = parentRpcDefinition.getInput();
if (foundNode == null) {
// fallback that tries to map into one of the child cases
- for (final ChoiceCaseNode caseNode : ((ChoiceSchemaNode) parent).getCases()) {
+ for (final CaseSchemaNode caseNode : ((ChoiceSchemaNode) parent).getCases().values()) {
final DataSchemaNode maybeChild = caseNode.getDataChildByName(current);
if (maybeChild != null) {
foundNode = findNodeIn(maybeChild, nextPath);
return null;
}
- private static GroupingDefinition getGroupingByName(final RpcDefinition rpc, final QName name) {
+ private static GroupingDefinition getGroupingByName(final OperationDefinition rpc, final QName name) {
for (final GroupingDefinition grouping : rpc.getGroupings()) {
if (grouping.getQName().equals(name)) {
return grouping;
*/
private static List<QName> xpathToQNamePath(final SchemaContext context, final Module parentModule,
final String xpath) {
- // 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(xpath != null, "XPath string reference cannot be NULL");
+ // FIXME: 3.0.0: this should throw NPE, not IAE
+ checkArgument(context != null, "Schema Context reference cannot be NULL");
+ checkArgument(parentModule != null, "Parent Module reference cannot be NULL");
+ checkArgument(xpath != null, "XPath string reference cannot be NULL");
final List<QName> path = new LinkedList<>();
for (final String pathComponent : SLASH_SPLITTER.split(xpath)) {
* If Schema Context, Parent Module or Prefixed Path Part refers to
* <code>null</code> the method will throw IllegalArgumentException
*
- * @param context
- * Schema Context
- * @param parentModule
- * Parent Module
- * @param prefixedPathPart
- * Prefixed Path Part string
+ * @param context Schema Context
+ * @param parentModule Parent Module
+ * @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) {
- // 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!");
+ // FIXME: 3.0.0: this should throw NPE, not IAE
+ checkArgument(context != null, "Schema Context reference cannot be NULL");
+ checkArgument(parentModule != null, "Parent Module reference cannot be NULL");
+ checkArgument(prefixedPathPart != null, "Prefixed Path Part cannot be NULL!");
if (prefixedPathPart.indexOf(':') != -1) {
final Iterator<String> prefixedName = COLON_SPLITTER.split(prefixedPathPart).iterator();
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());
+ 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());
}
}
/**
- * Method will attempt to resolve and provide Module reference for specified
- * module prefix. Each Yang module could contains multiple imports which
- * MUST be associated with corresponding module prefix. The method simply
- * looks into module imports and returns the module that is bounded with
- * specified prefix. If the prefix is not present in module or the prefixed
- * module is not present in specified Schema Context, the method will return
- * <code>null</code>. <br>
- * If String prefix is the same as prefix of the specified Module the
- * reference to this module is returned. <br>
- * If Schema Context, Module or Prefix are referring to <code>null</code>
- * the method will return IllegalArgumentException
+ * Method will attempt to resolve and provide Module reference for specified module prefix. Each Yang module could
+ * contains multiple imports which MUST be associated with corresponding module prefix. The method simply looks into
+ * module imports and returns the module that is bounded with specified prefix. If the prefix is not present
+ * in module or the prefixed module is not present in specified Schema Context, the method will return {@code null}.
+ * <br>
+ * If String prefix is the same as prefix of the specified Module the reference to this module is returned.<br>
+ * If Schema Context, Module or Prefix are referring to {@code null} the method will throw IllegalArgumentException.
*
- * @param context
- * Schema Context
- * @param module
- * Yang Module
- * @param prefix
- * Module Prefix
- * @return Module for given prefix in specified Schema Context if is
- * present, otherwise returns <code>null</code>
+ * @param context Schema Context
+ * @param module Yang Module
+ * @param prefix Module Prefix
+ * @return Module for given prefix in specified Schema Context if is present, otherwise returns <code>null</code>
* @throws IllegalArgumentException if any arguments are null
*/
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");
+ // FIXME: 3.0.0: this should throw NPE, not IAE
+ checkArgument(context != null, "Schema Context reference cannot be NULL");
+ checkArgument(module != null, "Module reference cannot be NULL");
+ checkArgument(prefix != null, "Prefix string cannot be NULL");
if (prefix.equals(module.getPrefix())) {
return module;
final Set<ModuleImport> imports = module.getImports();
for (final ModuleImport mi : imports) {
if (prefix.equals(mi.getPrefix())) {
- return context.findModuleByName(mi.getModuleName(), mi.getRevision());
+ return context.findModule(mi.getModuleName(), mi.getRevision()).orElse(null);
}
}
return null;
*/
private static Iterable<QName> resolveRelativeXPath(final SchemaContext context, final Module module,
final RevisionAwareXPath relativeXPath, final SchemaNode actualSchemaNode) {
- // 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(relativeXPath != null, "Non Conditional Revision Aware XPath cannot be NULL");
- Preconditions.checkState(!relativeXPath.isAbsolute(),
- "Revision Aware XPath MUST be relative i.e. MUST contains ../, "
- + "for non relative Revision Aware XPath use findDataSchemaNode method");
- Preconditions.checkState(actualSchemaNode.getPath() != null,
+ // FIXME: 3.0.0: this should throw NPE, not IAE
+ checkArgument(context != null, "Schema Context reference cannot be NULL");
+ checkArgument(module != null, "Module reference cannot be NULL");
+ checkArgument(relativeXPath != null, "Non Conditional Revision Aware XPath cannot be NULL");
+ checkState(!relativeXPath.isAbsolute(), "Revision Aware XPath MUST be relative i.e. MUST contains ../, "
+ + "for non relative Revision Aware XPath use findDataSchemaNode method");
+ checkState(actualSchemaNode.getPath() != null,
"Schema Path reference for Leafref cannot be NULL");
final Iterable<String> xpaths = SLASH_SPLITTER.split(relativeXPath.toString());
return null;
}
- final Module parentModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(),
- qname.getRevision());
+ final Optional<Module> parentModule = schemaContext.findModule(qname.getModule());
+ checkArgument(parentModule.isPresent(), "Failed to find parent module for %s", qname);
+
final DataSchemaNode dataSchemaNode = (DataSchemaNode) SchemaContextUtil.findDataSchemaNode(schemaContext,
- parentModule, strippedPathStatement);
+ parentModule.get(), strippedPathStatement);
final TypeDefinition<?> targetTypeDefinition = typeDefinition(dataSchemaNode);
if (targetTypeDefinition instanceof LeafrefTypeDefinition) {
return getBaseTypeForLeafRef((LeafrefTypeDefinition) targetTypeDefinition, schemaContext, dataSchemaNode);
private static Module findParentModuleOfReferencingType(final SchemaContext schemaContext,
final SchemaNode schemaNode) {
- Preconditions.checkArgument(schemaContext != null, "Schema Context reference cannot be NULL!");
- Preconditions.checkArgument(schemaNode instanceof TypedSchemaNode, "Unsupported node %s", schemaNode);
+ checkArgument(schemaContext != null, "Schema Context reference cannot be NULL!");
+ checkArgument(schemaNode instanceof TypedDataSchemaNode, "Unsupported node %s", schemaNode);
- TypeDefinition<?> nodeType = ((TypedSchemaNode) schemaNode).getType();
+ TypeDefinition<?> nodeType = ((TypedDataSchemaNode) schemaNode).getType();
if (nodeType.getBaseType() != null) {
while (nodeType.getBaseType() != null) {
nodeType = nodeType.getBaseType();
}
- final 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);