/* * Copyright (c) 2015 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.stmt.reactor; import com.google.common.collect.ImmutableMap; import com.google.common.io.ByteSource; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportBundle; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext; import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream; public class CrossSourceStatementReactor { private final Map supportedTerminology; private final Map> supportedValidation; CrossSourceStatementReactor(final Map supportedTerminology) { this.supportedTerminology = ImmutableMap.copyOf(supportedTerminology); this.supportedValidation = ImmutableMap.of(); } CrossSourceStatementReactor(final Map supportedTerminology, final Map> supportedValidation) { this.supportedTerminology = ImmutableMap.copyOf(supportedTerminology); this.supportedValidation = ImmutableMap.copyOf(supportedValidation); } public static final Builder builder() { return new Builder(); } public final BuildAction newBuild() { return new BuildAction(); } public static class Builder implements org.opendaylight.yangtools.concepts.Builder{ final Map bundles = new EnumMap<>(ModelProcessingPhase.class); final Map> validationBundles = new EnumMap<>(ValidationBundleType.class); public Builder setBundle(final ModelProcessingPhase phase,final StatementSupportBundle bundle) { bundles.put(phase, bundle); return this; } public Builder setValidationBundle(final ValidationBundleType type, final Collection validationBundle) { validationBundles.put(type,validationBundle); return this; } @Override public CrossSourceStatementReactor build() { return new CrossSourceStatementReactor(bundles, validationBundles); } } public class BuildAction { private final BuildGlobalContext context; public BuildAction() { this.context = new BuildGlobalContext(supportedTerminology, supportedValidation); } public void addSource(final StatementStreamSource source) { context.addSource(source); } public void addSources(final StatementStreamSource... sources) { for (StatementStreamSource source : sources) { context.addSource(source); } } public EffectiveModelContext build() throws SourceException, ReactorException { return context.build(); } public EffectiveSchemaContext buildEffective() throws SourceException, ReactorException { return context.buildEffective(); } public SchemaContext buildEffective(final Collection yangByteSources) throws SourceException, ReactorException, IOException { for (ByteSource yangByteSource : yangByteSources) { addSource(new YangStatementSourceImpl(yangByteSource.openStream())); } return buildEffective(); } public SchemaContext buildEffective(final List yangInputStreams) throws SourceException, ReactorException { for (InputStream yangInputStream : yangInputStreams) { addSource(new YangStatementSourceImpl(yangInputStream)); } return buildEffective(); } /** * @deprecated This method was never used and relies on deprecated module methods. */ @Deprecated public Map buildEffectiveMappedToSource(final List yangFiles) throws SourceException, ReactorException, FileNotFoundException { if (yangFiles == null || yangFiles.isEmpty()) { return Collections.emptyMap(); } Map pathToFile = new HashMap<>(); Map sourceFileToModule = new HashMap<>(); for (File yangFile : yangFiles) { addSource(new YangStatementSourceImpl(new NamedFileInputStream(yangFile, yangFile.getPath()))); pathToFile.put(yangFile.getPath(), yangFile); } EffectiveSchemaContext schema = buildEffective(); Set modules = schema.getModules(); for (Module module : modules) { sourceFileToModule.put(pathToFile.get(module.getModuleSourcePath()), module); } return sourceFileToModule; } } }