Bug 4662: Introduce a SemanticVersion concept - SchemaContextFactory
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / repo / SharedSchemaContextFactory.java
index 1594fd4212704836a7207008bfb619f9cafd67b6..7b40342003c575eca5692f0f88d4ca6ad827a441 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.yangtools.yang.model.repo.api.SchemaContextFactory;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceFilter;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.repo.api.StatementParserMode;
 import org.opendaylight.yangtools.yang.parser.impl.util.YangModelDependencyInfo;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
@@ -60,6 +61,7 @@ final class SharedSchemaContextFactory implements SchemaContextFactory {
         }
     };
     private final Cache<Collection<SourceIdentifier>, SchemaContext> cache = CacheBuilder.newBuilder().weakValues().build();
+    private final Cache<Collection<SourceIdentifier>, SchemaContext> semVerCache = CacheBuilder.newBuilder().weakValues().build();
     private final SharedSchemaRepository repository;
     // FIXME: ignored right now
     private final SchemaSourceFilter filter;
@@ -72,7 +74,14 @@ final class SharedSchemaContextFactory implements SchemaContextFactory {
 
     @Override
     public CheckedFuture<SchemaContext, SchemaResolutionException> createSchemaContext(
-            final Collection<SourceIdentifier> requiredSources, java.util.function.Predicate<QName> isFeatureSupported) {
+            final Collection<SourceIdentifier> requiredSources, final StatementParserMode statementParserMode,
+            final java.util.function.Predicate<QName> isFeatureSupported) {
+        return createSchemaContext(requiredSources,
+                statementParserMode == StatementParserMode.SEMVER_MODE ? this.semVerCache : this.cache,
+                new AssembleSources(isFeatureSupported, statementParserMode));
+    }
+
+    private CheckedFuture<SchemaContext, SchemaResolutionException> createSchemaContext(final Collection<SourceIdentifier> requiredSources, final Cache<Collection<SourceIdentifier>, SchemaContext> cache, final AsyncFunction<List<ASTSchemaSource>, SchemaContext> assembleSources) {
         // Make sources unique
         final List<SourceIdentifier> uniqueSourceIdentifiers = deDuplicateSources(requiredSources);
 
@@ -91,7 +100,6 @@ final class SharedSchemaContextFactory implements SchemaContextFactory {
         sf = Futures.transform(sf, new SourceIdMismatchDetector(uniqueSourceIdentifiers));
 
         // Assemble sources into a schema context
-        final AssembleSources assembleSources = new AssembleSources(isFeatureSupported);
         final ListenableFuture<SchemaContext> cf = Futures.transform(sf, assembleSources);
 
         // Populate cache when successful
@@ -166,22 +174,33 @@ final class SharedSchemaContextFactory implements SchemaContextFactory {
     private static final class AssembleSources implements AsyncFunction<List<ASTSchemaSource>, SchemaContext> {
 
         private final java.util.function.Predicate<QName> isFeatureSupported;
+        private final StatementParserMode statementParserMode;
+        private final Function<ASTSchemaSource, SourceIdentifier> getIdentifier;
 
-        private AssembleSources(final java.util.function.Predicate<QName> isFeatureSupported) {
+        private AssembleSources(final java.util.function.Predicate<QName> isFeatureSupported,
+                final StatementParserMode statementParserMode) {
             this.isFeatureSupported = Preconditions.checkNotNull(isFeatureSupported);
+            this.statementParserMode = Preconditions.checkNotNull(statementParserMode);
+            switch (statementParserMode) {
+            case SEMVER_MODE:
+                this.getIdentifier = ASTSchemaSource.GET_SEMVER_IDENTIFIER;
+                break;
+            default:
+                this.getIdentifier = ASTSchemaSource.GET_IDENTIFIER;
+            }
         }
 
         @Override
-        public ListenableFuture<SchemaContext> apply(List<ASTSchemaSource> sources) throws SchemaResolutionException,
+        public ListenableFuture<SchemaContext> apply(final List<ASTSchemaSource> sources) throws SchemaResolutionException,
                 SourceException, ReactorException {
-            final Map<SourceIdentifier, ASTSchemaSource> srcs =
-                    Maps.uniqueIndex(sources, ASTSchemaSource.GET_IDENTIFIER);
+            final Map<SourceIdentifier, ASTSchemaSource> srcs = Maps.uniqueIndex(sources, getIdentifier);
             final Map<SourceIdentifier, YangModelDependencyInfo> deps =
                     Maps.transformValues(srcs, ASTSchemaSource.GET_DEPINFO);
 
             LOG.debug("Resolving dependency reactor {}", deps);
 
-            final DependencyResolver res = DependencyResolver.create(deps);
+            final DependencyResolver res = this.statementParserMode == StatementParserMode.SEMVER_MODE ? SemVerDependencyResolver
+                    .create(deps) : RevisionDependencyResolver.create(deps);
             if (!res.getUnresolvedSources().isEmpty()) {
                 LOG.debug("Omitting models {} due to unsatisfied imports {}", res.getUnresolvedSources(), res.getUnsatisfiedImports());
                 throw new SchemaResolutionException("Failed to resolve required models",
@@ -190,7 +209,7 @@ final class SharedSchemaContextFactory implements SchemaContextFactory {
 
             final Map<SourceIdentifier, ParserRuleContext> asts = Maps.transformValues(srcs, ASTSchemaSource.GET_AST);
             final CrossSourceStatementReactor.BuildAction reactor =
-                    YangInferencePipeline.RFC6020_REACTOR.newBuild(isFeatureSupported);
+                    YangInferencePipeline.RFC6020_REACTOR.newBuild(statementParserMode, isFeatureSupported);
 
             for (final Entry<SourceIdentifier, ParserRuleContext> e : asts.entrySet()) {
                 final ParserRuleContext parserRuleCtx = e.getValue();
@@ -200,7 +219,7 @@ final class SharedSchemaContextFactory implements SchemaContextFactory {
                 reactor.addSource(new YangStatementSourceImpl(e.getKey(), (StatementContext) parserRuleCtx));
             }
 
-            SchemaContext schemaContext = reactor.buildEffective();
+            final SchemaContext schemaContext = reactor.buildEffective();
 
             return Futures.immediateCheckedFuture(schemaContext);
         }