X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsal%2Fyang-prototype%2Fcode-generator%2Fmaven-yang-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fyang2sources%2Fplugin%2FYangToSourcesMojo.java;h=7dbd8568240b802d0c105a309eaca270ab5d1eae;hb=84e8316159f90f224f75e86a606c525e53b2ff7a;hp=05d9c0cd2c54488e5815b4701ec862c7744f89f3;hpb=e52af57ca012beb92aecfda2f8acc2d7ba006468;p=controller.git diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/YangToSourcesMojo.java b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/YangToSourcesMojo.java index 05d9c0cd2c..7dbd856824 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/YangToSourcesMojo.java +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/YangToSourcesMojo.java @@ -8,11 +8,9 @@ package org.opendaylight.controller.yang2sources.plugin; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; -import java.util.Set; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; @@ -22,15 +20,11 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; -import org.opendaylight.controller.yang.model.api.Module; import org.opendaylight.controller.yang.model.api.SchemaContext; -import org.opendaylight.controller.yang.model.parser.api.YangModelParser; -import org.opendaylight.controller.yang.model.parser.impl.YangParserImpl; import org.opendaylight.controller.yang2sources.plugin.ConfigArg.CodeGeneratorArg; import org.opendaylight.controller.yang2sources.spi.CodeGenerator; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.Maps; /** * Generate sources from yang files using user provided set of @@ -48,144 +42,63 @@ import com.google.common.collect.Maps; @Mojo(name = "generate-sources", defaultPhase = LifecyclePhase.GENERATE_SOURCES, requiresDependencyResolution = ResolutionScope.COMPILE, requiresProject = true) public final class YangToSourcesMojo extends AbstractMojo { - private static final String LOG_PREFIX = "yang-to-sources:"; - /** * Classes implementing {@link CodeGenerator} interface. An instance will be - * created out of every class using default constructor. Method - * {@link CodeGenerator#generateSources(SchemaContext, File)} will be called - * on every instance. + * created out of every class using default constructor. Method {@link + * CodeGenerator#generateSources(SchemaContext, File, Set + * yangModulesNames)} will be called on every instance. */ - @Parameter(required = true) + @Parameter(required = false) private CodeGeneratorArg[] codeGenerators; /** * Source directory that will be recursively searched for yang files (ending * with .yang suffix). */ - @Parameter(required = true) - private String yangFilesRootDir; + @Parameter(required = false) + private String yangFilesRootDir; // defaults to ${basedir}/src/main/yang @Parameter(property = "project", required = true, readonly = true) protected MavenProject project; - private transient final YangModelParser parser; + @Parameter(property = "inspectDependencies", required = true, readonly = true) + private boolean inspectDependencies; + + public YangToSourcesMojo() { + + } @VisibleForTesting YangToSourcesMojo(CodeGeneratorArg[] codeGeneratorArgs, - YangModelParser parser, String yangFilesRootDir) { - super(); + String yangFilesRootDir) { this.codeGenerators = codeGeneratorArgs; this.yangFilesRootDir = yangFilesRootDir; - this.parser = parser; - } - - public YangToSourcesMojo() { - super(); - parser = new YangParserImpl(); } @Override public void execute() throws MojoExecutionException, MojoFailureException { - SchemaContext context = processYang(); - generateSources(context); - } - - /** - * Generate {@link SchemaContext} with {@link YangModelParserImpl} - */ - private SchemaContext processYang() throws MojoExecutionException { - try { - Collection yangFiles = Util.listFiles(yangFilesRootDir); - - if (yangFiles.isEmpty()) { - getLog().warn( - Util.message("No %s file found in %s", LOG_PREFIX, - Util.YANG_SUFFIX, yangFilesRootDir)); - return null; - } - - Set parsedYang = parser - .parseYangModels(new ArrayList(yangFiles)); - SchemaContext resolveSchemaContext = parser - .resolveSchemaContext(parsedYang); - getLog().info( - Util.message("%s files parsed from %s", LOG_PREFIX, - Util.YANG_SUFFIX, yangFiles)); - return resolveSchemaContext; - - // MojoExecutionException is thrown since execution cannot continue - } catch (Exception e) { - String message = Util.message("Unable to parse %s files from %s", - LOG_PREFIX, Util.YANG_SUFFIX, yangFilesRootDir); - getLog().error(message, e); - throw new MojoExecutionException(message, e); + List codeGeneratorArgs; + if (codeGenerators == null) { + codeGeneratorArgs = Collections.emptyList(); + } else { + codeGeneratorArgs = Arrays.asList(codeGenerators); } - } - /** - * Call generate on every generator from plugin configuration - */ - private void generateSources(SchemaContext context) - throws MojoFailureException { - if (codeGenerators.length == 0) { - getLog().warn( - Util.message("No code generators provided", LOG_PREFIX)); - return; - } - - Map thrown = Maps.newHashMap(); - - for (CodeGeneratorArg codeGenerator : codeGenerators) { - try { - - generateSourcesWithOneGenerator(context, codeGenerator); - - } catch (Exception e) { - // try other generators, exception will be thrown after - getLog().error( - Util.message( - "Unable to generate sources with %s generator", - LOG_PREFIX, - codeGenerator.getCodeGeneratorClass()), e); - thrown.put(codeGenerator.getCodeGeneratorClass(), e.getClass() - .getCanonicalName()); + // defaults to ${basedir}/src/main/yang + File yangFilesRootFile; + if (yangFilesRootDir == null) { + yangFilesRootFile = new File(project.getBasedir(), "src" + + File.separator + "main" + File.separator + "yang"); + } else { + File file = new File(yangFilesRootDir); + if (file.isAbsolute()) { + yangFilesRootFile = file; + } else { + yangFilesRootFile = new File(project.getBasedir(), + file.getPath()); } } - - if (!thrown.isEmpty()) { - String message = Util - .message( - "One or more code generators failed, including failed list(generatorClass=exception) %s", - LOG_PREFIX, thrown.toString()); - getLog().error(message); - throw new MojoFailureException(message); - } + new YangToSourcesProcessor(getLog(), yangFilesRootFile, + codeGeneratorArgs, project, inspectDependencies).execute(); } - - /** - * Instantiate generator from class and call required method - */ - private void generateSourcesWithOneGenerator(SchemaContext context, - CodeGeneratorArg codeGeneratorCfg) throws ClassNotFoundException, - InstantiationException, IllegalAccessException, IOException { - - codeGeneratorCfg.check(); - - CodeGenerator g = Util.getInstance( - codeGeneratorCfg.getCodeGeneratorClass(), CodeGenerator.class); - getLog().info( - Util.message("Code generator instantiated from %s", LOG_PREFIX, - codeGeneratorCfg.getCodeGeneratorClass())); - - File outputDir = codeGeneratorCfg.getOutputBaseDir(); - if (project != null && outputDir != null) { - project.addCompileSourceRoot(outputDir.getPath()); - } - Collection generated = g.generateSources(context, outputDir); - getLog().info( - Util.message("Sources generated by %s: %s", LOG_PREFIX, - codeGeneratorCfg.getCodeGeneratorClass(), generated)); - } - }