Refactor InferenceAction
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / ImportStatementDefinition.java
index f72c3ebe73562456e3ae249b1ff0653e72d22c27..c429537e9137522aeda8f7b781d5a719695ca07f 100644 (file)
@@ -11,7 +11,6 @@ import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPha
 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;
@@ -19,18 +18,19 @@ import java.util.Date;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NavigableMap;
+import java.util.Optional;
 import org.opendaylight.yangtools.concepts.SemVer;
 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
-import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
 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.model.util.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;
@@ -38,6 +38,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SemanticVersionModuleNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SemanticVersionNamespace;
@@ -49,19 +50,20 @@ import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToSemVerModule
 import org.opendaylight.yangtools.yang.parser.spi.source.ImportedModuleContext;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleIdentifier;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ImportEffectiveStatementImpl;
 
 public class ImportStatementDefinition extends
         AbstractStatementSupport<String, ImportStatement, EffectiveStatement<String, ImportStatement>> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator
-            .builder(Rfc6020Mapping.IMPORT)
-            .addMandatory(Rfc6020Mapping.PREFIX)
-            .addOptional(Rfc6020Mapping.REVISION_DATE)
-            .addOptional(SupportedExtensionsMapping.SEMANTIC_VERSION)
+            .builder(YangStmtMapping.IMPORT)
+            .addMandatory(YangStmtMapping.PREFIX)
+            .addOptional(YangStmtMapping.REVISION_DATE)
+            .addOptional(SupportedExtensionsMapping.OPENCONFIG_VERSION)
             .build();
 
     public ImportStatementDefinition() {
-        super(Rfc6020Mapping.IMPORT);
+        super(YangStmtMapping.IMPORT);
     }
 
     @Override
@@ -80,15 +82,15 @@ public class ImportStatementDefinition extends
         return new ImportEffectiveStatementImpl(ctx);
     }
 
-    @Override
-    public void onFullDefinitionDeclared(
-            final Mutable<String, ImportStatement, EffectiveStatement<String, ImportStatement>> stmt) {
-        super.onFullDefinitionDeclared(stmt);
-        SUBSTATEMENT_VALIDATOR.validate(stmt);
-    }
-
     @Override
     public void onPreLinkageDeclared(final Mutable<String, ImportStatement, EffectiveStatement<String, ImportStatement>> stmt) {
+        /*
+         * Add ModuleIdentifier of a module which is required by this module.
+         * Based on this information, required modules are searched from library
+         * sources.
+         */
+        stmt.addRequiredModule(RevisionImport.getImportedModuleIdentifier(stmt));
+
         final String moduleName = stmt.getStatementArgument();
         final ModelActionBuilder importAction = stmt.newInferenceAction(SOURCE_PRE_LINKAGE);
         final Prerequisite<StmtContext<?, ?, ?>> imported = importAction.requiresCtx(stmt,
@@ -98,14 +100,16 @@ public class ImportStatementDefinition extends
 
         importAction.apply(new InferenceAction() {
             @Override
-            public void apply() {
-                StmtContext<?, ?, ?> importedModuleContext = imported.get();
+            public void apply(final InferenceContext ctx) {
+                final StmtContext<?, ?, ?> importedModuleContext = imported.resolve(ctx);
                 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);
+                final String impPrefix = SourceException.throwIfNull(
+                    firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class),
+                    stmt.getStatementSourceReference(), "Missing prefix statement");
+
                 stmt.addToNs(ImpPrefixToNamespace.class, impPrefix, importedModuleNamespace);
             }
 
@@ -127,6 +131,11 @@ public class ImportStatementDefinition extends
         }
     }
 
+    @Override
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
+    }
+
     private static class RevisionImport {
 
         private RevisionImport() {
@@ -144,11 +153,11 @@ public class ImportStatementDefinition extends
 
             importAction.apply(new InferenceAction() {
                 @Override
-                public void apply() {
+                public void apply(final InferenceContext ctx) {
                     StmtContext<?, ?, ?> importedModule = null;
                     ModuleIdentifier importedModuleIdentifier = null;
                     if (impIdentifier.getRevision() == SimpleDateFormatUtil.DEFAULT_DATE_IMP) {
-                        Entry<ModuleIdentifier, StmtContext<?, ModuleStatement, EffectiveStatement<String, ModuleStatement>>> recentModuleEntry = findRecentModule(
+                        final Entry<ModuleIdentifier, StmtContext<?, ModuleStatement, EffectiveStatement<String, ModuleStatement>>> recentModuleEntry = findRecentModule(
                                 impIdentifier, stmt.getAllFromNamespace(ModuleNamespace.class));
                         if (recentModuleEntry != null) {
                             importedModuleIdentifier = recentModuleEntry.getKey();
@@ -157,12 +166,12 @@ public class ImportStatementDefinition extends
                     }
 
                     if (importedModule == null || importedModuleIdentifier == null) {
-                        importedModule = imported.get();
+                        importedModule = imported.resolve(ctx);
                         importedModuleIdentifier = impIdentifier;
                     }
 
-                    linkageTarget.get().addToNs(ImportedModuleContext.class, importedModuleIdentifier, importedModule);
-                    String impPrefix = firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class);
+                    linkageTarget.resolve(ctx).addToNs(ImportedModuleContext.class, importedModuleIdentifier, importedModule);
+                    final String impPrefix = firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class);
                     stmt.addToNs(ImpPrefixToModuleIdentifier.class, impPrefix, importedModuleIdentifier);
 
                     final URI modNs = firstAttributeOf(importedModule.declaredSubstatements(), NamespaceStatement.class);
@@ -187,7 +196,7 @@ public class ImportStatementDefinition extends
             ModuleIdentifier recentModuleIdentifier = impIdentifier;
             Entry<ModuleIdentifier, StmtContext<?, ModuleStatement, EffectiveStatement<String, ModuleStatement>>> recentModuleEntry = null;
 
-            for (Entry<ModuleIdentifier, StmtContext<?, ModuleStatement, EffectiveStatement<String, ModuleStatement>>> moduleEntry : allModules
+            for (final Entry<ModuleIdentifier, StmtContext<?, ModuleStatement, EffectiveStatement<String, ModuleStatement>>> moduleEntry : allModules
                     .entrySet()) {
                 final ModuleIdentifier id = moduleEntry.getKey();
 
@@ -201,14 +210,13 @@ public class ImportStatementDefinition extends
             return recentModuleEntry;
         }
 
-        private static ModuleIdentifier getImportedModuleIdentifier(final Mutable<String, ImportStatement, ?> stmt) {
+        private static ModuleIdentifier getImportedModuleIdentifier(final StmtContext<String, ImportStatement, ?> stmt) {
             Date revision = firstAttributeOf(stmt.declaredSubstatements(), RevisionDateStatement.class);
             if (revision == null) {
                 revision = SimpleDateFormatUtil.DEFAULT_DATE_IMP;
             }
 
-            return new ModuleIdentifierImpl(stmt.getStatementArgument(), Optional.absent(),
-                    Optional.of(revision));
+            return ModuleIdentifierImpl.create(stmt.getStatementArgument(), Optional.empty(), Optional.of(revision));
         }
     }
 
@@ -228,8 +236,8 @@ public class ImportStatementDefinition extends
 
             importAction.apply(new InferenceAction() {
                 @Override
-                public void apply() {
-                    Entry<SemVer, StmtContext<?, ?, ?>> importedModuleEntry= findRecentCompatibleModuleEntry(
+                public void apply(final InferenceContext ctx) {
+                    final Entry<SemVer, StmtContext<?, ?, ?>> importedModuleEntry= findRecentCompatibleModuleEntry(
                             impIdentifier.getName(), stmt);
 
                     StmtContext<?, ?, ?> importedModule = null;
@@ -245,8 +253,8 @@ public class ImportStatementDefinition extends
                                         .getName(), getRequestedImportVersion(stmt));
                     }
 
-                    linkageTarget.get().addToNs(ImportedModuleContext.class, importedModuleIdentifier, importedModule);
-                    String impPrefix = firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class);
+                    linkageTarget.resolve(ctx).addToNs(ImportedModuleContext.class, importedModuleIdentifier, importedModule);
+                    final String impPrefix = firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class);
                     stmt.addToNs(ImpPrefixToModuleIdentifier.class, impPrefix, importedModuleIdentifier);
                     stmt.addToNs(ImpPrefixToSemVerModuleIdentifier.class, impPrefix, semVerModuleIdentifier);
 
@@ -265,7 +273,7 @@ public class ImportStatementDefinition extends
             });
         }
 
-        private static SemVer getRequestedImportVersion(final Mutable<?, ?, ?> impStmt) {
+        private static SemVer getRequestedImportVersion(final StmtContext<?, ?, ?> impStmt) {
             SemVer requestedImportVersion = impStmt.getFromNamespace(SemanticVersionNamespace.class, impStmt);
             if (requestedImportVersion == null) {
                 requestedImportVersion = Module.DEFAULT_SEMANTIC_VERSION;
@@ -274,7 +282,7 @@ public class ImportStatementDefinition extends
         }
 
         private static Entry<SemVer, StmtContext<?, ?, ?>> findRecentCompatibleModuleEntry(final String moduleName,
-                final Mutable<String, ImportStatement, EffectiveStatement<String, ImportStatement>> impStmt) {
+                final StmtContext<String, ImportStatement, EffectiveStatement<String, ImportStatement>> impStmt) {
             NavigableMap<SemVer, StmtContext<?, ?, ?>> allRelevantModulesMap = impStmt.getFromNamespace(
                     SemanticVersionModuleNamespace.class, moduleName);
             if (allRelevantModulesMap == null) {
@@ -291,15 +299,16 @@ public class ImportStatementDefinition extends
             return null;
         }
 
-        private static ModuleIdentifier getImportedModuleIdentifier(final Mutable<String, ImportStatement, ?> impStmt) {
-            return new ModuleIdentifierImpl(impStmt.getStatementArgument(), Optional.absent(),
+        private static ModuleIdentifier getImportedModuleIdentifier(final StmtContext<String, ImportStatement, ?> impStmt) {
+            return ModuleIdentifierImpl.create(impStmt.getStatementArgument(), Optional.empty(),
                     Optional.of(SimpleDateFormatUtil.DEFAULT_DATE_IMP));
         }
 
         private static ModuleIdentifier createSemVerModuleIdentifier(final ModuleIdentifier importedModuleIdentifier,
                 final SemVer semVer) {
-            return new ModuleIdentifierImpl(importedModuleIdentifier.getName(), Optional.fromNullable(importedModuleIdentifier
-                    .getNamespace()), Optional.of(importedModuleIdentifier.getRevision()), semVer);
+            return ModuleIdentifierImpl.create(importedModuleIdentifier.getName(),
+                Optional.ofNullable(importedModuleIdentifier.getNamespace()),
+                Optional.of(importedModuleIdentifier.getRevision()), semVer);
         }
     }
 }