BUG-7568: Use YangTextSchemaSource to emit schema files
[yangtools.git] / yang / yang-maven-plugin / src / main / java / org / opendaylight / yangtools / yang2sources / plugin / YangProvider.java
index 29d72b513a09c629d81915e8558d709701a37d8b..b9c2ac9959a3b9f343aced80a1be0696f8bf393f 100644 (file)
@@ -7,48 +7,54 @@
  */
 package org.opendaylight.yangtools.yang2sources.plugin;
 
+import com.google.common.io.Files;
 import java.io.File;
 import java.io.IOException;
 import java.util.Collection;
 import org.apache.maven.model.Resource;
-import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
+import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-class YangProvider {
-    private static final Logger LOG = LoggerFactory.getLogger(YangProvider.class);
+abstract class YangProvider {
+    private static final class Default extends YangProvider {
+        private static final Logger LOG = LoggerFactory.getLogger(YangProvider.class);
 
-    void addYangsToMetaInf(final MavenProject project, final File yangFilesRootDir,
-            final Collection<File> excludedFiles) throws MojoFailureException {
+        @Override
+        void addYangsToMetaInf(final MavenProject project, final Collection<YangTextSchemaSource> modelsInProject)
+                throws IOException {
 
-        // copy project's src/main/yang/*.yang to target/generated-sources/yang/META-INF/yang/*.yang
-        File generatedYangDir = new GeneratedDirectories(project).getYangDir();
-        addYangsToMetaInf(project, yangFilesRootDir, excludedFiles, generatedYangDir);
-    }
+            final File generatedYangDir = new GeneratedDirectories(project).getYangDir();
+            LOG.debug("Generated dir {}", generatedYangDir);
 
-    private static void addYangsToMetaInf(final MavenProject project, final File yangFilesRootDir,
-            final Collection<File> excludedFiles, final File generatedYangDir) throws MojoFailureException {
+            // copy project's src/main/yang/*.yang to ${project.builddir}/generated-sources/yang/META-INF/yang/
+            // This honors setups like a Eclipse-profile derived one
+            final File withMetaInf = new File(generatedYangDir, YangToSourcesProcessor.META_INF_YANG_STRING);
+            withMetaInf.mkdirs();
 
-        File withMetaInf = new File(generatedYangDir, YangToSourcesProcessor.META_INF_YANG_STRING);
-        withMetaInf.mkdirs();
+            for (YangTextSchemaSource source : modelsInProject) {
+                final String fileName = source.getIdentifier().toYangFilename();
+                final File file = new File(withMetaInf, fileName);
 
-        try {
-            Collection<File> files = Util.listFiles(yangFilesRootDir, excludedFiles);
-            for (File file : files) {
-                org.apache.commons.io.FileUtils.copyFile(file, new File(withMetaInf, file.getName()));
+                source.copyTo(Files.asByteSink(file));
+                LOG.debug("Created file {} for {}", file, source.getIdentifier());
             }
-        } catch (IOException e) {
-            LOG.warn("Failed to generate files into root {}", yangFilesRootDir, e);
-            throw new MojoFailureException("Unable to list yang files into resource folder", e);
+
+            setResource(generatedYangDir, project);
+            LOG.debug("{} YANG files marked as resources: {}", YangToSourcesProcessor.LOG_PREFIX, generatedYangDir);
         }
+    }
 
-        setResource(generatedYangDir, project);
+    private static final YangProvider DEFAULT = new Default();
 
-        LOG.debug("{} Yang files from: {} marked as resources: {}", YangToSourcesProcessor.LOG_PREFIX, yangFilesRootDir,
-                YangToSourcesProcessor.META_INF_YANG_STRING_JAR);
+    static YangProvider getInstance() {
+        return DEFAULT;
     }
 
+    abstract void addYangsToMetaInf(MavenProject project, Collection<YangTextSchemaSource> modelsInProject)
+            throws IOException;
+
     static void setResource(final File targetYangDir, final MavenProject project) {
         Resource res = new Resource();
         res.setDirectory(targetYangDir.getPath());