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=29282988d6ef267b82f2e1383ca8eb1653d716be;hpb=78718ca2980d6289703f239abb6b7928ea08c8e4;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 29282988d6..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
@@ -9,9 +9,8 @@ package org.opendaylight.controller.yang2sources.plugin;
import java.io.File;
import java.util.Arrays;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
+import java.util.Collections;
+import java.util.List;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
@@ -19,139 +18,87 @@ import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
-import org.opendaylight.controller.yang.model.api.Module;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.project.MavenProject;
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.YangModelParserImpl;
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;
-@Mojo(name = "generate-sources", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
+/**
+ * Generate sources from yang files using user provided set of
+ * {@link CodeGenerator}s. Steps of this process:
+ *
+ * - List yang files from {@link #yangFilesRootDir}
+ * - Process yang files using {@link YangModelParserImpl}
+ * - For each {@link CodeGenerator} from {@link #codeGenerators}:
+ *
+ * - Instantiate using default constructor
+ * - Call {@link CodeGenerator#generateSources(SchemaContext, File)}
+ *
+ *
+ */
+@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:";
-
- @Parameter(required = true)
+ /**
+ * Classes implementing {@link CodeGenerator} interface. An instance will be
+ * created out of every class using default constructor. Method {@link
+ * CodeGenerator#generateSources(SchemaContext, File, Set
+ * yangModulesNames)} will be called on every instance.
+ */
+ @Parameter(required = false)
private CodeGeneratorArg[] codeGenerators;
- @Parameter(required = true)
- private String yangFilesRootDir;
+ /**
+ * Source directory that will be recursively searched for yang files (ending
+ * with .yang suffix).
+ */
+ @Parameter(required = false)
+ private String yangFilesRootDir; // defaults to ${basedir}/src/main/yang
+
+ @Parameter(property = "project", required = true, readonly = true)
+ protected MavenProject project;
+
+ @Parameter(property = "inspectDependencies", required = true, readonly = true)
+ private boolean inspectDependencies;
+
+ public YangToSourcesMojo() {
- private final YangModelParser parser;
+ }
@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 YangModelParserImpl();
}
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
- SchemaContext context = processYang();
- generateSources(context);
- }
-
- /**
- * Generate {@link SchemaContext} with {@link YangModelParserImpl}
- */
- private SchemaContext processYang() throws MojoExecutionException {
- try {
- String[] yangFiles = Util.listFilesAsArrayOfPaths(yangFilesRootDir);
-
- if (yangFiles.length == 0)
- getLog().warn(
- Util.message("No %s file found in %s", LOG_PREFIX,
- Util.YANG_SUFFIX, yangFilesRootDir));
- // TODO only warning or throw exception ?
-
- Set parsedYang = parser.parseYangModels(yangFiles);
- SchemaContext resolveSchemaContext = parser
- .resolveSchemaContext(parsedYang);
- getLog().info(
- Util.message("%s files parsed from %s", LOG_PREFIX,
- Util.YANG_SUFFIX, Arrays.toString(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);
- }
- }
-
- /**
- * 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;
+ List codeGeneratorArgs;
+ if (codeGenerators == null) {
+ codeGeneratorArgs = Collections.emptyList();
+ } else {
+ codeGeneratorArgs = Arrays.asList(codeGenerators);
}
- 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 codeGenerator) throws ClassNotFoundException,
- InstantiationException, IllegalAccessException {
-
- codeGenerator.check();
-
- CodeGenerator g = Util.getInstance(
- codeGenerator.getCodeGeneratorClass(), CodeGenerator.class);
- getLog().info(
- Util.message("Code generator instantiated from %s", LOG_PREFIX,
- codeGenerator.getCodeGeneratorClass()));
-
- Collection generated = g.generateSources(context,
- codeGenerator.getOutputBaseDir());
- getLog().info(
- Util.message("Sources generated by %s: %s", LOG_PREFIX,
- codeGenerator.getCodeGeneratorClass(), generated));
- }
-
}