import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import org.apache.commons.io.IOUtils;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
+import org.opendaylight.yangtools.yang.parser.repo.URLSchemaContextResolver;
import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream;
import org.opendaylight.yangtools.yang2sources.plugin.ConfigArg.CodeGeneratorArg;
import org.opendaylight.yangtools.yang2sources.plugin.Util.ContextHolder;
import org.opendaylight.yangtools.yang2sources.plugin.Util.YangsInZipsResult;
+import org.opendaylight.yangtools.yang2sources.spi.BasicCodeGenerator;
import org.opendaylight.yangtools.yang2sources.spi.BuildContextAware;
-import org.opendaylight.yangtools.yang2sources.spi.CodeGenerator;
+import org.opendaylight.yangtools.yang2sources.spi.MavenLogAware;
+import org.opendaylight.yangtools.yang2sources.spi.MavenProjectAware;
import org.sonatype.plexus.build.incremental.BuildContext;
import org.sonatype.plexus.build.incremental.DefaultBuildContext;
private final boolean inspectDependencies;
private final BuildContext buildContext;
private final YangProvider yangProvider;
+ private final URLSchemaContextResolver resolver;
@VisibleForTesting
YangToSourcesProcessor(Log log, File yangFilesRootDir, File[] excludedFiles, List<CodeGeneratorArg> codeGenerators,
this.project = Util.checkNotNull(project, "project");
this.inspectDependencies = inspectDependencies;
this.yangProvider = yangProvider;
+ this.resolver = URLSchemaContextResolver.create("maven-plugin");
}
YangToSourcesProcessor(BuildContext buildContext, Log log, File yangFilesRootDir, File[] excludedFiles, List<CodeGeneratorArg> codeGenerators,
* dependencies.
*/
final Collection<File> yangFilesInProject = Util.listFiles(yangFilesRootDir, excludedFiles, log);
+
+
final Collection<File> allFiles = new ArrayList<>(yangFilesInProject);
if (inspectDependencies) {
allFiles.addAll(Util.findYangFilesInDependencies(log, project));
final List<InputStream> yangsInProject = new ArrayList<>();
for (final File f : yangFilesInProject) {
+ // FIXME: This is hack - normal path should be reported.
yangsInProject.add(new NamedFileInputStream(f, META_INF_YANG_STRING + File.separator + f.getName()));
}
YangsInZipsResult dependentYangResult = Util.findYangFilesInDependenciesAsStream(log, project);
Closeable dependentYangResult1 = dependentYangResult;
closeables.add(dependentYangResult1);
- all.addAll(dependentYangResult.getYangStreams());
+ List<InputStream> yangStreams = toStreamsWithoutDuplicates(dependentYangResult.getYangStreams());
+ all.addAll(yangStreams);
+ closeables.addAll(yangStreams);
}
allYangModules = parser.parseYangModelsFromStreamsMapped(all);
}
}
+ private List<InputStream> toStreamsWithoutDuplicates(List<YangSourceFromDependency> list) throws IOException {
+ ConcurrentMap<String, YangSourceFromDependency> byContent = Maps.newConcurrentMap();
+
+ for (YangSourceFromDependency yangFromDependency : list) {
+ try (InputStream dataStream = yangFromDependency.openStream()) {
+ String contents = IOUtils.toString(dataStream);
+ byContent.putIfAbsent(contents, yangFromDependency);
+ }
+
+ }
+ List<InputStream> inputs = new ArrayList<>(byContent.size());
+ for (YangSourceFromDependency entry : byContent.values()) {
+ inputs.add(entry.openStream());
+ }
+ return inputs;
+ }
+
static class YangProvider {
void addYangsToMetaInf(Log log, MavenProject project, File yangFilesRootDir, File[] excludedFiles)
withMetaInf.mkdirs();
try {
- Collection<File> files = Util.listFiles(yangFilesRootDir, excludedFiles, null);
+ Collection<File> files = Util.listFiles(yangFilesRootDir, excludedFiles, log);
for (File file : files) {
org.apache.commons.io.FileUtils.copyFile(file, new File(withMetaInf, file.getName()));
}
codeGeneratorCfg.check();
- CodeGenerator g = Util.getInstance(codeGeneratorCfg.getCodeGeneratorClass(), CodeGenerator.class);
+ BasicCodeGenerator g = Util.getInstance(codeGeneratorCfg.getCodeGeneratorClass(), BasicCodeGenerator.class);
log.info(Util.message("Code generator instantiated from %s", LOG_PREFIX,
codeGeneratorCfg.getCodeGeneratorClass()));
log.debug(Util.message("Additional configuration picked up for : %s: %s", LOG_PREFIX,
codeGeneratorCfg.getCodeGeneratorClass(), codeGeneratorCfg.getAdditionalConfiguration()));
+ if (g instanceof MavenLogAware) {
+ ((MavenLogAware)g).setLog(log);
+ }
if (g instanceof BuildContextAware) {
((BuildContextAware)g).setBuildContext(buildContext);
}
- g.setLog(log);
- g.setMavenProject(project);
+ if (g instanceof MavenProjectAware) {
+ ((MavenProjectAware)g).setMavenProject(project);
+ }
g.setAdditionalConfig(codeGeneratorCfg.getAdditionalConfiguration());
File resourceBaseDir = codeGeneratorCfg.getResourceBaseDir(project);