X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-maven-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang2sources%2Fplugin%2FYangToSourcesProcessor.java;h=0402e8b8a36517b6378e1bb2082a23208adbfe64;hb=6445362084c167640d41a1dec9127899fb54b8c0;hp=7a49d58e09df3810fee9c951e0f389529d3dcc54;hpb=ecdd01a0527b45b556e216fb9452e0a129dc08fd;p=yangtools.git diff --git a/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java b/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java index 7a49d58e09..0402e8b8a3 100644 --- a/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java +++ b/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java @@ -32,8 +32,10 @@ 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; @@ -41,7 +43,6 @@ class YangToSourcesProcessor { static final String LOG_PREFIX = "yang-to-sources:"; static final String META_INF_YANG_STRING = "META-INF" + File.separator + "yang"; static final String META_INF_YANG_STRING_JAR = "META-INF" + "/" + "yang"; - static final File META_INF_YANG_DIR = new File(META_INF_YANG_STRING); private final Log log; private final File yangFilesRootDir; @@ -50,7 +51,7 @@ class YangToSourcesProcessor { private final MavenProject project; private final boolean inspectDependencies; private final BuildContext buildContext; - private YangProvider yangProvider; + private final YangProvider yangProvider; @VisibleForTesting YangToSourcesProcessor(Log log, File yangFilesRootDir, File[] excludedFiles, List codeGenerators, @@ -181,35 +182,50 @@ class YangToSourcesProcessor { static class YangProvider { - private static final String YANG_RESOURCE_DIR = "target" + File.separator + "yang"; - void addYangsToMetaInf(Log log, MavenProject project, File yangFilesRootDir, File[] excludedFiles) throws MojoFailureException { - File targetYangDir = new File(project.getBasedir(), YANG_RESOURCE_DIR); + + // copy project's src/main/yang/*.yang to target/generated-sources/yang/META-INF/yang/*.yang + + File generatedYangDir = new File(project.getBasedir(), CodeGeneratorArg.YANG_GENERATED_DIR); + addYangsToMetaInf(log, project, yangFilesRootDir, excludedFiles, generatedYangDir); + + // Also copy to the actual build output dir if different than "target". When running in + // Eclipse this can differ (eg "target-ide"). + + File actualGeneratedYangDir = new File(project.getBuild().getDirectory(), + CodeGeneratorArg.YANG_GENERATED_DIR.replace("target" + File.separator, "")); + if(!actualGeneratedYangDir.equals(generatedYangDir)) { + addYangsToMetaInf(log, project, yangFilesRootDir, excludedFiles, actualGeneratedYangDir); + } + } + + private void addYangsToMetaInf(Log log, MavenProject project, File yangFilesRootDir, + File[] excludedFiles, File generatedYangDir) + throws MojoFailureException { + + File withMetaInf = new File(generatedYangDir, META_INF_YANG_STRING); + withMetaInf.mkdirs(); try { - Collection files = Util.listFiles(yangFilesRootDir, excludedFiles, null); + Collection files = Util.listFiles(yangFilesRootDir, excludedFiles, log); for (File file : files) { - org.apache.commons.io.FileUtils.copyFile(file, new File(targetYangDir, file.getName())); + org.apache.commons.io.FileUtils.copyFile(file, new File(withMetaInf, file.getName())); } } catch (IOException e) { - String message = "Unable to list yang files into resource folder"; - log.warn(message, e); - throw new MojoFailureException(message, e); + log.warn(String.format("Failed to generate files into root %s", yangFilesRootDir), e); + throw new MojoFailureException("Unable to list yang files into resource folder", e); } - setResource(targetYangDir, META_INF_YANG_STRING_JAR, project); + setResource(generatedYangDir, project); log.debug(Util.message("Yang files from: %s marked as resources: %s", LOG_PREFIX, yangFilesRootDir, META_INF_YANG_STRING_JAR)); } - private static void setResource(File targetYangDir, String targetPath, MavenProject project) { + private static void setResource(File targetYangDir, MavenProject project) { Resource res = new Resource(); res.setDirectory(targetYangDir.getPath()); - if (targetPath != null) { - res.setTargetPath(targetPath); - } project.addResource(res); } } @@ -253,7 +269,7 @@ class YangToSourcesProcessor { 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())); @@ -270,15 +286,19 @@ class YangToSourcesProcessor { 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); - YangProvider.setResource(resourceBaseDir, null, project); + YangProvider.setResource(resourceBaseDir, project); g.setResourceBaseDir(resourceBaseDir); log.debug(Util.message("Folder: %s marked as resources for generator: %s", LOG_PREFIX, resourceBaseDir, codeGeneratorCfg.getCodeGeneratorClass()));