CAMEL-7999: Maven plugin to generate a list of all Camel components.

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7859c308
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7859c308
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7859c308

Branch: refs/heads/master
Commit: 7859c30880b926a9addf1435f007804df5bd4644
Parents: 44a18c6
Author: Claus Ibsen <davscl...@apache.org>
Authored: Fri Nov 14 08:00:43 2014 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Fri Nov 14 08:03:00 2014 +0100

----------------------------------------------------------------------
 .../maven/packaging/PrepareCatalogMojo.java     | 96 +++++++++++++++++---
 1 file changed, 83 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/7859c308/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
----------------------------------------------------------------------
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
index 70d8e11..0e38504 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
@@ -35,7 +35,8 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 
 /**
- * Analyses the Camel plugins in a project and generates extra descriptor 
information for easier auto-discovery in Camel.
+ * Prepares the camel catalog to include component descriptors, and generates 
a report with components which have not been migrated
+ * to include component json descriptors.
  *
  * @goal prepare-catalog
  * @execute phase="process-resources"
@@ -92,32 +93,60 @@ public class PrepareCatalogMojo extends AbstractMojo {
     public void execute() throws MojoExecutionException, MojoFailureException {
         getLog().info("Copying all Camel component json descriptors");
 
-        Set<File> files = new LinkedHashSet<File>();
+        Set<File> jsonFiles = new LinkedHashSet<File>();
+        Set<File> duplicateJsonFiles = new LinkedHashSet<File>();
+        Set<File> componentFiles = new LinkedHashSet<File>();
+        Set<File> missingComponents = new LinkedHashSet<File>();
 
         // find all json files in components and camel-core
         if (componentsDir != null && componentsDir.isDirectory()) {
             File[] components = componentsDir.listFiles();
             if (components != null) {
                 for (File dir : components) {
-                    if (dir.isDirectory()) {
+                    if (dir.isDirectory() && !"target".equals(dir.getName())) {
                         File target = new File(dir, "target/classes");
-                        findFilesRecursive(target, files, new 
JsonAndDirFileFilter());
+
+                        int before = componentFiles.size();
+                        int before2 = jsonFiles.size();
+
+                        findFilesRecursive(target, jsonFiles, componentFiles, 
new CamelComponentsFileFilter());
+
+                        int after = componentFiles.size();
+                        int after2 = jsonFiles.size();
+                        if (before != after && before2 == after2) {
+                            missingComponents.add(dir);
+                        }
+
                     }
                 }
             }
         }
         if (coreDir != null && coreDir.isDirectory()) {
             File target = new File(coreDir, "target/classes");
-            findFilesRecursive(target, files, new JsonAndDirFileFilter());
+
+            int before = componentFiles.size();
+            int before2 = jsonFiles.size();
+
+            findFilesRecursive(target, jsonFiles, componentFiles, new 
CamelComponentsFileFilter());
+
+            int after = componentFiles.size();
+            int after2 = jsonFiles.size();
+            if (before != after && before2 == after2) {
+                missingComponents.add(coreDir);
+            }
         }
 
-        getLog().info("Found " + files.size() + " component json files");
+        getLog().info("Found " + jsonFiles.size() + " component json files");
 
         // make sure to create out dir
         outDir.mkdirs();
 
-        for (File file : files) {
+        for (File file : jsonFiles) {
             File to = new File(outDir, file.getName());
+            if (to.exists()) {
+                duplicateJsonFiles.add(to);
+                getLog().warn("Duplicate component name detected: " + to);
+            }
             try {
                 copyFile(file, to);
             } catch (IOException e) {
@@ -148,30 +177,71 @@ public class PrepareCatalogMojo extends AbstractMojo {
 
             fos.close();
 
-            getLog().info("Camel components catalog includes " + files.size() 
+ " components");
         } catch (IOException e) {
             throw new MojoFailureException("Error writing to file " + all);
         }
+
+        printReport(jsonFiles, duplicateJsonFiles, missingComponents);
+    }
+
+    private void printReport(Set<File> json, Set<File> duplicate, Set<File> 
missing) {
+        
getLog().info("================================================================================");
+        getLog().info("");
+        getLog().info("Camel component catalog report");
+        getLog().info("");
+        getLog().info("\tComponents found: " + json.size());
+        for (File file : json) {
+            getLog().info("\t\t" + asComponentName(file));
+        }
+        getLog().info("");
+        if (!duplicate.isEmpty()) {
+            getLog().warn("\tDuplicate components detected: " + 
duplicate.size());
+            for (File file : duplicate) {
+                getLog().warn("\t\t" + asComponentName(file));
+            }
+        }
+        getLog().info("");
+        if (!missing.isEmpty()) {
+            getLog().warn("\tMissing components detected: " + missing.size());
+            for (File name : missing) {
+                getLog().warn("\t\t" + name.getName());
+            }
+        }
+        getLog().info("");
+        
getLog().info("================================================================================");
+    }
+
+    private static String asComponentName(File file) {
+        String name = file.getName();
+        if (name.endsWith(".json")) {
+            return name.substring(0, name.length() - 5);
+        }
+        return name;
     }
 
-    private void findFilesRecursive(File dir, Set<File> found, FileFilter 
filter) {
+    private void findFilesRecursive(File dir, Set<File> found, Set<File> 
components, FileFilter filter) {
         File[] files = dir.listFiles(filter);
         if (files != null) {
             for (File file : files) {
-                if (file.isFile()) {
+                boolean jsonFile = file.isFile() && 
file.getName().endsWith(".json");
+                boolean componentFile = file.isFile() && 
file.getName().equals("component.properties");
+                if (jsonFile) {
                     found.add(file);
+                } else if (componentFile) {
+                    components.add(file);
                 } else if (file.isDirectory()) {
-                    findFilesRecursive(file, found, filter);
+                    findFilesRecursive(file, found, components, filter);
                 }
             }
         }
     }
 
-    private class JsonAndDirFileFilter implements FileFilter {
+    private class CamelComponentsFileFilter implements FileFilter {
 
         @Override
         public boolean accept(File pathname) {
-            return pathname.isDirectory() || 
pathname.getName().endsWith(".json");
+            return pathname.isDirectory() || 
pathname.getName().endsWith(".json")
+                    || (pathname.isFile() && 
pathname.getName().equals("component.properties"));
         }
     }
 

Reply via email to