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<SchemaNodeIdentifier, StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>>, QName, SchemaNodeIdentifierBuildNamespace, ChildSchemaNodes<?, ?>>
throw new UnsupportedOperationException("Direct access to namespace is not supported");
}
+ @SuppressWarnings("unchecked")
@Override
public StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>> getFrom(NamespaceStorageNode storage, SchemaNodeIdentifier key) {
return null;
}
}
- StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>> current = (StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>>) lookupStartStorage.getFromLocalStorage(ChildSchemaNodes.class, iterator.next());
- while(current != null && iterator.hasNext()) {
- current = (StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>>) current.getFromNamespace(ChildSchemaNodes.class, iterator.next());
+ QName nextPath = iterator.next();
+ StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>> current = (StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>>) lookupStartStorage
+ .getFromLocalStorage(ChildSchemaNodes.class, nextPath);
+ if(current == null && lookupStartStorage instanceof StmtContext<?, ?, ?>) {
+ return tryToFindUnknownStatement(nextPath.getLocalName(), (Mutable<?, ?, EffectiveStatement<?, ?>>) lookupStartStorage);
+ }
+ while (current != null && iterator.hasNext()) {
+ nextPath = iterator.next();
+ StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>> nextNodeCtx = (StmtContext.Mutable<?, ?, EffectiveStatement<?, ?>>) current
+ .getFromNamespace(ChildSchemaNodes.class, nextPath);
+ if (nextNodeCtx == null) {
+ return tryToFindUnknownStatement(nextPath.getLocalName(), current);
+ } else {
+ current = nextNodeCtx;
+ }
}
return current;
}
+ @SuppressWarnings("unchecked")
+ private Mutable<?, ?, EffectiveStatement<?, ?>> tryToFindUnknownStatement(final String localName,
+ final Mutable<?, ?, EffectiveStatement<?, ?>> current) {
+ Collection<StmtContext<?, ?, ?>> unknownSubstatements = StmtContextUtils.findAllSubstatements(current,
+ UnknownStatement.class);
+ for (StmtContext<?, ?, ?> unknownSubstatement : unknownSubstatements) {
+ if(unknownSubstatement.rawStatementArgument().equals(localName)) {
+ return (Mutable<?, ?, EffectiveStatement<?, ?>>) unknownSubstatement;
+ }
+ }
+ return null;
+ }
+
@Override
public QName getSignificantKey(SchemaNodeIdentifier key) {
return key.getLastComponent();