X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2FSchemaNodeIdentifierBuildNamespace.java;h=5fdf765ab1d7677d1aa4e8ef9a2f177cd3809d33;hb=17f092cc375493891b15139cc0f57584298ba18e;hp=bee80c9ba0ba67d012d3289c22c89470ef1664ff;hpb=ea2f209fe116f2d90e48238906a2f3b24ed455c4;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SchemaNodeIdentifierBuildNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SchemaNodeIdentifierBuildNamespace.java index bee80c9ba0..5fdf765ab1 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SchemaNodeIdentifierBuildNamespace.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SchemaNodeIdentifierBuildNamespace.java @@ -8,17 +8,21 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import java.util.Collection; import java.util.Iterator; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; +import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedNamespaceBehaviour; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; class SchemaNodeIdentifierBuildNamespace extends - DerivedNamespaceBehaviour>, SchemaNodeIdentifierBuildNamespace, ChildSchemaNodes> + DerivedNamespaceBehaviour>, QName, SchemaNodeIdentifierBuildNamespace, ChildSchemaNodes> implements IdentifierNamespace>> { @SuppressWarnings({"unchecked", "rawtypes"}) @@ -32,6 +36,7 @@ class SchemaNodeIdentifierBuildNamespace extends throw new UnsupportedOperationException("Direct access to namespace is not supported"); } + @SuppressWarnings("unchecked") @Override public StmtContext.Mutable> getFrom(NamespaceStorageNode storage, SchemaNodeIdentifier key) { @@ -49,11 +54,41 @@ class SchemaNodeIdentifierBuildNamespace extends return null; } } - StmtContext.Mutable> current = (StmtContext.Mutable>) lookupStartStorage.getFromLocalStorage(ChildSchemaNodes.class, iterator.next()); - while(current != null && iterator.hasNext()) { - current = (StmtContext.Mutable>) current.getFromNamespace(ChildSchemaNodes.class, iterator.next()); + QName nextPath = iterator.next(); + StmtContext.Mutable> current = (StmtContext.Mutable>) lookupStartStorage + .getFromLocalStorage(ChildSchemaNodes.class, nextPath); + if(current == null && lookupStartStorage instanceof StmtContext) { + return tryToFindUnknownStatement(nextPath.getLocalName(), (Mutable>) lookupStartStorage); + } + while (current != null && iterator.hasNext()) { + nextPath = iterator.next(); + StmtContext.Mutable> nextNodeCtx = (StmtContext.Mutable>) current + .getFromNamespace(ChildSchemaNodes.class, nextPath); + if (nextNodeCtx == null) { + return tryToFindUnknownStatement(nextPath.getLocalName(), current); + } else { + current = nextNodeCtx; + } } return current; } + @SuppressWarnings("unchecked") + private Mutable> tryToFindUnknownStatement(final String localName, + final Mutable> current) { + Collection> unknownSubstatements = StmtContextUtils.findAllSubstatements(current, + UnknownStatement.class); + for (StmtContext unknownSubstatement : unknownSubstatements) { + if(unknownSubstatement.rawStatementArgument().equals(localName)) { + return (Mutable>) unknownSubstatement; + } + } + return null; + } + + @Override + public QName getSignificantKey(SchemaNodeIdentifier key) { + return key.getLastComponent(); + } + }