Expanded UnknownSchemaNode implementation, refactored java source code generation.
[controller.git] / opendaylight / sal / yang-prototype / code-generator / maven-yang-plugin / src / main / java / org / opendaylight / controller / yang2sources / plugin / YangToSourcesMojo.java
index 29282988d6ef267b82f2e1383ca8eb1653d716be..41f3ae4a65a5f45e2e64f87b6a4ba9cddaf14c3c 100644 (file)
@@ -8,7 +8,8 @@
 package org.opendaylight.controller.yang2sources.plugin;
 
 import java.io.File;
-import java.util.Arrays;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
@@ -19,6 +20,8 @@ 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.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;
@@ -29,18 +32,44 @@ 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:
+ * <ol>
+ * <li>List yang files from {@link #yangFilesRootDir}</li>
+ * <li>Process yang files using {@link YangModelParserImpl}</li>
+ * <li>For each {@link CodeGenerator} from {@link #codeGenerators}:</li>
+ * <ol>
+ * <li>Instantiate using default constructor</li>
+ * <li>Call {@link CodeGenerator#generateSources(SchemaContext, File)}</li>
+ * </ol>
+ * </ol>
+ */
+@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.
+     */
     @Parameter(required = true)
     private CodeGeneratorArg[] codeGenerators;
 
+    /**
+     * Source directory that will be recursively searched for yang files (ending
+     * with .yang suffix).
+     */
     @Parameter(required = true)
     private String yangFilesRootDir;
 
-    private final YangModelParser parser;
+    @Parameter(property = "project", required = true, readonly = true)
+    protected MavenProject project;
+
+    private transient final YangModelParser parser;
 
     @VisibleForTesting
     YangToSourcesMojo(CodeGeneratorArg[] codeGeneratorArgs,
@@ -67,20 +96,22 @@ public final class YangToSourcesMojo extends AbstractMojo {
      */
     private SchemaContext processYang() throws MojoExecutionException {
         try {
-            String[] yangFiles = Util.listFilesAsArrayOfPaths(yangFilesRootDir);
+            Collection<File> yangFiles = Util.listFiles(yangFilesRootDir);
 
-            if (yangFiles.length == 0)
+            if (yangFiles.isEmpty()) {
                 getLog().warn(
                         Util.message("No %s file found in %s", LOG_PREFIX,
                                 Util.YANG_SUFFIX, yangFilesRootDir));
-            // TODO only warning or throw exception ?
+                return null;
+            }
 
-            Set<Module> parsedYang = parser.parseYangModels(yangFiles);
+            Set<Module> parsedYang = parser
+                    .parseYangModels(new ArrayList<File>(yangFiles));
             SchemaContext resolveSchemaContext = parser
                     .resolveSchemaContext(parsedYang);
             getLog().info(
                     Util.message("%s files parsed from %s", LOG_PREFIX,
-                            Util.YANG_SUFFIX, Arrays.toString(yangFiles)));
+                            Util.YANG_SUFFIX, yangFiles));
             return resolveSchemaContext;
 
             // MojoExecutionException is thrown since execution cannot continue
@@ -136,22 +167,25 @@ public final class YangToSourcesMojo extends AbstractMojo {
      * Instantiate generator from class and call required method
      */
     private void generateSourcesWithOneGenerator(SchemaContext context,
-            CodeGeneratorArg codeGenerator) throws ClassNotFoundException,
-            InstantiationException, IllegalAccessException {
+            CodeGeneratorArg codeGeneratorCfg) throws ClassNotFoundException,
+            InstantiationException, IllegalAccessException, IOException {
 
-        codeGenerator.check();
+        codeGeneratorCfg.check();
 
         CodeGenerator g = Util.getInstance(
-                codeGenerator.getCodeGeneratorClass(), CodeGenerator.class);
+                codeGeneratorCfg.getCodeGeneratorClass(), CodeGenerator.class);
         getLog().info(
                 Util.message("Code generator instantiated from %s", LOG_PREFIX,
-                        codeGenerator.getCodeGeneratorClass()));
+                        codeGeneratorCfg.getCodeGeneratorClass()));
 
-        Collection<File> generated = g.generateSources(context,
-                codeGenerator.getOutputBaseDir());
+        File outputDir = codeGeneratorCfg.getOutputBaseDir();
+        if (project != null && outputDir != null) {
+            project.addCompileSourceRoot(outputDir.getPath());
+        }
+        Collection<File> generated = g.generateSources(context, outputDir);
         getLog().info(
                 Util.message("Sources generated by %s: %s", LOG_PREFIX,
-                        codeGenerator.getCodeGeneratorClass(), generated));
+                        codeGeneratorCfg.getCodeGeneratorClass(), generated));
     }
 
 }