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;
}
};
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;
@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);
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
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",
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();
reactor.addSource(new YangStatementSourceImpl(e.getKey(), (StatementContext) parserRuleCtx));
}
- SchemaContext schemaContext = reactor.buildEffective();
+ final SchemaContext schemaContext = reactor.buildEffective();
return Futures.immediateCheckedFuture(schemaContext);
}