Bug 4662: Introduce a SemanticVersion concept - pre-linkage phase 72/36872/16
authorPeter Kajsa <pkajsa@cisco.com>
Wed, 30 Mar 2016 09:23:29 +0000 (11:23 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 16 May 2016 17:52:58 +0000 (17:52 +0000)
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 <pkajsa@cisco.com>
25 files changed:
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java
yang/yang-maven-plugin-it/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/it/YangToSourcesPluginTestIT.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/PreLinkageModuleNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelProcessingPhase.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ImpPrefixToNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/ModuleNameToNamespace.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModule.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/PrefixToModuleMap.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinition.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/QNameToStatementDefinitionMap.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StatementStreamSource.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/StmtOrderingNamespace.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangInferencePipeline.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangStatementSourceImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinStatementSourceImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/ImportResolutionBasicTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/SubstatementValidatorTest.java

index c1bd85d23591f43f4a5c91491e0e566cac731fff..6a8ebe2042184c912a5ccf811cc2cfbb53f4a64b 100644 (file)
@@ -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;
index 1365e560c72a04e425f156d902f9ef76a0f293a5..a2d116dee15dec8ede528ff585058e40e001cc81 100644 (file)
@@ -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 (file)
index 0000000..26806dc
--- /dev/null
@@ -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<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> {
+}
index eb75d0c71f04cba7098659f84ef13735eaef748a..ffc1249a75c77b3ea4cfff4066bf407c69ee5216 100644 (file)
@@ -71,6 +71,20 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
         // 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<A, D, E> stmt) {
+        // NOOP for most implementations
+    }
+
     /**
      *
      * {@inheritDoc}
index 3dbf52de9b30c214fa9c24b2fd10e2590acd382b..3fe2ccc0f110040d9de60f24b9ba9776cfa24111 100644 (file)
@@ -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.
      * <p>
-     * 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.
      * <p>
-     * 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);
index 588974fcb0faaf21f26b95438b3b3beda3e9943c..c16b1c283098cff27c49193c4f2e81a5b8d3e39e 100644 (file)
@@ -28,29 +28,34 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
  * @param <E>
  *            Effective Statement representation
  */
-public interface StatementSupport<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>> extends StatementDefinition, StatementFactory<A, D, E> {
+public interface StatementSupport<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>> extends
+        StatementDefinition, StatementFactory<A, D, E> {
 
     /**
-     * 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<A, D extends DeclaredStatement<A>, E extends E
      * @param stmt
      *            Context of added statement. No substatement are available.
      */
-     void onStatementAdded(StmtContext.Mutable<A, D, E> stmt);
+    void onStatementAdded(StmtContext.Mutable<A, D, E> 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<A, D, E> 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<A, D extends DeclaredStatement<A>, E extends E
      * @param stmt
      *            Context of added statement.
      */
-     void onLinkageDeclared(StmtContext.Mutable<A, D, E> stmt) throws SourceException;
+    void onLinkageDeclared(StmtContext.Mutable<A, D, E> stmt) throws SourceException;
 
     /**
      *
@@ -85,8 +102,8 @@ public interface StatementSupport<A, D extends DeclaredStatement<A>, 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<A, D extends DeclaredStatement<A>, E extends E
      *            Context of added statement. Argument and statement parent is
      *            accessible.
      */
-     void onStatementDefinitionDeclared(StmtContext.Mutable<A, D, E> stmt) throws SourceException;
+    void onStatementDefinitionDeclared(StmtContext.Mutable<A, D, E> stmt) throws SourceException;
 
     /**
      *
@@ -116,6 +133,5 @@ public interface StatementSupport<A, D extends DeclaredStatement<A>, E extends E
      *            Context of added statement. Argument and statement parent is
      *            accessible.
      */
-     void onFullDefinitionDeclared(StmtContext.Mutable<A, D, E> stmt) throws SourceException;
-
+    void onFullDefinitionDeclared(StmtContext.Mutable<A, D, E> 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 (file)
index 0000000..1c11c36
--- /dev/null
@@ -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<String, URI> {
+
+}
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 (file)
index 0000000..e064c9d
--- /dev/null
@@ -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<String, URI> {
+
+}
index 516eaea4c0e1faabd64ae183ac48b8e14f71be79..ca8a66a13bdf016072a2cdbb3feb942924f7316a 100644 (file)
@@ -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<String, QNameModule>
      *            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();
 }
index e01e5aeb2cce86bbc6a1a6fd455a7c09168aca67..506247b4a9982c8fe8b636570acf99e2b6f72975 100644 (file)
@@ -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<String, QNameModule> prefixToModuleMap = new HashMap<>();
+    private Map<URI, QNameModule> 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;
     }
 }
index 58e7da9b3d4b6da27ca36ab80c133242363e9ab5..e443d326064b33d0528881d93d3985b7bf60b049 100644 (file)
@@ -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<QName, StatementDefinition> {
 
+    /**
+     * 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);
 }
index 091360e04c6debc8e3f9807dd7ad3d4e05c137ef..aaefd8aeb87c11ffc33e714e3c41f3cae18f8c58 100644 (file)
@@ -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<QName, StatementDefinition> qNameToStmtDefMap = new HashMap<>();
+    private Map<QName, StatementDefinition> 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));
+    }
 }
index fa3cc60aedabb0a342f62af1bc34de60bca293bf..4e36be9037a98a424de7dca6faddba62d4193bae 100644 (file)
@@ -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:
  *
  * <ol>
- * <li>{@link #writeLinkage(StatementWriter, QNameToStatementDefinition)} -
+ * <li>{@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).
+ * </li>
+ * <li>{@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;
 
     /**
      *
index 200870abb90f1856b152852c148f9e987d2e3f3d..44f42631c52c3fb184a64d5f1a0db81bb33da275 100644 (file)
@@ -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<Rfc6020Mapping, Integer> {
-
-}
+}
\ No newline at end of file
index 90b9a6e6533297fbbf44384b616127bf5358e120..66c29cd328ac62cbc98d1f10793a756a835d0a02 100644 (file)
@@ -50,6 +50,7 @@ class BuildGlobalContext extends NamespaceStorageSupport implements NamespaceBeh
     private static final Logger LOG = LoggerFactory.getLogger(BuildGlobalContext.class);
 
     private static final List<ModelProcessingPhase> PHASE_EXECUTION_ORDER = ImmutableList.<ModelProcessingPhase>builder()
+            .add(ModelProcessingPhase.SOURCE_PRE_LINKAGE)
             .add(ModelProcessingPhase.SOURCE_LINKAGE)
             .add(ModelProcessingPhase.STATEMENT_DEFINITION)
             .add(ModelProcessingPhase.FULL_DECLARATION)
index 792864eb0fea341b06d61ebd3d7c13dceb689b41..ef26cda0730361e2122ec47e873a76136b5b7a85 100644 (file)
@@ -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<String, URI> 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<String, URI> prefixToNamespace : prefixToNamespaceMap.entrySet()) {
+            preLinkagePrefixes.put(prefixToNamespace.getKey(), QNameModule.create(prefixToNamespace.getValue(), null));
+        }
+
+        return preLinkagePrefixes;
+    }
+
     private PrefixToModule prefixes() {
         final Map<String, ModuleIdentifier> allPrefixes = getRoot().getAllFromNamespace(ImpPrefixToModuleIdentifier
                 .class);
index a2a510d13a8424f820401b2453db0283a74b5a73..fa5a0a4ec93d4670f2e6eb1aa91e60f18fa6437f 100644 (file)
@@ -51,6 +51,9 @@ public class StatementDefinitionContext<A,D extends DeclaredStatement<A>,E exten
 
     public void onDeclarationFinished(Mutable<A,D,E> statement, ModelProcessingPhase phase) throws SourceException {
         switch (phase) {
+        case SOURCE_PRE_LINKAGE:
+            support.onPreLinkageDeclared(statement);
+            break;
         case SOURCE_LINKAGE:
             support.onLinkageDeclared(statement);
             break;
index fc28e13d1178e79c4672bb03b84205044a5c58df..6fc637b59d024581f6f6ee80ca0f54a50988ce51 100644 (file)
@@ -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<String, ImportStatement, EffectiveStatement<String, ImportStatement>> stmt) {
+        final String moduleName = stmt.getStatementArgument();
+        final ModelActionBuilder importAction = stmt.newInferenceAction(SOURCE_PRE_LINKAGE);
+        final Prerequisite<StmtContext<?, ?, ?>> imported = importAction.requiresCtx(stmt,
+                PreLinkageModuleNamespace.class, moduleName, SOURCE_PRE_LINKAGE);
+        final Prerequisite<Mutable<?, ?, ?>> 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<? extends Prerequisite<?>> failed) {
+                InferenceException.throwIf(failed.contains(imported), stmt.getStatementSourceReference(),
+                        "Imported module [%s] was not found.", moduleName);
+            }
+        });
+    }
+
     @Override
     public void onLinkageDeclared(
             final Mutable<String, ImportStatement, EffectiveStatement<String, ImportStatement>> stmt) {
index 1f3722c9f4bc5f6e2ebcf1343fbf6cfa1205fa73..44c4194cf233f59ab7623cda62d686cd14057bdc 100644 (file)
@@ -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<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> 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<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> stmt) {
 
index 05fb288c5b374a75a9bb0cbea3c04342a8fa5f53..a41a1a9de3f6cbe0a20cbd2abcaf2514e31278fd 100644 (file)
@@ -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;
                 }
             }
         }
index 4d3889680341b395dd4afad053a469a4ee38f287..7255a7165af08f24bddae56d05be8e24d0c2ecf5 100644 (file)
@@ -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<ModelProcessingPhase, StatementSupportBundle> RFC6020_BUNDLES = ImmutableMap
             .<ModelProcessingPhase, StatementSupportBundle> 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)
index 148133b94ca3d038bec603814aff2f7e601be32a..3080e48b5e4bbfc4ced75a4ff00f085b9197f763 100644 (file)
@@ -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);
index 9063f595741ea9d783e04064b3c8856822c3e081..c86b84f4223e6f1807846f8c970e0c270edc2a90 100644 (file)
@@ -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
index 7e1189f90034e3442f65e266a9457418df441a67..f1003b82520d08a6138263133395c3e9ec026806 100644 (file)
@@ -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());
         }
     }
 
index 4bd9f8e8a83f2870c506f445dc338ece727892fc..e388750e000daa299d110b84a96a442b8f9110a6 100644 (file)
@@ -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<Module> modules = TestUtils.loadModules(getClass().getResource
                 ("/substatement-validator/missing-element").toURI());