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%2Freactor%2FSourceSpecificContext.java;h=64351b8818efafe5e5ba4ea85b4c9c2261ecd774;hb=ea32c2c6fac2ebe9d0e30c9c4e5279c5ef0d2314;hp=b11d2a40aa3d732144a08f114e0c0628010ad04b;hpb=b6e9bb9ff439eb0e905d8ccf61e15a5a3b2bf444;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java index b11d2a40aa..64351b8818 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java @@ -14,14 +14,15 @@ import com.google.common.collect.Multimap; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opendaylight.yangtools.concepts.Mutable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.common.YangConstants; +import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; @@ -35,8 +36,12 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType; +import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToModuleIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.source.ModuleIdentifierToModuleQName; import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule; import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModuleMap; import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition; @@ -54,7 +59,6 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.TypeUtils; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.UnionSpecificationImpl; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.UnknownStatementImpl; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.UnknownEffectiveStatementImpl; public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBehaviour.Registry, Mutable { @@ -95,24 +99,21 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh if (def == null) { //unknown-stmts (from import, include or local-scope) - if (qNameToStmtDefMap.get(Utils.trimPrefix(name)) != null) { - QName key = Utils.qNameFromArgument(current, name.getLocalName()); - if (key != null) { - final StatementContextBase extension = (StatementContextBase) currentContext - .getAllFromNamespace(ExtensionNamespace.class).get(key); - if (extension != null) { - final QName qName = QName.create(((QName) ((SubstatementContext) extension).getStatementArgument()) - .getModule().getNamespace(), ((QName) ((SubstatementContext) extension). - getStatementArgument()).getModule().getRevision(), extension.getIdentifier().getArgument()); - - def = new StatementDefinitionContext<>(new UnknownStatementImpl.Definition - (getNewStatementDefinition(qName))); - } else { - throw new IllegalArgumentException("Not found unknown statement: " + name); - } + if (qNameToStmtDefMap.get(name) != null) { + final StatementContextBase extension = (StatementContextBase) currentContext + .getAllFromNamespace(ExtensionNamespace.class).get(name); + if (extension != null) { + final QName arg = (QName) extension.getStatementArgument(); + final QName qName = current.getFromNamespace(QNameCacheNamespace.class, + QName.create(arg, extension.getIdentifier().getArgument())); + + def = new StatementDefinitionContext<>(new UnknownStatementImpl.Definition( + getNewStatementDefinition(qName))); + } else { + throw new IllegalArgumentException("Not found unknown statement: " + name); } } else { - //type-body-stmts + // type-body-stmts def = resolveTypeBodyStmts(name.getLocalName()); } } @@ -130,32 +131,9 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh return current.substatementBuilder(def, ref); } + // FIXME: This should be populated differently StatementDefinition getNewStatementDefinition(final QName qName) { - return new StatementDefinition() { - @Nonnull - @Override - public QName getStatementName() { - return qName; - } - - @Nullable - @Override - public QName getArgumentName() { - return qName; - } - - @Nonnull - @Override - public Class> getDeclaredRepresentationClass() { - return UnknownStatementImpl.class; - } - - @Nonnull - @Override - public Class> getEffectiveRepresentationClass() { - return UnknownEffectiveStatementImpl.class; - } - }; + return new ModelDefinedStatementDefinition(qName); } @SuppressWarnings({"rawtypes", "unchecked"}) @@ -301,17 +279,28 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh } SourceException failModifiers(final ModelProcessingPhase identifier) { - InferenceException sourceEx = new InferenceException("Fail to infer source relationships", root.getStatementSourceReference()); - - + final List exceptions = new ArrayList<>(); for (ModifierImpl mod : modifiers.get(identifier)) { try { mod.failModifier(); } catch (SourceException e) { - sourceEx.addSuppressed(e); + exceptions.add(e); } } - return sourceEx; + + final String message = String.format("Yang model processing phase %s failed", identifier); + if (exceptions.isEmpty()) { + return new InferenceException(message, root.getStatementSourceReference()); + } + + final InferenceException e = new InferenceException(message, root.getStatementSourceReference(), + exceptions.get(0)); + final Iterator it = exceptions.listIterator(1); + while (it.hasNext()) { + e.addSuppressed(it.next()); + } + + return e; } void loadStatements() throws SourceException { @@ -351,11 +340,18 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh } } - private PrefixToModule prefixes() { - Map prefixes = currentContext.getAllFromNamespace(PrefixToModule.class); - for (Map.Entry prefix : prefixes.entrySet()) { - prefixToModuleMap.put(prefix.getKey(), prefix.getValue()); + final Map allPrefixes = getRoot().getAllFromNamespace(ImpPrefixToModuleIdentifier + .class); + final Map belongsToPrefixes = getRoot().getAllFromNamespace + (BelongsToPrefixToModuleIdentifier.class); + if (belongsToPrefixes != null) + allPrefixes.putAll(belongsToPrefixes); + + for (Entry stringModuleIdentifierEntry : allPrefixes.entrySet()) { + final QNameModule namespace = getRoot().getFromNamespace(ModuleIdentifierToModuleQName.class, + stringModuleIdentifierEntry.getValue()); + prefixToModuleMap.put(stringModuleIdentifierEntry.getKey(), namespace); } return prefixToModuleMap; } @@ -376,8 +372,7 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh for (Map.Entry>> extension : extensions .entrySet()) { qNameToStmtDefMap - .put(QName.create(YangConstants.RFC6020_YIN_MODULE, - extension.getKey().getLocalName()), + .put((extension.getKey()), (StatementDefinition) ((StatementContextBase) extension .getValue()).definition() .getFactory());