From e07eef7d0001ab022a010c9b123af2a3f3d3bcc2 Mon Sep 17 00:00:00 2001 From: Peter Kajsa Date: Wed, 30 Mar 2016 11:23:29 +0200 Subject: [PATCH] Bug 4662: Introduce a SemanticVersion concept - pre-linkage phase Added pre-linkage phase to yang statement parser which collects available module names and namespaces. The phase is necessary in order to correct resolution of unknown statements used in subsequent linkage phase (e.g. semantic version of yang modules). Change-Id: I20e16f3bff1bedcf6cef48a25adafa6e225badeb Signed-off-by: Peter Kajsa --- .../yangtools/yang/common/QName.java | 1 + .../plugin/it/YangToSourcesPluginTestIT.java | 3 +- .../parser/spi/PreLinkageModuleNamespace.java | 19 ++++++ .../spi/meta/AbstractStatementSupport.java | 14 +++++ .../parser/spi/meta/ModelProcessingPhase.java | 24 +++++--- .../parser/spi/meta/StatementSupport.java | 58 ++++++++++++------- .../spi/source/ImpPrefixToNamespace.java | 20 +++++++ .../spi/source/ModuleNameToNamespace.java | 20 +++++++ .../parser/spi/source/PrefixToModule.java | 12 +++- .../parser/spi/source/PrefixToModuleMap.java | 27 +++++++-- .../source/QNameToStatementDefinition.java | 24 ++++++++ .../source/QNameToStatementDefinitionMap.java | 18 ++++-- .../spi/source/StatementStreamSource.java | 32 +++++++++- .../spi/source/StmtOrderingNamespace.java | 8 +-- .../stmt/reactor/BuildGlobalContext.java | 1 + .../stmt/reactor/SourceSpecificContext.java | 21 ++++++- .../reactor/StatementDefinitionContext.java | 3 + .../rfc6020/ImportStatementDefinition.java | 36 ++++++++++++ .../stmt/rfc6020/ModuleStatementSupport.java | 22 +++++++ .../yang/parser/stmt/rfc6020/Utils.java | 26 +++++++-- .../stmt/rfc6020/YangInferencePipeline.java | 18 +++++- .../stmt/rfc6020/YangStatementSourceImpl.java | 12 +++- .../stmt/rfc6020/YinStatementSourceImpl.java | 11 +++- .../yang/stmt/ImportResolutionBasicTest.java | 7 ++- .../yang/stmt/SubstatementValidatorTest.java | 5 +- 25 files changed, 372 insertions(+), 70 deletions(-) create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/PreLinkageModuleNamespace.java create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ImpPrefixToNamespace.java create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ModuleNameToNamespace.java diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java index c1bd85d235..6a8ebe2042 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.common; import static org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil.getRevisionFormat; + import com.google.common.base.Preconditions; import com.google.common.collect.Interner; import com.google.common.collect.Interners; diff --git a/yang/yang-maven-plugin-it/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/it/YangToSourcesPluginTestIT.java b/yang/yang-maven-plugin-it/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/it/YangToSourcesPluginTestIT.java index 1365e560c7..a2d116dee1 100644 --- a/yang/yang-maven-plugin-it/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/it/YangToSourcesPluginTestIT.java +++ b/yang/yang-maven-plugin-it/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/it/YangToSourcesPluginTestIT.java @@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang2sources.plugin.it; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; + import com.google.common.base.Joiner; import java.io.File; import java.io.FileInputStream; @@ -70,7 +71,7 @@ public class YangToSourcesPluginTestIT { assertVerificationException( e, "org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException: Imported module " + - "[ModuleIdentifierImpl{name='unknownDep', namespace=null, revision=2013-02-27}"); + "[unknownDep] was not found."); return; } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/PreLinkageModuleNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/PreLinkageModuleNamespace.java new file mode 100644 index 0000000000..26806dcb5f --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/PreLinkageModuleNamespace.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.spi; + +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement; +import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace; + +/** + * pre-linkage namespace class for storing modules into Yang model storage keyed by module names + */ +public interface PreLinkageModuleNamespace extends + StatementNamespace> { +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java index eb75d0c71f..ffc1249a75 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java @@ -71,6 +71,20 @@ public abstract class AbstractStatementSupport // NOOP for most implementations } + /** + * + * {@inheritDoc} + * + * Subclasses of this class may override this method to perform actions on + * this event or register modification action using + * {@link StmtContext.Mutable#newInferenceAction(ModelProcessingPhase)}. + * + */ + @Override + public void onPreLinkageDeclared(StmtContext.Mutable stmt) { + // NOOP for most implementations + } + /** * * {@inheritDoc} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelProcessingPhase.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelProcessingPhase.java index 3dbf52de9b..3fe2ccc0f1 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelProcessingPhase.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelProcessingPhase.java @@ -10,21 +10,27 @@ package org.opendaylight.yangtools.yang.parser.spi.meta; import javax.annotation.Nullable; public enum ModelProcessingPhase { + INIT(null), + /** + * + * Preliminary cross-source relationship resolution phase which collects + * available module names and module namespaces. It is necessary in order to + * correct resolution of unknown statements used in linkage phase (e.g. + * semantic version of yang modules). + */ + SOURCE_PRE_LINKAGE(INIT), /** * * Cross-source relationship resolution phase. *

- * In this phase of processing only statements which affects - * cross-source relationship (e.g. imports / includes) - * are processed. + * In this phase of processing only statements which affects cross-source + * relationship (e.g. imports / includes) are processed. *

- * At end of this phase all source related contexts should - * be bind to their imports and includes to allow - * visibility of custom defined statements in following - * phases. + * At end of this phase all source related contexts should be bind to their + * imports and includes to allow visibility of custom defined statements in + * following phases. */ - INIT(null), - SOURCE_LINKAGE(INIT), + SOURCE_LINKAGE(SOURCE_PRE_LINKAGE), STATEMENT_DEFINITION(SOURCE_LINKAGE), FULL_DECLARATION(STATEMENT_DEFINITION), EFFECTIVE_MODEL(FULL_DECLARATION); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java index 588974fcb0..c16b1c2830 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java @@ -28,29 +28,34 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; * @param * Effective Statement representation */ -public interface StatementSupport, E extends EffectiveStatement> extends StatementDefinition, StatementFactory { +public interface StatementSupport, E extends EffectiveStatement> extends + StatementDefinition, StatementFactory { /** - * Returns public statement definition, which will be present in builded statements. + * Returns public statement definition, which will be present in builded + * statements. * - * Public statement definition may be used to provide different implementation - * of statement definition, which will not retain any build specific data - * or context. + * Public statement definition may be used to provide different + * implementation of statement definition, which will not retain any build + * specific data or context. * - * @return public statement definition, which will be present in builded statements. + * @return public statement definition, which will be present in builded + * statements. */ - StatementDefinition getPublicView(); + StatementDefinition getPublicView(); /** * * Parses textual representation of argument in object representation. * - * @param ctx Context, which may be used to access source-specific namespaces - * required for parsing. - * @param value String representation of value, as was present in text source. + * @param ctx + * Context, which may be used to access source-specific + * namespaces required for parsing. + * @param value + * String representation of value, as was present in text source. * @return Parsed value */ - A parseArgumentValue(StmtContext ctx, String value) throws SourceException; + A parseArgumentValue(StmtContext ctx, String value) throws SourceException; /** * @@ -59,16 +64,28 @@ public interface StatementSupport, E extends E * @param stmt * Context of added statement. No substatement are available. */ - void onStatementAdded(StmtContext.Mutable stmt); + void onStatementAdded(StmtContext.Mutable stmt); /** * * Invoked when statement is closed during - * {@link ModelProcessingPhase#STATEMENT_DEFINITION} phase. + * {@link ModelProcessingPhase#SOURCE_PRE_LINKAGE} phase, only substatements + * from this and previous phase are available. + * + * Implementation may use method to perform actions on this event or + * register modification action using + * {@link StmtContext.Mutable#newInferenceAction(ModelProcessingPhase)}. + * + * @param stmt + * Context of added statement. + */ + void onPreLinkageDeclared(StmtContext.Mutable stmt); + + /** * * Invoked when statement is closed during - * {@link ModelProcessingPhase#STATEMENT_DEFINITION} phase, only substatements from - * this and previous phase are available. + * {@link ModelProcessingPhase#SOURCE_LINKAGE} phase, only substatements + * from this and previous phase are available. * * Implementation may use method to perform actions on this event or * register modification action using @@ -77,7 +94,7 @@ public interface StatementSupport, E extends E * @param stmt * Context of added statement. */ - void onLinkageDeclared(StmtContext.Mutable stmt) throws SourceException; + void onLinkageDeclared(StmtContext.Mutable stmt) throws SourceException; /** * @@ -85,8 +102,8 @@ public interface StatementSupport, E extends E * {@link ModelProcessingPhase#STATEMENT_DEFINITION} phase. * * Invoked when statement is closed during - * {@link ModelProcessingPhase#STATEMENT_DEFINITION} phase, only substatements from - * this phase are available. + * {@link ModelProcessingPhase#STATEMENT_DEFINITION} phase, only + * substatements from this phase are available. * * Implementation may use method to perform actions on this event or * register modification action using @@ -96,7 +113,7 @@ public interface StatementSupport, E extends E * Context of added statement. Argument and statement parent is * accessible. */ - void onStatementDefinitionDeclared(StmtContext.Mutable stmt) throws SourceException; + void onStatementDefinitionDeclared(StmtContext.Mutable stmt) throws SourceException; /** * @@ -116,6 +133,5 @@ public interface StatementSupport, E extends E * Context of added statement. Argument and statement parent is * accessible. */ - void onFullDefinitionDeclared(StmtContext.Mutable stmt) throws SourceException; - + void onFullDefinitionDeclared(StmtContext.Mutable stmt) throws SourceException; } \ No newline at end of file diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ImpPrefixToNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ImpPrefixToNamespace.java new file mode 100644 index 0000000000..1c11c36994 --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ImpPrefixToNamespace.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.spi.source; + +import java.net.URI; +import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; + +/** + * + * Pre-linkage source-specific mapping of prefixes to module namespaces + * + */ +public interface ImpPrefixToNamespace extends IdentifierNamespace { + +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ModuleNameToNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ModuleNameToNamespace.java new file mode 100644 index 0000000000..e064c9d7c1 --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ModuleNameToNamespace.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.spi.source; + +import java.net.URI; +import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; + +/** + * + * Pre-linkage global mapping of module names to namespaces + * + */ +public interface ModuleNameToNamespace extends IdentifierNamespace { + +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModule.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModule.java index 516eaea4c0..ca8a66a13b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModule.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModule.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.spi.source; +import java.net.URISyntaxException; import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; @@ -39,7 +40,16 @@ public interface PrefixToModule extends IdentifierNamespace * XML Namespace * @return QNameModule associated with supplied namespace, or null if prefix * is not defined. + * @throws URISyntaxException if the input string is not valid URI * */ - @Nullable QNameModule getByNamespace(String namespace); + @Nullable QNameModule getByNamespace(String namespace) throws URISyntaxException; + + /** + * Pre-linkage map does not consider revision-dates of modules and it contains module namespaces only. + * + * @return true if it is the pre-linkage map. + * + */ + boolean isPreLinkageMap(); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModuleMap.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModuleMap.java index e01e5aeb2c..506247b4a9 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModuleMap.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModuleMap.java @@ -7,18 +7,30 @@ */ package org.opendaylight.yangtools.yang.parser.spi.source; -import org.opendaylight.yangtools.yang.common.QNameModule; - -import javax.annotation.Nullable; +import java.net.URI; +import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; +import javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QNameModule; public class PrefixToModuleMap implements PrefixToModule { private Map prefixToModuleMap = new HashMap<>(); + private Map namespaceToModuleMap = new HashMap<>(); + private final boolean preLinkageMap; + + public PrefixToModuleMap() { + this(false); + } + + public PrefixToModuleMap(boolean preLinkageMap) { + this.preLinkageMap = preLinkageMap; + } public void put(String prefix, QNameModule qNameModule) { prefixToModuleMap.put(prefix, qNameModule); + namespaceToModuleMap.put(qNameModule.getNamespace(), qNameModule); } @Nullable @@ -29,7 +41,12 @@ public class PrefixToModuleMap implements PrefixToModule { @Nullable @Override - public QNameModule getByNamespace(String namespace) { - return null; + public QNameModule getByNamespace(String namespace) throws URISyntaxException { + return namespaceToModuleMap.get(new URI(namespace)); + } + + @Override + public boolean isPreLinkageMap() { + return preLinkageMap; } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinition.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinition.java index 58e7da9b3d..e443d32606 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinition.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinition.java @@ -7,6 +7,9 @@ */ package org.opendaylight.yangtools.yang.parser.spi.source; +import java.net.URI; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -18,4 +21,25 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; */ public interface QNameToStatementDefinition extends IdentifierNamespace { + /** + * Returns StatementDefinition with specified QName. + * + * @param identifier + * QName of requested statement + * @return StatementDefinition + */ + @Nullable + StatementDefinition get(@Nonnull QName identifier); + + /** + * Returns StatementDefinition with specified namespace and localName. + * + * @param namespace + * namespace of requested statement + * @param localName + * localName of requested statement + * @return StatementDefinition + */ + @Nullable + StatementDefinition getByNamespaceAndLocalName(@Nonnull final URI namespace, @Nonnull final String localName); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinitionMap.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinitionMap.java index 091360e04c..aaefd8aeb8 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinitionMap.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinitionMap.java @@ -7,20 +7,22 @@ */ package org.opendaylight.yangtools.yang.parser.spi.source; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import java.net.URI; import java.util.HashMap; import java.util.Map; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; public class QNameToStatementDefinitionMap implements QNameToStatementDefinition { private Map qNameToStmtDefMap = new HashMap<>(); + private Map qNameWithoutRevisionToStmtDefMap = new HashMap<>(); public void put(QName qName, StatementDefinition stDef) { qNameToStmtDefMap.put(qName, stDef); + qNameWithoutRevisionToStmtDefMap.put(QName.create(qName.getNamespace(), null, qName.getLocalName()), stDef); } @Nullable @@ -28,4 +30,10 @@ public class QNameToStatementDefinitionMap implements QNameToStatementDefinition public StatementDefinition get(@Nonnull QName identifier) { return qNameToStmtDefMap.get(identifier); } + + @Nullable + @Override + public StatementDefinition getByNamespaceAndLocalName(URI namespace, @Nonnull String localName) { + return qNameWithoutRevisionToStmtDefMap.get(QName.create(namespace, null, localName)); + } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StatementStreamSource.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StatementStreamSource.java index fa3cc60aed..4e36be9037 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StatementStreamSource.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StatementStreamSource.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.spi.source; + /** * * Statement stream source, which is used for inference of effective model. @@ -24,7 +25,14 @@ package org.opendaylight.yangtools.yang.parser.spi.source; * Steps (in order of invocation) are: * *

    - *
  1. {@link #writeLinkage(StatementWriter, QNameToStatementDefinition)} - + *
  2. {@link #writePreLinkage(StatementWriter, QNameToStatementDefinition)} - + * Source MUST emit only statements related in pre-linkage, which are present in + * supplied statement definition map. This step is used as preparatory cross-source + * relationship resolution phase which collects available module names and namespaces. + * It is necessary in order to correct resolution of unknown statements used by linkage + * phase (e.g. semantic version of yang modules). + *
  3. + *
  4. {@link #writeLinkage(StatementWriter, QNameToStatementDefinition, PrefixToModule)} - * Source MUST emit only statements related in linkage, which are present in * supplied statement definition map. This step is used to build cross-source * linkage and visibility relationship, and to determine XMl namespaces and @@ -44,6 +52,24 @@ package org.opendaylight.yangtools.yang.parser.spi.source; */ public interface StatementStreamSource { + /** + * + * Emits only pre-linkage-related statements to supplied {@code writer}. + * + * @param writer + * {@link StatementWriter} which should be used to emit + * statements. + * @param stmtDef + * Map of available statement definitions. Only these statements + * may be written to statement writer, source MUST ignore and MUST NOT + * emit any other statements. + * + * @throws SourceException + * If source was is not valid, or provided statement writer + * failed to write statements. + */ + void writePreLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef) throws SourceException; + /** * * Emits only linkage-related statements to supplied {@code writer}. @@ -55,12 +81,14 @@ public interface StatementStreamSource { * Map of available statement definitions. Only these statements * may be written to statement writer, source MUST ignore and MUST NOT * emit any other statements. + * @param preLinkagePrefixes + * Pre-linkage map of source-specific prefixes to namespaces * * @throws SourceException * If source was is not valid, or provided statement writer * failed to write statements. */ - void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef) throws SourceException; + void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule preLinkagePrefixes) throws SourceException; /** * diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StmtOrderingNamespace.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StmtOrderingNamespace.java index 200870abb9..44f42631c5 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StmtOrderingNamespace.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StmtOrderingNamespace.java @@ -8,15 +8,11 @@ package org.opendaylight.yangtools.yang.parser.spi.source; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; - import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; /** - * - * Source-specific mapping of prefixes to namespaces - * + * Map of statement order. */ public interface StmtOrderingNamespace extends IdentifierNamespace { - -} +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java index 90b9a6e653..66c29cd328 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java @@ -50,6 +50,7 @@ class BuildGlobalContext extends NamespaceStorageSupport implements NamespaceBeh private static final Logger LOG = LoggerFactory.getLogger(BuildGlobalContext.class); private static final List PHASE_EXECUTION_ORDER = ImmutableList.builder() + .add(ModelProcessingPhase.SOURCE_PRE_LINKAGE) .add(ModelProcessingPhase.SOURCE_LINKAGE) .add(ModelProcessingPhase.STATEMENT_DEFINITION) .add(ModelProcessingPhase.FULL_DECLARATION) 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 792864eb0f..ef26cda073 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 @@ -11,6 +11,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Multimap; +import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -41,6 +42,7 @@ 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.ImpPrefixToNamespace; 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; @@ -310,8 +312,11 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh void loadStatements() throws SourceException { switch (inProgressPhase) { + case SOURCE_PRE_LINKAGE: + source.writePreLinkage(new StatementContextWriter(this, inProgressPhase), stmtDef()); + break; case SOURCE_LINKAGE: - source.writeLinkage(new StatementContextWriter(this, inProgressPhase), stmtDef()); + source.writeLinkage(new StatementContextWriter(this, inProgressPhase), stmtDef(), preLinkagePrefixes()); break; case STATEMENT_DEFINITION: source.writeLinkageAndStatementDefinitions(new StatementContextWriter(this, inProgressPhase), stmtDef(), prefixes()); @@ -345,6 +350,20 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh } } + private PrefixToModule preLinkagePrefixes() { + PrefixToModuleMap preLinkagePrefixes = new PrefixToModuleMap(true); + Map prefixToNamespaceMap = getAllFromLocalStorage(ImpPrefixToNamespace.class); + if(prefixToNamespaceMap == null) { + //:FIXME if it is a submodule without any import, the map is null. Handle also submodules and includes... + return null; + } + for (Entry prefixToNamespace : prefixToNamespaceMap.entrySet()) { + preLinkagePrefixes.put(prefixToNamespace.getKey(), QNameModule.create(prefixToNamespace.getValue(), null)); + } + + return preLinkagePrefixes; + } + private PrefixToModule prefixes() { final Map allPrefixes = getRoot().getAllFromNamespace(ImpPrefixToModuleIdentifier .class); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java index a2a510d13a..fa5a0a4ec9 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java @@ -51,6 +51,9 @@ public class StatementDefinitionContext,E exten public void onDeclarationFinished(Mutable statement, ModelProcessingPhase phase) throws SourceException { switch (phase) { + case SOURCE_PRE_LINKAGE: + support.onPreLinkageDeclared(statement); + break; case SOURCE_LINKAGE: support.onLinkageDeclared(statement); break; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java index fc28e13d11..6fc637b59d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java @@ -8,8 +8,11 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.SOURCE_LINKAGE; +import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.SOURCE_PRE_LINKAGE; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf; + import com.google.common.base.Optional; +import com.google.common.base.Verify; import java.net.URI; import java.util.Collection; import java.util.Date; @@ -26,6 +29,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace; +import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -35,6 +39,8 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prereq 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.source.ImpPrefixToModuleIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToNamespace; +import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToNamespace; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ImportEffectiveStatementImpl; public class ImportStatementDefinition @@ -70,6 +76,36 @@ public class ImportStatementDefinition SUBSTATEMENT_VALIDATOR.validate(stmt); } + @Override + public void onPreLinkageDeclared(Mutable> stmt) { + final String moduleName = stmt.getStatementArgument(); + final ModelActionBuilder importAction = stmt.newInferenceAction(SOURCE_PRE_LINKAGE); + final Prerequisite> imported = importAction.requiresCtx(stmt, + PreLinkageModuleNamespace.class, moduleName, SOURCE_PRE_LINKAGE); + final Prerequisite> linkageTarget = importAction + .mutatesCtx(stmt.getRoot(), SOURCE_PRE_LINKAGE); + + importAction.apply(new InferenceAction() { + @Override + public void apply() { + StmtContext importedModuleContext = imported.get(); + Verify.verify(moduleName.equals(importedModuleContext.getStatementArgument())); + final URI importedModuleNamespace = importedModuleContext.getFromNamespace(ModuleNameToNamespace.class, + moduleName); + Verify.verifyNotNull(importedModuleNamespace); + final String impPrefix = firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class); + Verify.verifyNotNull(impPrefix); + stmt.addToNs(ImpPrefixToNamespace.class, impPrefix, importedModuleNamespace); + } + + @Override + public void prerequisiteFailed(final Collection> failed) { + InferenceException.throwIf(failed.contains(imported), stmt.getStatementSourceReference(), + "Imported module [%s] was not found.", moduleName); + } + }); + } + @Override public void onLinkageDeclared( final Mutable> stmt) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java index 1f3722c9f4..44c4194cf2 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf; + import com.google.common.base.Optional; import java.net.URI; import java.util.Date; @@ -23,14 +24,17 @@ import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule; +import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; 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.source.ImpPrefixToModuleIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleIdentifierToModuleQName; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName; +import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNamespaceForBelongsTo; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleQNameToModuleName; import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule; @@ -89,6 +93,24 @@ public class ModuleStatementSupport extends return new ModuleEffectiveStatementImpl(ctx); } + @Override + public void onPreLinkageDeclared(Mutable> stmt) { + final String moduleName = stmt.getStatementArgument(); + + final URI moduleNs = firstAttributeOf(stmt.declaredSubstatements(), + NamespaceStatement.class); + SourceException.throwIfNull(moduleNs, stmt.getStatementSourceReference(), + "Namespace of the module [%s] is missing", stmt.getStatementArgument()); + stmt.addToNs(ModuleNameToNamespace.class, moduleName, moduleNs); + + final String modulePrefix = firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class); + SourceException.throwIfNull(modulePrefix, stmt.getStatementSourceReference(), + "Prefix of the module [%s] is missing", stmt.getStatementArgument()); + stmt.addToNs(ImpPrefixToNamespace.class, modulePrefix, moduleNs); + + stmt.addContext(PreLinkageModuleNamespace.class, moduleName, stmt); + }; + @Override public void onLinkageDeclared(final Mutable> stmt) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java index 05fb288c5b..a41a1a9de3 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java @@ -19,7 +19,6 @@ import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -45,6 +44,7 @@ import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier; import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.Status; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement; @@ -384,8 +384,8 @@ public final class Utils { * @return valid QName for declared statement to be written * */ - public static QName getValidStatementDefinition(final PrefixToModule prefixes, final QNameToStatementDefinition - stmtDef, final QName identifier) { + public static QName getValidStatementDefinition(final PrefixToModule prefixes, + final QNameToStatementDefinition stmtDef, final QName identifier) { if (stmtDef.get(identifier) != null) { return stmtDef.get(identifier).getStatementName(); } else { @@ -395,9 +395,23 @@ public final class Utils { if (namesParts.length == 2) { String prefix = namesParts[0]; String localName = namesParts[1]; - if (prefixes != null && prefixes.get(prefix) != null - && stmtDef.get(QName.create(prefixes.get(prefix), localName)) != null) { - return QName.create(prefixes.get(prefix), localName); + + if (prefixes == null) { + return null; + } + + QNameModule qNameModule = prefixes.get(prefix); + if (qNameModule == null) { + return null; + } + + if (prefixes.isPreLinkageMap()) { + StatementDefinition foundStmtDef = stmtDef.getByNamespaceAndLocalName(qNameModule.getNamespace(), + localName); + return foundStmtDef != null ? foundStmtDef.getStatementName() : null; + } else { + QName qName = QName.create(qNameModule, localName); + return stmtDef.get(qName) != null ? qName : null; } } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangInferencePipeline.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangInferencePipeline.java index 4d38896803..7255a7165a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangInferencePipeline.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangInferencePipeline.java @@ -18,6 +18,7 @@ import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace; import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule; +import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.SubmoduleNamespace; import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedIdentitiesNamespace; @@ -29,10 +30,12 @@ import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToModuleContext; import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleIdentifier; import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName; import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToModuleIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.IncludedSubmoduleNameToIdentifier; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleIdentifierToModuleQName; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName; +import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNamespaceForBelongsTo; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleQNameToModuleName; import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule; @@ -48,7 +51,7 @@ public final class YangInferencePipeline { .builder().addSupport(global(ValidationBundlesNamespace.class)) .build(); - public static final StatementSupportBundle LINKAGE_BUNDLE = StatementSupportBundle + public static final StatementSupportBundle PRE_LINKAGE_BUNDLE = StatementSupportBundle .derivedFrom(INIT_BUNDLE) .addSupport(new ModuleStatementSupport()) .addSupport(new SubmoduleStatementImpl.Definition()) @@ -57,6 +60,13 @@ public final class YangInferencePipeline { .addSupport(new IncludeStatementImpl.Definition()) .addSupport(new PrefixStatementImpl.Definition()) .addSupport(new YangVersionStatementImpl.Definition()) + .addSupport(global(ModuleNameToNamespace.class)) + .addSupport(global(PreLinkageModuleNamespace.class)) + .addSupport(sourceLocal(ImpPrefixToNamespace.class)) + .build(); + + public static final StatementSupportBundle LINKAGE_BUNDLE = StatementSupportBundle + .derivedFrom(PRE_LINKAGE_BUNDLE) .addSupport(new DescriptionStatementImpl.Definition()) .addSupport(new RevisionStatementImpl.Definition()) .addSupport(new RevisionDateStatementImpl.Definition()) @@ -82,8 +92,8 @@ public final class YangInferencePipeline { .addSupport(sourceLocal(URIStringToImpPrefix.class)) .addSupport(sourceLocal(BelongsToModuleContext.class)) .addSupport(sourceLocal(QNameToStatementDefinition.class)) - .addSupport(sourceLocal(BelongsToPrefixToModuleName.class)).build(); - + .addSupport(sourceLocal(BelongsToPrefixToModuleName.class)) + .build(); private static final StatementSupportBundle STMT_DEF_BUNDLE = StatementSupportBundle .derivedFrom(LINKAGE_BUNDLE) @@ -156,6 +166,7 @@ public final class YangInferencePipeline { public static final Map RFC6020_BUNDLES = ImmutableMap . builder() + .put(ModelProcessingPhase.SOURCE_PRE_LINKAGE, PRE_LINKAGE_BUNDLE) .put(ModelProcessingPhase.SOURCE_LINKAGE, LINKAGE_BUNDLE) .put(ModelProcessingPhase.STATEMENT_DEFINITION, STMT_DEF_BUNDLE) .put(ModelProcessingPhase.FULL_DECLARATION, FULL_DECL_BUNDLE) @@ -165,6 +176,7 @@ public final class YangInferencePipeline { public static final CrossSourceStatementReactor RFC6020_REACTOR = CrossSourceStatementReactor .builder() .setBundle(ModelProcessingPhase.INIT, INIT_BUNDLE) + .setBundle(ModelProcessingPhase.SOURCE_PRE_LINKAGE, PRE_LINKAGE_BUNDLE) .setBundle(ModelProcessingPhase.SOURCE_LINKAGE, LINKAGE_BUNDLE) .setBundle(ModelProcessingPhase.STATEMENT_DEFINITION, STMT_DEF_BUNDLE) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangStatementSourceImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangStatementSourceImpl.java index 148133b94c..3080e48b5e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangStatementSourceImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangStatementSourceImpl.java @@ -14,8 +14,6 @@ import java.net.URISyntaxException; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTreeWalker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementLexer; import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser; import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.StatementContext; @@ -28,6 +26,8 @@ import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinit import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource; import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter; import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @@ -77,11 +77,17 @@ public final class YangStatementSourceImpl implements StatementStreamSource { } @Override - public void writeLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef) { + public void writePreLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef) { yangStatementModelParser.setAttributes(writer, stmtDef); walker.walk(yangStatementModelParser, statementContext); } + @Override + public void writeLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef, final PrefixToModule preLinkagePrefixes) { + yangStatementModelParser.setAttributes(writer, stmtDef, preLinkagePrefixes); + walker.walk(yangStatementModelParser, statementContext); + } + @Override public void writeLinkageAndStatementDefinitions(final StatementWriter writer, final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes) { yangStatementModelParser.setAttributes(writer, stmtDef, prefixes); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinStatementSourceImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinStatementSourceImpl.java index 9063f59574..c86b84f422 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinStatementSourceImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinStatementSourceImpl.java @@ -58,12 +58,19 @@ public class YinStatementSourceImpl implements StatementStreamSource { } @Override - public void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef) { + public void writePreLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef) { initializeReader(); yinStatementModelParser.setAttributes(writer, stmtDef); yinStatementModelParser.walk(streamReader); } + @Override + public void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef, final PrefixToModule preLinkagePrefixes) { + initializeReader(); + yinStatementModelParser.setAttributes(writer, stmtDef, preLinkagePrefixes); + yinStatementModelParser.walk(streamReader); + } + @Override public void writeLinkageAndStatementDefinitions(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule prefixes) { @@ -120,4 +127,4 @@ public class YinStatementSourceImpl implements StatementStreamSource { return new NamedFileInputStream(file, fileName); } -} +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/ImportResolutionBasicTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/ImportResolutionBasicTest.java index 7e1189f900..f1003b8252 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/ImportResolutionBasicTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/ImportResolutionBasicTest.java @@ -12,6 +12,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; + import org.junit.Test; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; @@ -68,7 +69,7 @@ public class ImportResolutionBasicTest { fail("reactor.process should fail due to missing imported source"); } catch (ReactorException e) { assertTrue(e instanceof SomeModifiersUnresolvedException); - assertEquals(ModelProcessingPhase.SOURCE_LINKAGE, e.getPhase()); + assertEquals(ModelProcessingPhase.SOURCE_PRE_LINKAGE, e.getPhase()); } } @@ -82,7 +83,7 @@ public class ImportResolutionBasicTest { fail("reactor.process should fail due to circular import"); } catch (ReactorException e) { assertTrue(e instanceof SomeModifiersUnresolvedException); - assertEquals(ModelProcessingPhase.SOURCE_LINKAGE, e.getPhase()); + assertEquals(ModelProcessingPhase.SOURCE_PRE_LINKAGE, e.getPhase()); } } @@ -95,7 +96,7 @@ public class ImportResolutionBasicTest { fail("reactor.process should fail due to self import"); } catch (ReactorException e) { assertTrue(e instanceof SomeModifiersUnresolvedException); - assertEquals(ModelProcessingPhase.SOURCE_LINKAGE, e.getPhase()); + assertEquals(ModelProcessingPhase.SOURCE_PRE_LINKAGE, e.getPhase()); } } diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/SubstatementValidatorTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/SubstatementValidatorTest.java index 4bd9f8e8a8..e388750e00 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/SubstatementValidatorTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/SubstatementValidatorTest.java @@ -10,6 +10,8 @@ package org.opendaylight.yangtools.yang.stmt; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; + +import com.google.common.base.VerifyException; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; @@ -22,7 +24,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.parser.spi.meta.MissingSubstatementException; import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; import org.opendaylight.yangtools.yang.stmt.TestUtils; @@ -69,7 +70,7 @@ public class SubstatementValidatorTest { @Test public void missingElementException() throws URISyntaxException, ReactorException { - expectedEx.expect(MissingSubstatementException.class); + expectedEx.expect(VerifyException.class); Set modules = TestUtils.loadModules(getClass().getResource ("/substatement-validator/missing-element").toURI()); -- 2.36.6