This is an automated email from the ASF dual-hosted git repository.

davidb pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-analyser.git


The following commit(s) were added to refs/heads/master by this push:
     new 2803677  SLING-7716 Make it possible to run a specific plugin with the 
Feature Model Analyser
2803677 is described below

commit 28036776c67eb4d25ac6f97cd7c2a215bc1f25ed
Author: David Bosschaert <[email protected]>
AuthorDate: Fri Jun 8 13:47:53 2018 +0100

    SLING-7716 Make it possible to run a specific plugin with the Feature Model 
Analyser
---
 pom.xml                                            |  9 +++-
 .../apache/sling/feature/analyser/Analyser.java    | 47 ++++++++++--------
 .../apache/sling/feature/analyser/main/Main.java   | 57 +++++++++++++++++-----
 3 files changed, 81 insertions(+), 32 deletions(-)

diff --git a/pom.xml b/pom.xml
index 2022b63..d2c5c4e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,7 +57,7 @@
                         
<outputDirectory>${project.build.directory}/classes</outputDirectory>
                         <overWriteReleases>false</overWriteReleases>
                         <overWriteSnapshots>true</overWriteSnapshots>
-                        
<includeArtifactIds>org.apache.felix.converter,org.apache.sling.feature,org.apache.sling.commons.johnzon,osgi.core,slf4j-api,slf4j-simple</includeArtifactIds>
+                        
<includeArtifactIds>commons-cli,commons-lang,org.apache.felix.utils,org.apache.felix.converter,org.apache.sling.feature,org.apache.sling.feature.io,org.apache.sling.commons.johnzon,osgi.core,slf4j-api,slf4j-simple</includeArtifactIds>
                     </configuration>
                 </execution>
             </executions>
@@ -89,9 +89,16 @@
     </build>
     <dependencies>
         <dependency>
+             <groupId>commons-cli</groupId>
+             <artifactId>commons-cli</artifactId>
+             <version>1.3.1</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>commons-lang</groupId>
             <artifactId>commons-lang</artifactId>
             <version>2.6</version>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
diff --git a/src/main/java/org/apache/sling/feature/analyser/Analyser.java 
b/src/main/java/org/apache/sling/feature/analyser/Analyser.java
index 8124c9b..23b2c5f 100644
--- a/src/main/java/org/apache/sling/feature/analyser/Analyser.java
+++ b/src/main/java/org/apache/sling/feature/analyser/Analyser.java
@@ -16,14 +16,6 @@
  */
 package org.apache.sling.feature.analyser;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.ServiceLoader;
-import java.util.Set;
-
 import org.apache.sling.feature.Application;
 import org.apache.sling.feature.analyser.task.AnalyserTask;
 import org.apache.sling.feature.analyser.task.AnalyserTaskContext;
@@ -32,6 +24,12 @@ import org.apache.sling.feature.scanner.Scanner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.ServiceLoader;
+
 public class Analyser {
 
     private final AnalyserTask[] tasks;
@@ -41,33 +39,42 @@ public class Analyser {
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
     public Analyser(final Scanner scanner,
-            final AnalyserTask...tasks)
-    throws IOException {
+            final AnalyserTask...tasks) throws IOException {
         this.tasks = tasks;
         this.scanner = scanner;
     }
 
     public Analyser(final Scanner scanner,
-            final String... taskIds)
+            final String... taskClassNames)
     throws IOException {
-        this(scanner, getTasks(taskIds));
-        if ( this.tasks.length != taskIds.length ) {
-            throw new IOException("Couldn't find all tasks " + taskIds);
+        this(scanner, getTasksByClassName(taskClassNames));
+        if ( this.tasks.length != taskClassNames.length ) {
+            throw new IOException("Couldn't find all tasks " + 
Arrays.toString(taskClassNames));
         }
     }
 
-    public Analyser(final Scanner scanner)
-    throws IOException {
-        this(scanner, getTasks((String[])null));
+    public Analyser(final Scanner scanner) throws IOException {
+        this(scanner, getTasks());
     }
 
-    private static AnalyserTask[] getTasks(final String... taskIds) {
-        final Set<String> ids = taskIds == null ? null : new 
HashSet<>(Arrays.asList(taskIds));
+    private static AnalyserTask[] getTasks() {
         final ServiceLoader<AnalyserTask> loader = 
ServiceLoader.load(AnalyserTask.class);
         final List<AnalyserTask> list = new ArrayList<>();
         for(final AnalyserTask task : loader) {
-            if ( ids == null || ids.contains(task.getId()) ) {
+            list.add(task);
+        }
+        return list.toArray(new AnalyserTask[list.size()]);
+    }
+
+    // Get tasks from class names
+    private static AnalyserTask[] getTasksByClassName(String[] taskClassNames) 
throws IOException {
+        List<AnalyserTask> list = new ArrayList<>();
+        for (String cls : taskClassNames) {
+            try {
+                AnalyserTask task = (AnalyserTask) 
Analyser.class.getClassLoader().loadClass(cls).newInstance();
                 list.add(task);
+            } catch (Exception e) {
+                throw new IOException(e);
             }
         }
         return list.toArray(new AnalyserTask[list.size()]);
diff --git a/src/main/java/org/apache/sling/feature/analyser/main/Main.java 
b/src/main/java/org/apache/sling/feature/analyser/main/Main.java
index 79cc35b..34b677c 100644
--- a/src/main/java/org/apache/sling/feature/analyser/main/Main.java
+++ b/src/main/java/org/apache/sling/feature/analyser/main/Main.java
@@ -16,6 +16,13 @@
  */
 package org.apache.sling.feature.analyser.main;
 
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
 import org.apache.sling.feature.Application;
 import org.apache.sling.feature.analyser.Analyser;
 import org.apache.sling.feature.io.ArtifactManagerConfig;
@@ -25,11 +32,36 @@ import org.apache.sling.feature.scanner.Scanner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 
 public class Main {
+    private static String applicationFile;
+    private static String pluginClass;
+
+    private static void parseArgs(final String[] args) {
+        Option fileOption = new Option("f", true, "Set application file");
+        Option pluginOption = new Option("p", true, "Explicitly specify plugin 
class to run, "
+                + "if ommitted the default plugins are used");
+
+        Options options = new Options();
+        options.addOption(fileOption);
+        options.addOption(pluginOption);
+
+        CommandLineParser parser = new DefaultParser();
+        try {
+            CommandLine cl = parser.parse(options, args);
+
+            applicationFile = cl.getOptionValue(fileOption.getOpt());
+            if (cl.hasOption(pluginOption.getOpt())) {
+                pluginClass = cl.getOptionValue(pluginOption.getOpt());
+            }
+        } catch (ParseException e) {
+            HelpFormatter formatter = new HelpFormatter();
+            formatter.printHelp("", options);
+            System.exit(1);
+        }
+    }
 
     public static void main(final String[] args) {
         // setup logging
@@ -42,20 +74,18 @@ public class Main {
         logger.info("Apache Sling Application Analyser");
         logger.info("");
 
-        if ( args.length == 0 ) {
+        parseArgs(args);
+
+        if (applicationFile == null) {
             logger.error("Required argument missing: application file");
             System.exit(1);
         }
-        if ( args.length > 1 ) {
-            logger.error("Too many arguments. Only one (application file) is 
supported");
-            System.exit(1);
-        }
-        final File f = new File(args[0]);
+
         Application app = null;
-        try ( final FileReader r = new FileReader(f)) {
+        try ( final FileReader r = new FileReader(applicationFile)) {
             app = ApplicationJSONReader.read(r);
         } catch ( final IOException ioe) {
-            logger.error("Unable to read application: {}", f, ioe);
+            logger.error("Unable to read application: {}", applicationFile, 
ioe);
             System.exit(1);
         }
         if ( app.getFramework() == null ) {
@@ -64,10 +94,15 @@ public class Main {
 
         try {
             final Scanner scanner = new Scanner(new ArtifactManagerConfig());
-            final Analyser analyser = new Analyser(scanner);
+            final Analyser analyser;
+            if (pluginClass != null) {
+                analyser = new Analyser(scanner, pluginClass);
+            } else {
+                analyser = new Analyser(scanner);
+            }
             analyser.analyse(app);
         } catch ( final Exception e) {
-            logger.error("Unable to analyse application: {}", f, e);
+            logger.error("Unable to analyse application: {}", applicationFile, 
e);
             System.exit(1);
         }
     }

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to