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=db760d0792cfd2be2f7901ca98626656d89b1ab0;hpb=73be7eaf765ace720c65d305a9d89b3073428199;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 db760d0792..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"}) @@ -255,11 +233,11 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh PhaseCompletionProgress tryToCompletePhase(final ModelProcessingPhase phase) throws SourceException { Collection currentPhaseModifiers = modifiers.get(phase); - boolean hasProgressed = hasProgress(currentPhaseModifiers); + boolean hasProgressed = tryToProgress(currentPhaseModifiers); boolean phaseCompleted = root.tryToCompletePhase(phase); - hasProgressed = (hasProgress(currentPhaseModifiers) | hasProgressed); + hasProgressed = (tryToProgress(currentPhaseModifiers) | hasProgressed); if (phaseCompleted && (currentPhaseModifiers.isEmpty())) { finishedPhase = phase; @@ -273,12 +251,12 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh } - private static boolean hasProgress(final Collection currentPhaseModifiers) { + private static boolean tryToProgress(final Collection currentPhaseModifiers) { Iterator modifier = currentPhaseModifiers.iterator(); boolean hasProgressed = false; while (modifier.hasNext()) { - if (modifier.next().isApplied()) { + if (modifier.next().tryApply()) { modifier.remove(); hasProgressed = true; } @@ -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());