- private final Function<SourceIdentifier, ListenableFuture<ASTSchemaSource>> requestSources = new Function<SourceIdentifier, ListenableFuture<ASTSchemaSource>>() {
- @Override
- public ListenableFuture<ASTSchemaSource> apply(final SourceIdentifier input) {
- return repository.getSchemaSource(input, ASTSchemaSource.class);
- }
- };
- private final Cache<Collection<SourceIdentifier>, SchemaContext> cache = CacheBuilder.newBuilder().weakValues().build();
-
- private final AsyncFunction<List<ASTSchemaSource>, SchemaContext> assembleSources = new AsyncFunction<List<ASTSchemaSource>, SchemaContext>() {
- @Override
- public ListenableFuture<SchemaContext> apply(final List<ASTSchemaSource> sources) throws SchemaResolutionException {
- final Map<SourceIdentifier, ASTSchemaSource> srcs =
- Maps.uniqueIndex(sources, ASTSchemaSource.GET_IDENTIFIER);
- final Map<SourceIdentifier, YangModelDependencyInfo> deps =
- Maps.transformValues(srcs, ASTSchemaSource.GET_DEPINFO);
-
- LOG.debug("Resolving dependency reactor {}", deps);
-
- final DependencyResolver res = DependencyResolver.create(deps);
- if (!res.getUnresolvedSources().isEmpty()) {
- LOG.debug("Omitting models {} due to unsatisfied imports {}", res.getUnresolvedSources(), res.getUnsatisfiedImports());
-
- // FIXME: push into DependencyResolver
-
- throw new SchemaResolutionException("Failed to resolve required models",
- res.getResolvedSources(), res.getUnsatisfiedImports());
- }
-
- final Map<SourceIdentifier, ParserRuleContext> asts =
- Maps.transformValues(srcs, ASTSchemaSource.GET_AST);
- final Map<String, NavigableMap<Date, URI>> namespaceContext = BuilderUtils.createYangNamespaceContext(
- asts.values(), Optional.<SchemaContext>absent());
-
- final ParseTreeWalker walker = new ParseTreeWalker();
- final Map<SourceIdentifier, ModuleBuilder> sourceToBuilder = new LinkedHashMap<>();
-
- for (final Entry<SourceIdentifier, ParserRuleContext> entry : asts.entrySet()) {
- final ModuleBuilder moduleBuilder = YangParserListenerImpl.create(namespaceContext, entry.getKey().getName(),
- walker, entry.getValue()).getModuleBuilder();
-
- moduleBuilder.setSource(srcs.get(entry.getKey()).getYangText());
- sourceToBuilder.put(entry.getKey(), moduleBuilder);
- }
- LOG.debug("Modules ready for integration");
-
- final YangParserImpl parser = YangParserImpl.getInstance();
- final Collection<Module> modules = parser.buildModules(sourceToBuilder.values());
- LOG.debug("Integrated cross-references modules");
- return Futures.immediateCheckedFuture(parser.assembleContext(modules));
- }
- };
-
- private final SharedSchemaRepository repository;
- // FIXME: ignored right now
- private final SchemaSourceFilter filter;
-
- // FIXME SchemaRepository should be the type for repository parameter instead of SharedSchemaRepository (final implementation)
- public SharedSchemaContextFactory(final SharedSchemaRepository repository, final SchemaSourceFilter filter) {
- this.repository = Preconditions.checkNotNull(repository);
- this.filter = Preconditions.checkNotNull(filter);
+ private final Cache<Collection<SourceIdentifier>, EffectiveModelContext> revisionCache = CacheBuilder.newBuilder()
+ .weakValues().build();
+ private final Cache<Collection<SourceIdentifier>, EffectiveModelContext> semVerCache = CacheBuilder.newBuilder()
+ .weakValues().build();
+ private final @NonNull SharedSchemaRepository repository;
+ private final @NonNull SchemaContextFactoryConfiguration config;
+
+ SharedSchemaContextFactory(final @NonNull SharedSchemaRepository repository,
+ final @NonNull SchemaContextFactoryConfiguration config) {
+ this.repository = requireNonNull(repository);
+ this.config = requireNonNull(config);