You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@any23.apache.org by si...@apache.org on 2012/02/24 22:38:12 UTC

svn commit: r1293434 - in /incubator/any23/trunk: ./ core/src/main/java/org/apache/any23/cli/ core/src/main/java/org/apache/any23/plugin/ core/src/test/java/org/apache/any23/cli/ core/src/test/java/org/apache/any23/plugin/ core/src/test/resources/org/a...

Author: simonetripodi
Date: Fri Feb 24 21:38:11 2012
New Revision: 1293434

URL: http://svn.apache.org/viewvc?rev=1293434&view=rev
Log:
[ANY23-50] Simplify plugin loading avoiding the classpath scanning

Removed:
    incubator/any23/trunk/core/src/main/java/org/apache/any23/plugin/ClassFilter.java
    incubator/any23/trunk/core/src/test/resources/org/apache/any23/plugin/
Modified:
    incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ExtractorDocumentation.java
    incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MicrodataParser.java
    incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MimeDetector.java
    incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/PluginVerifier.java
    incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Rover.java
    incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ToolRunner.java
    incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Version.java
    incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/VocabPrinter.java
    incubator/any23/trunk/core/src/main/java/org/apache/any23/plugin/Any23PluginManager.java
    incubator/any23/trunk/core/src/test/java/org/apache/any23/cli/ToolRunnerTest.java
    incubator/any23/trunk/core/src/test/java/org/apache/any23/plugin/Any23PluginManagerTest.java
    incubator/any23/trunk/plugins/basic-crawler/   (props changed)
    incubator/any23/trunk/plugins/basic-crawler/src/main/java/org/apache/any23/cli/Crawler.java
    incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperExtractor.java
    incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperPlugin.java
    incubator/any23/trunk/plugins/office-scraper/   (props changed)
    incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelExtractor.java
    incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelPlugin.java
    incubator/any23/trunk/pom.xml

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ExtractorDocumentation.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ExtractorDocumentation.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ExtractorDocumentation.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ExtractorDocumentation.java Fri Feb 24 21:38:11 2012
@@ -26,6 +26,7 @@ import org.apache.any23.extractor.Extrac
 import org.apache.any23.extractor.Extractor.BlindExtractor;
 import org.apache.any23.extractor.Extractor.ContentExtractor;
 import org.apache.any23.extractor.Extractor.TagSoupDOMExtractor;
+import org.kohsuke.MetaInfServices;
 
 import java.io.IOException;
 
@@ -33,6 +34,7 @@ import java.io.IOException;
  * This class provides some command-line documentation
  * about available extractors and their usage.
  */
+@MetaInfServices
 @ToolRunner.Description("Utility for obtaining documentation about metadata extractors.")
 public class ExtractorDocumentation implements Tool {
 
@@ -186,7 +188,7 @@ public class ExtractorDocumentation impl
 
     /**
      * Prints a complete report on all the available extractors.
-     * 
+     *
      * @throws IOException
      * @throws ExtractionException
      */
@@ -232,5 +234,5 @@ public class ExtractorDocumentation impl
         }
         return "?";
     }
-    
+
 }

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MicrodataParser.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MicrodataParser.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MicrodataParser.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MicrodataParser.java Fri Feb 24 21:38:11 2012
@@ -23,6 +23,7 @@ import org.apache.any23.source.DocumentS
 import org.apache.any23.source.FileDocumentSource;
 import org.apache.any23.source.HTTPDocumentSource;
 import org.apache.any23.util.StreamUtils;
+import org.kohsuke.MetaInfServices;
 
 import java.io.File;
 import java.io.IOException;
@@ -38,6 +39,7 @@ import java.util.regex.Pattern;
  *
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices
 @ToolRunner.Description("Commandline Tool for extracting Microdata from file/HTTP source.")
 public class MicrodataParser implements Tool {
 

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MimeDetector.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MimeDetector.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MimeDetector.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/MimeDetector.java Fri Feb 24 21:38:11 2012
@@ -28,6 +28,7 @@ import org.apache.any23.source.DocumentS
 import org.apache.any23.source.FileDocumentSource;
 import org.apache.any23.source.HTTPDocumentSource;
 import org.apache.any23.source.StringDocumentSource;
+import org.kohsuke.MetaInfServices;
 
 import java.io.File;
 import java.net.URISyntaxException;
@@ -39,6 +40,7 @@ import java.net.URISyntaxException;
  *
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices
 @ToolRunner.Description("MIME Type Detector Tool.")
 public class MimeDetector implements Tool{
 

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/PluginVerifier.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/PluginVerifier.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/PluginVerifier.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/PluginVerifier.java Fri Feb 24 21:38:11 2012
@@ -17,16 +17,18 @@
 
 package org.apache.any23.cli;
 
+import java.io.File;
+import java.io.PrintStream;
+import java.net.MalformedURLException;
+import java.util.Collection;
+import java.util.Iterator;
+
 import org.apache.any23.extractor.ExtractorFactory;
 import org.apache.any23.mime.MIMEType;
 import org.apache.any23.plugin.Any23PluginManager;
 import org.apache.any23.plugin.Author;
 import org.apache.any23.plugin.ExtractorPlugin;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.net.MalformedURLException;
-import java.util.Collection;
+import org.kohsuke.MetaInfServices;
 
 /**
  * Commandline utility to verify the <b>Any23</b> plugins
@@ -34,6 +36,7 @@ import java.util.Collection;
  *
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices
 @ToolRunner.Description("Utility for plugin management verification.")
 public class PluginVerifier implements Tool {
 
@@ -55,17 +58,17 @@ public class PluginVerifier implements T
             return 2;
         }
 
-        final Class<ExtractorPlugin>[] plugins;
+        final Iterator<ExtractorPlugin> plugins;
         try{
             pluginManager.loadJARDir(pluginsDir);
-            plugins = pluginManager.getPlugins();
+            plugins = pluginManager.getExtractors();
         } catch (Exception e) {
             e.printStackTrace(System.err);
             return 3;
         }
-        for(Class<ExtractorPlugin> p : plugins) {
+        while (plugins.hasNext()) {
             System.out.println("-----------------------------");
-            printPluginData(p, System.out);
+            printPluginData(plugins.next().getClass(), System.out);
             System.out.println("-----------------------------");
         }
         return 0;
@@ -84,7 +87,7 @@ public class PluginVerifier implements T
         return sb.toString();
     }
 
-    private void printPluginData(Class<ExtractorPlugin> extractorPlugin, PrintStream ps) {
+    private void printPluginData(Class<? extends ExtractorPlugin> extractorPlugin, PrintStream ps) {
         final Author authorAnnotation = extractorPlugin.getAnnotation(Author.class);
         final ExtractorPlugin instance;
         try {
@@ -92,7 +95,7 @@ public class PluginVerifier implements T
         } catch (Exception e) {
             throw new IllegalStateException("Error while instantiating plugin.", e);
         }
-        final ExtractorFactory extractorFactory = instance.getExtractorFactory();
+        final ExtractorFactory<?> extractorFactory = instance.getExtractorFactory();
         ps.printf("Plugin class     : %s\n", extractorPlugin.getClass());
         ps.printf("Plugin author    : %s\n", authorAnnotation == null ? "<unknown>" : authorAnnotation.name());
         ps.printf("Plugin factory   : %s\n", extractorFactory.getClass());

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Rover.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Rover.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Rover.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Rover.java Fri Feb 24 21:38:11 2012
@@ -39,6 +39,7 @@ import org.apache.commons.cli.HelpFormat
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.PosixParser;
+import org.kohsuke.MetaInfServices;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,6 +63,7 @@ import static org.apache.any23.extractor
  * @author Richard Cyganiak (richard@cyganiak.de)
  * @author Gabriele Renzi
  */
+@MetaInfServices
 @ToolRunner.Description("Any23 Command Line Tool.")
 public class Rover implements Tool {
 

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ToolRunner.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ToolRunner.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ToolRunner.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/ToolRunner.java Fri Feb 24 21:38:11 2012
@@ -17,14 +17,15 @@
 
 package org.apache.any23.cli;
 
-import org.apache.any23.plugin.Any23PluginManager;
-
 import java.io.File;
 import java.io.IOException;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import java.util.Iterator;
+
+import org.apache.any23.plugin.Any23PluginManager;
 
 /**
  * This class is the main class responsible to provide a uniform command-line
@@ -33,7 +34,6 @@ import java.lang.annotation.Target;
  * @see ExtractorDocumentation
  * @see Rover
  */
-@ToolRunner.Skip
 public class ToolRunner {
 
     public static final File HOME_PLUGIN_DIR = new File(
@@ -48,29 +48,26 @@ public class ToolRunner {
 
     public static void main(String[] args) throws IOException {
         //Generate automatically the cli.
-        final Class<Tool>[] tools = getToolsInClasspath();
+        final Iterator<Tool> tools = getToolsInClasspath();
         try {
             if (args.length < 1) {
                 usage(null, tools);
             }
 
             final String toolName = args[0];
-            Class<Tool> targetTool = null;
-            for(Class<Tool> tool : tools) {
-                if(tool.getSimpleName().equals(toolName)) {
-                    targetTool = tool;
-                    break;
+
+            while (tools.hasNext()) {
+                Tool tool = tools.next();
+                if (tool.getClass().getSimpleName().equals(toolName)) {
+                    String[] mainArgs = new String[args.length - 1];
+                    System.arraycopy(args, 1, mainArgs, 0, mainArgs.length);
+
+                    System.exit(tool.run(mainArgs));
                 }
             }
-            if(targetTool == null) {
-                usage( String.format("[%s] is not a valid tool name.", toolName), tools);
-                throw new IllegalStateException();
-            }
 
-            String[] mainArgs = new String[args.length - 1];
-            System.arraycopy(args, 1, mainArgs, 0, mainArgs.length);
-            final Tool targetToolInstance = targetTool.newInstance();
-            targetToolInstance.run(mainArgs);
+            usage( String.format("[%s] is not a valid tool name.", toolName), tools);
+            throw new IllegalStateException();
         } catch (Throwable e) {
             e.printStackTrace();
             Throwable cause = e.getCause();
@@ -79,7 +76,7 @@ public class ToolRunner {
         }
     }
 
-    public static Class<Tool>[] getToolsInClasspath() throws IOException {
+    public static Iterator<Tool> getToolsInClasspath() throws IOException {
         final Any23PluginManager pluginManager =  Any23PluginManager.getInstance();
         if(HOME_PLUGIN_DIR.exists()) {
             pluginManager.loadJARDir(HOME_PLUGIN_DIR);
@@ -91,13 +88,14 @@ public class ToolRunner {
         return String.format("%1$#" + n + "s", s);
     }
 
-    private static String getUtilitiesMessage(Class<Tool>[] toolClasses) {
+    private static String getUtilitiesMessage(Iterator<Tool> toolClasses) {
         StringBuffer sb = new StringBuffer();
         sb.append(" where <utility> is one of:\n");
         Description description;
         String utilityName;
         int padding;
-        for (Class<Tool> toolClass :  toolClasses) {
+        while (toolClasses.hasNext()) {
+            Class<?> toolClass = toolClasses.next().getClass();
             utilityName = toolClass.getSimpleName();
             sb.append("\t").append(utilityName);
             description = toolClass.getAnnotation(Description.class);
@@ -110,24 +108,20 @@ public class ToolRunner {
         return sb.toString();
     }
 
-    private static void usage(String msg, Class<Tool>[] utilities) {
-        if(msg != null) {
+    private static void usage(String msg, Iterator<Tool> utilities) {
+        if (msg != null) {
             System.err.println("*** ERROR: " + msg);
             System.err.println();
         }
         System.err.println(USAGE);
-        if(utilities != null) {
-            System.err.println( getUtilitiesMessage(utilities) );
+        if (utilities != null) {
+            System.err.println(getUtilitiesMessage(utilities));
         }
         System.exit(1);
     }
 
     @Retention(RetentionPolicy.RUNTIME)
     @Target(ElementType.TYPE)
-    public @interface Skip {}
-
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(ElementType.TYPE)
     public @interface Description { String value();  }
 
 }

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Version.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Version.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Version.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/Version.java Fri Feb 24 21:38:11 2012
@@ -18,12 +18,14 @@
 package org.apache.any23.cli;
 
 import org.apache.any23.Any23;
+import org.kohsuke.MetaInfServices;
 
 /**
  * Prints out the <b>Any23</b> library version.
  *
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices
 @ToolRunner.Description("Prints out the current library version and configuration information.")
 public class Version implements Tool {
 

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/VocabPrinter.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/VocabPrinter.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/VocabPrinter.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/cli/VocabPrinter.java Fri Feb 24 21:38:11 2012
@@ -24,6 +24,7 @@ import org.apache.commons.cli.HelpFormat
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.PosixParser;
+import org.kohsuke.MetaInfServices;
 
 import java.io.BufferedOutputStream;
 import java.io.IOException;
@@ -34,6 +35,7 @@ import java.util.Arrays;
  *
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices
 @ToolRunner.Description("Prints out the RDF Schema of the vocabularies used by Any23.")
 public class VocabPrinter implements Tool {
 

Modified: incubator/any23/trunk/core/src/main/java/org/apache/any23/plugin/Any23PluginManager.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/main/java/org/apache/any23/plugin/Any23PluginManager.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/main/java/org/apache/any23/plugin/Any23PluginManager.java (original)
+++ incubator/any23/trunk/core/src/main/java/org/apache/any23/plugin/Any23PluginManager.java Fri Feb 24 21:38:11 2012
@@ -17,29 +17,27 @@
 
 package org.apache.any23.plugin;
 
-import org.apache.any23.cli.Tool;
-import org.apache.any23.configuration.DefaultConfiguration;
-import org.apache.any23.extractor.ExtractorFactory;
-import org.apache.any23.extractor.ExtractorGroup;
-import org.apache.any23.extractor.ExtractorRegistry;
-import org.apache.any23.util.FileUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import static java.util.ServiceLoader.load;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
+
+import org.apache.any23.cli.Tool;
+import org.apache.any23.configuration.DefaultConfiguration;
+import org.apache.any23.extractor.ExtractorFactory;
+import org.apache.any23.extractor.ExtractorGroup;
+import org.apache.any23.extractor.ExtractorRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The <i>Any23PluginManager</i> is responsible for inspecting
@@ -247,17 +245,9 @@ public class Any23PluginManager {
      * @return list of matching classes.
      * @throws IOException
      */
-    public synchronized <T> Set<Class<T>> getClassesInPackage(final String packageName, final ClassFilter filter)
+    public synchronized <T> Iterator<T> getPlugins(final Class<T> type)
     throws IOException {
-        final Set<Class<T>> result = new HashSet<Class<T>>();
-        loadClassesInPackageFromClasspath(packageName, filter, result);
-        for(File jar : dynamicClassLoader.jars) {
-            loadClassesInPackageFromJAR(jar, packageName, filter, result);
-        }
-        for(File dir : dynamicClassLoader.dirs) {
-            loadClassesInPackageFromDir(dir, packageName, filter, result);
-        }
-        return result;
+        return load(type, dynamicClassLoader).iterator();
     }
 
     /**
@@ -266,17 +256,8 @@ public class Any23PluginManager {
      * @return not <code>null</code> list of tool classes.
      * @throws IOException
      */
-    public synchronized Class<Tool>[] getTools() throws IOException {
-        final Set<Class<Tool>> result = getClassesInPackage(
-                CLI_PACKAGE,
-                new ClassFilter() {
-                    @Override
-                    public boolean accept(Class clazz) {
-                        return !clazz.equals(Tool.class) && Tool.class.isAssignableFrom(clazz);
-                    }
-                }
-        );
-        return result.toArray( new Class[result.size()] );
+    public synchronized Iterator<Tool> getTools() throws IOException {
+        return getPlugins(Tool.class);
     }
 
     /**
@@ -285,17 +266,8 @@ public class Any23PluginManager {
      * @return not <code>null</code> list of plugin classes.
      * @throws IOException
      */
-    public synchronized Class<ExtractorPlugin>[] getPlugins() throws IOException {
-        final Set<Class<ExtractorPlugin>> result = getClassesInPackage(
-                PLUGINS_PACKAGE,
-                new ClassFilter() {
-                    @Override
-                    public boolean accept(Class clazz) {
-                        return !clazz.equals(ExtractorPlugin.class) && ExtractorPlugin.class.isAssignableFrom(clazz);
-                    }
-                }
-        );
-        return result.toArray( new Class[result.size()] );
+    public synchronized Iterator<ExtractorPlugin> getExtractors() throws IOException {
+        return getPlugins(ExtractorPlugin.class);
     }
 
     /**
@@ -333,27 +305,26 @@ public class Any23PluginManager {
                 report.append("}\n");
             }
 
-            final Class<ExtractorPlugin>[] extractorPluginClasses = getPlugins();
-            if (extractorPluginClasses.length == 0) {
+            final List<ExtractorFactory<?>> newFactoryList = new ArrayList<ExtractorFactory<?>>();
+
+            Iterator<ExtractorPlugin> extarctors = getExtractors();
+            while (extarctors.hasNext()) {
+                ExtractorFactory<?> factory = extarctors.next().getExtractorFactory();
+
+                report.append("\n - found plugin: ").append(factory.getExtractorName()).append("\n");
+
+                newFactoryList.add(factory);
+            }
+
+            if (newFactoryList.isEmpty()) {
                 report.append("\n=== No plugins have been found.===\n");
-                return initialExtractorGroup;
-            } else {
-                report.append("\nThe following plugins have been found {\n");
-                final List<ExtractorFactory<?>> newFactoryList = new ArrayList<ExtractorFactory<?>>();
-                for (Class<ExtractorPlugin> extractorPluginClass : extractorPluginClasses) {
-                    final ExtractorPlugin extractorPlugin = extractorPluginClass.newInstance();
-                    newFactoryList.add(extractorPlugin.getExtractorFactory());
-                    report.append(
-                            extractorPlugin.getExtractorFactory().getExtractorName()
-                    ).append("\n");
-                }
-                report.append("}\n");
+            }
 
-                for(ExtractorFactory extractorFactory : initialExtractorGroup) {
-                    newFactoryList.add(extractorFactory);
-                }
-                return new ExtractorGroup(newFactoryList);
+            for (ExtractorFactory<?> extractorFactory : initialExtractorGroup) {
+                newFactoryList.add(extractorFactory);
             }
+
+            return new ExtractorGroup(newFactoryList);
         } finally {
             logger.info(report.toString());
         }
@@ -393,156 +364,6 @@ public class Any23PluginManager {
     }
 
     /**
-     * Filters classes by criteria within a <i>JAR</i>.
-     *
-     * @param jarFile file addressing the JAR.
-     * @param packageName name of package to scan.
-     * @param filter filter class, all returned classes must extend the specified one.
-     * @param result list for writing result.
-     * @throws java.io.IOException
-     */
-    protected <T> void loadClassesInPackageFromJAR(
-            File jarFile,
-            String packageName,
-            ClassFilter filter,
-            Set<Class<T>> result
-    ) throws IOException {
-        loadJAR(jarFile);
-        packageName = packageName.replaceAll("\\.", "/");
-        JarInputStream jarInputStream = new JarInputStream(new FileInputStream(jarFile));
-        JarEntry jarEntry;
-        while (true) {
-            try {
-                jarEntry = jarInputStream.getNextJarEntry();
-            } catch (IOException ioe) {
-                throw new IllegalStateException("Error while accessing JAR.", ioe);
-            }
-            if (jarEntry == null) {
-                break;
-            }
-            final String jarEntryName = jarEntry.getName();
-            if (jarEntryName.startsWith(packageName) && isValidClassName(jarEntryName)) {
-                final String classEntry = jarEntryName.replaceAll("/", "\\.");
-                final String classStr = classEntry.substring(0, classEntry.indexOf(".class"));
-                final Class clazz;
-                try {
-                    clazz = Class.forName(classStr, true, dynamicClassLoader);
-                } catch (ClassNotFoundException cnfe) {
-                    throw new IllegalStateException("Error while creating class.", cnfe);
-                }
-                if (filter == null || filter.accept(clazz)) {
-                    result.add(clazz);
-                }
-            }
-        }
-    }
-
-    /**
-     * Filters classes by criteria within a <i>class dir</i>.
-     *
-     * @param classDir class directory.
-     * @param packageName name of package to scan.
-     * @param filter filter class, all returned classes must extend the specified one.
-     * @param result list for writing result.
-     * @param <T> class types.
-     * @throws MalformedURLException
-     */
-    protected <T> void loadClassesInPackageFromDir(
-            File classDir,
-            final String packageName,
-            final ClassFilter filter,
-            Set<Class<T>> result
-    ) throws MalformedURLException {
-        if(packageName != null && packageName.trim().length() == 0) {
-            throw new IllegalArgumentException("Invalid packageName filter '" + packageName + "'");
-        }
-        loadClassDir(classDir);
-        final int PREFIX_LENGTH = classDir.getAbsolutePath().length();
-        File[] classFiles = FileUtils.listFilesRecursively(
-                classDir,
-                new FilenameFilter() {
-                    @Override
-                    public boolean accept(File dir, String name) {
-                        if (!isValidClassName(name)) return false;
-                        if (packageName == null) return true;
-                        final String absolutePath = dir.getAbsolutePath();
-                        if (absolutePath.length() <= PREFIX_LENGTH) return false;
-                        return
-                                absolutePath
-                                        .substring(PREFIX_LENGTH + 1)
-                                        .replaceAll("/", "\\.")
-                                        .startsWith(packageName);
-                    }
-                }
-        );
-        final int classDirPathLength = classDir.getAbsolutePath().length();
-        for (File classFile : classFiles) {
-            final Class clazz;
-            try {
-                String className =
-                        classFile
-                                .getAbsolutePath()
-                                .substring(classDirPathLength + 1);
-                className = className.substring(0, className.length() - ".class".length()).replaceAll("/", "\\.");
-                clazz = Class.forName(className, true, dynamicClassLoader);
-            } catch (ClassNotFoundException cnfe) {
-                throw new IllegalStateException("Error while instantiating class.", cnfe);
-            }
-            if (filter == null || filter.accept(clazz)) {
-                result.add(clazz);
-            }
-        }
-    }
-
-    /**
-     * Filters classes by criteria within the initialization <i>classpath</i>.
-     *
-     * @param packageName name of package to scan.
-     * @param filter filter class, all returned classes must extend the specified one.
-     * @param result list for writing result.
-     * @param <T>
-     * @throws IOException
-     */
-    protected <T> void loadClassesInPackageFromClasspath(
-            final String packageName,
-            final ClassFilter filter,
-            Set<Class<T>> result
-    ) throws IOException {
-        final String[] classpathEntries = getClasspathEntries();
-        for (String classPathEntry : classpathEntries) {
-            if(classPathEntry.trim().length() == 0) continue;
-            final File codePath = new File(URLDecoder.decode(classPathEntry, "UTF-8"));
-            if( ! codePath.exists() ) continue;
-            if (codePath.isDirectory()) {
-                loadClassesInPackageFromDir(codePath, packageName, filter, result);
-            } else {
-                loadClassesInPackageFromJAR(codePath, packageName, filter, result);
-            }
-        }
-    }
-
-    /**
-     * @return the classpath entries.
-     */
-    private String[] getClasspathEntries() {
-        final String classpath          = System.getProperty("java.class.path");
-        assert classpath != null : "Class path is null.";
-        final String classpathSeparator = System.getProperty("path.separator");
-        assert classpathSeparator != null : "Class path separator is null.";
-        return classpath.split("\\" + classpathSeparator);
-    }
-
-    /**
-     * Checks if the class name is valid.
-     *
-     * @param clazzName
-     * @return
-     */
-    private boolean isValidClassName(String clazzName) {
-        return clazzName.endsWith(".class") && ! clazzName.contains("$");
-    }
-
-    /**
      * Converts a column separated list of dirs in a list of files.
      *
      * @param pluginDirsList

Modified: incubator/any23/trunk/core/src/test/java/org/apache/any23/cli/ToolRunnerTest.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/test/java/org/apache/any23/cli/ToolRunnerTest.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/test/java/org/apache/any23/cli/ToolRunnerTest.java (original)
+++ incubator/any23/trunk/core/src/test/java/org/apache/any23/cli/ToolRunnerTest.java Fri Feb 24 21:38:11 2012
@@ -17,14 +17,16 @@
 
 package org.apache.any23.cli;
 
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Set;
 
+import org.junit.Test;
+
 /**
  * Test case for {@link ToolRunner}.
  *
@@ -44,8 +46,10 @@ public class ToolRunnerTest {
 
     @Test
     public void testGetToolsInClasspath() throws IOException {
-        Class<Tool>[] tools = ToolRunner.getToolsInClasspath();
-        Assert.assertTrue("Some core tools have not been detected.", coreTools.containsAll(Arrays.asList(tools)));
+        Iterator<Tool> tools = ToolRunner.getToolsInClasspath();
+        while (tools.hasNext()) {
+            assertTrue("Some core tools have not been detected.", coreTools.contains(tools.next().getClass()));
+        }
     }
 
 }

Modified: incubator/any23/trunk/core/src/test/java/org/apache/any23/plugin/Any23PluginManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/core/src/test/java/org/apache/any23/plugin/Any23PluginManagerTest.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/core/src/test/java/org/apache/any23/plugin/Any23PluginManagerTest.java (original)
+++ incubator/any23/trunk/core/src/test/java/org/apache/any23/plugin/Any23PluginManagerTest.java Fri Feb 24 21:38:11 2012
@@ -17,11 +17,8 @@
 
 package org.apache.any23.plugin;
 
-import org.apache.any23.cli.Tool;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -29,11 +26,15 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.Iterator;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
+import org.apache.any23.cli.Tool;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
 /**
  * Test case for {@link Any23PluginManager}.
  *
@@ -41,8 +42,6 @@ import java.util.zip.ZipInputStream;
  */
 public class Any23PluginManagerTest {
 
-    private static final File TARGET_TEST_JAR = new File("src/test/resources/org/apache/any23/plugin/target.jar");
-
     private Any23PluginManager manager;
 
     @Before
@@ -56,50 +55,15 @@ public class Any23PluginManagerTest {
     }
 
     @Test
-    public <T> void testGetClassesInPackageFromJAR() throws IOException {
-        Set<Class<T>> classes = new HashSet<Class<T>>();
-                manager.loadClassesInPackageFromJAR(
-                        TARGET_TEST_JAR,
-                        "org.hsqldb.store",
-                        null,
-                        classes
-                );
-        Assert.assertEquals(6, classes.size());
-    }
-
-    @Test
-    public <T> void testGetClassesInPackageFromDir() throws IOException {
-        final File tmpDir = File.createTempFile("test-plugin-manager", ".decompressed");
-        tmpDir.delete();
-        tmpDir.mkdirs();
-        decompressJar(TARGET_TEST_JAR, tmpDir);
-
-        Set<Class<T>> classes = new HashSet<Class<T>>();
-        manager.loadClassesInPackageFromDir(
-                tmpDir,
-                "org.hsqldb.store",
-                null,
-                classes
-        );
-        Assert.assertEquals(6, classes.size());
-    }
-
-    @Test
-    public <T> void testGetClassesFromClasspath() throws IOException {
-        Set<Class<T>> clazzes = manager.getClassesInPackage("org.apache.any23.plugin", null);
-        Assert.assertTrue(clazzes.size() >= 4);
-    }
-
-    @Test
     public void testGetTools() throws IOException {
-        Class<Tool>[] tools = manager.getTools();
-        Assert.assertTrue(tools.length > 0); // NOTE: Punctual tool detection verification done by ToolRunnerTest.java
+        Iterator<Tool> tools = manager.getTools();
+        assertTrue(tools.hasNext()); // NOTE: Punctual tool detection verification done by ToolRunnerTest.java
     }
 
     @Test
     public void testGetPlugins() throws IOException {
-        Class<ExtractorPlugin>[] extractorPlugins = manager.getPlugins();
-        Assert.assertEquals(0, extractorPlugins.length);
+        Iterator<ExtractorPlugin> extractorPlugins = manager.getExtractors();
+        assertFalse(extractorPlugins.hasNext());
     }
 
     // TODO: move in FileUtils

Propchange: incubator/any23/trunk/plugins/basic-crawler/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Fri Feb 24 21:38:11 2012
@@ -10,3 +10,4 @@ classes
 javadoc
 projectFilesBackup*
 *.ini
+bin

Modified: incubator/any23/trunk/plugins/basic-crawler/src/main/java/org/apache/any23/cli/Crawler.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/plugins/basic-crawler/src/main/java/org/apache/any23/cli/Crawler.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/plugins/basic-crawler/src/main/java/org/apache/any23/cli/Crawler.java (original)
+++ incubator/any23/trunk/plugins/basic-crawler/src/main/java/org/apache/any23/cli/Crawler.java Fri Feb 24 21:38:11 2012
@@ -24,6 +24,7 @@ import org.apache.any23.source.StringDoc
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
+import org.kohsuke.MetaInfServices;
 
 import java.io.File;
 import java.io.IOException;
@@ -38,6 +39,7 @@ import java.util.regex.PatternSyntaxExce
  *
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices
 @ToolRunner.Description("Any23 Crawler Command Line Tool.")
 public class Crawler extends Rover {
 

Modified: incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperExtractor.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperExtractor.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperExtractor.java (original)
+++ incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperExtractor.java Fri Feb 24 21:38:11 2012
@@ -31,6 +31,7 @@ import org.apache.any23.extractor.Extrac
 import org.apache.any23.extractor.ExtractorFactory;
 import org.apache.any23.extractor.SimpleExtractorFactory;
 import org.apache.any23.vocab.SINDICE;
+import org.kohsuke.MetaInfServices;
 import org.openrdf.model.URI;
 import org.openrdf.model.impl.ValueFactoryImpl;
 
@@ -47,6 +48,7 @@ import java.util.List;
  * @see HTMLScraperPlugin
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices( value = Extractor.class )
 public class HTMLScraperExtractor implements Extractor.ContentExtractor {
 
     public final static String NAME = "html-scraper";

Modified: incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperPlugin.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperPlugin.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperPlugin.java (original)
+++ incubator/any23/trunk/plugins/html-scraper/src/main/java/org/apache/any23/plugin/htmlscraper/HTMLScraperPlugin.java Fri Feb 24 21:38:11 2012
@@ -20,6 +20,7 @@ package org.apache.any23.plugin.htmlscra
 import org.apache.any23.extractor.ExtractorFactory;
 import org.apache.any23.plugin.Author;
 import org.apache.any23.plugin.ExtractorPlugin;
+import org.kohsuke.MetaInfServices;
 
 /**
  * Implementation of {@link ExtractorPlugin} based on the
@@ -28,6 +29,7 @@ import org.apache.any23.plugin.Extractor
  * @see HTMLScraperExtractor
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices
 @Author(name="Michele Mostarda (mostarda@fbk.eu)")
 public class HTMLScraperPlugin implements ExtractorPlugin {
 

Propchange: incubator/any23/trunk/plugins/office-scraper/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Fri Feb 24 21:38:11 2012
@@ -6,3 +6,4 @@
 build.log
 target
 classes
+bin

Modified: incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelExtractor.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelExtractor.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelExtractor.java (original)
+++ incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelExtractor.java Fri Feb 24 21:38:11 2012
@@ -33,6 +33,7 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.kohsuke.MetaInfServices;
 import org.openrdf.model.URI;
 import org.openrdf.model.vocabulary.RDF;
 
@@ -49,6 +50,7 @@ import java.util.Arrays;
  *
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices( value = Extractor.class )
 public class ExcelExtractor implements Extractor.ContentExtractor {
 
     private static final Excel excel = Excel.getInstance();

Modified: incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelPlugin.java
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelPlugin.java?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelPlugin.java (original)
+++ incubator/any23/trunk/plugins/office-scraper/src/main/java/org/apache/any23/plugin/officescraper/ExcelPlugin.java Fri Feb 24 21:38:11 2012
@@ -20,6 +20,7 @@ package org.apache.any23.plugin.officesc
 import org.apache.any23.extractor.ExtractorFactory;
 import org.apache.any23.plugin.Author;
 import org.apache.any23.plugin.ExtractorPlugin;
+import org.kohsuke.MetaInfServices;
 
 /**
  * Implementation of {@link org.apache.any23.plugin.ExtractorPlugin} for {@link ExcelExtractor}.
@@ -27,6 +28,7 @@ import org.apache.any23.plugin.Extractor
  * @see ExcelExtractor
  * @author Michele Mostarda (mostarda@fbk.eu)
  */
+@MetaInfServices
 @Author(name="Michele Mostarda (mostarda@fbk.eu)")
 public class ExcelPlugin implements ExtractorPlugin {
 

Modified: incubator/any23/trunk/pom.xml
URL: http://svn.apache.org/viewvc/incubator/any23/trunk/pom.xml?rev=1293434&r1=1293433&r2=1293434&view=diff
==============================================================================
--- incubator/any23/trunk/pom.xml (original)
+++ incubator/any23/trunk/pom.xml Fri Feb 24 21:38:11 2012
@@ -402,6 +402,15 @@
     </dependency>
     <!-- END: logger -->
 
+    <!-- BEGIN: plugins -->
+    <dependency>
+      <groupId>org.kohsuke.metainf-services</groupId>
+      <artifactId>metainf-services</artifactId>
+      <version>1.3</version>
+      <scope>provided</scope>
+    </dependency>
+    <!-- END: plugins -->
+
     <!-- BEGIN: Test Dependencies -->
     <dependency>
       <groupId>junit</groupId>