You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by si...@apache.org on 2011/11/20 21:04:52 UTC

svn commit: r1204229 - in /commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath: ClassLoaderBuilder.java ClassPathScanner.java DefaultErrorHandler.java ErrorHandlerBuilder.java HandlerConfigurationsBuilder.java

Author: simonetripodi
Date: Sun Nov 20 20:04:51 2011
New Revision: 1204229

URL: http://svn.apache.org/viewvc?rev=1204229&view=rev
Log:
reduced the proliferation of anonymous classes

Added:
    commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/DefaultErrorHandler.java   (with props)
Modified:
    commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassLoaderBuilder.java
    commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassPathScanner.java
    commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ErrorHandlerBuilder.java
    commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/HandlerConfigurationsBuilder.java

Modified: commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassLoaderBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassLoaderBuilder.java?rev=1204229&r1=1204228&r2=1204229&view=diff
==============================================================================
--- commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassLoaderBuilder.java (original)
+++ commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassLoaderBuilder.java Sun Nov 20 20:04:51 2011
@@ -1,5 +1,7 @@
 package org.apache.commons.meiyo.classpath;
 
+import java.util.Collection;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -22,16 +24,29 @@ package org.apache.commons.meiyo.classpa
 /**
  * Builder to set the {@link ClassLoader} to be used for resolving classes when required.
  */
-public interface ClassLoaderBuilder
+public final class ClassLoaderBuilder
 {
 
+    private final String[] paths;
+
+    private final Collection<ClassPathHandler> handlers;
+
+    ClassLoaderBuilder( String[] paths, Collection<ClassPathHandler> handlers )
+    {
+        this.paths = paths;
+        this.handlers = handlers;
+    }
+
     /**
      * Sets the Context ClassLoader (the one found by calling {@code Thread.currentThread().getContextClassLoader()})
      * to resolve/load classes.
      *
      * @return The builder to set error handlers
      */
-    ErrorHandlerBuilder usingContextClassLoader();
+    public ErrorHandlerBuilder usingContextClassLoader()
+    {
+        return usingClassLoader( Thread.currentThread().getContextClassLoader() );
+    }
 
     /**
      * Sets the input ClassLoader to resolve/load classes.
@@ -39,6 +54,14 @@ public interface ClassLoaderBuilder
      * @param classLoader the ClassLoader to resolve/load classes.
      * @return The builder to set error handlers
      */
-    ErrorHandlerBuilder usingClassLoader( ClassLoader classLoader );
+    public ErrorHandlerBuilder usingClassLoader( ClassLoader classLoader )
+    {
+        if ( classLoader == null )
+        {
+            throw new IllegalArgumentException( "Parameter 'classLoader' must not be null" );
+        }
+
+        return new ErrorHandlerBuilder( paths, handlers, classLoader );
+    }
 
 }

Modified: commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassPathScanner.java
URL: http://svn.apache.org/viewvc/commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassPathScanner.java?rev=1204229&r1=1204228&r2=1204229&view=diff
==============================================================================
--- commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassPathScanner.java (original)
+++ commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ClassPathScanner.java Sun Nov 20 20:04:51 2011
@@ -20,12 +20,6 @@ package org.apache.commons.meiyo.classpa
  */
 
 import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.regex.Pattern;
 
 /**
  * A ClassPath scanner allows users define ClassPath entries matching rule while scanning,
@@ -36,10 +30,6 @@ public final class ClassPathScanner
 
     private static final String JAVA_CLASS_PATH = "java.class.path";
 
-    private static final Pattern JAR_FILE = Pattern.compile( ".+\\.(jar|zip)", Pattern.CASE_INSENSITIVE );
-
-    private static final String CLASS_EXTENSION = ".class";
-
     /**
      * This class can not be instantiated explicitly.
      */
@@ -90,160 +80,7 @@ public final class ClassPathScanner
             throw new IllegalArgumentException( "At least one path has to be specified" );
         }
 
-        return new HandlerConfigurationsBuilder()
-        {
-
-            public ClassLoaderBuilder withConfiguration( final HandlerConfiguration configuration )
-            {
-                if ( configuration == null )
-                {
-                    throw new IllegalArgumentException( "At least one HandlerConfiguration has to be specified" );
-                }
-
-                configuration.configure();
-
-                final Collection<ClassPathHandler> handlers = configuration.getHandlers();
-
-                return new ClassLoaderBuilder()
-                {
-
-                    public ErrorHandlerBuilder usingContextClassLoader()
-                    {
-                        return this.usingClassLoader( Thread.currentThread().getContextClassLoader() );
-                    }
-
-                    public ErrorHandlerBuilder usingClassLoader( final ClassLoader classLoader )
-                    {
-                        if ( classLoader == null )
-                        {
-                            throw new IllegalArgumentException( "Parameter 'classLoader' must not be null" );
-                        }
-
-                        return new ErrorHandlerBuilder()
-                        {
-
-                            public void scan()
-                            {
-                                scan( new ErrorHandler()
-                                {
-
-                                    public void onJARReadingError( File file, IOException e )
-                                    {
-                                        throw new RuntimeException( "An error occurred while loading '" + file
-                                            + "' jar entry", e );
-                                    }
-
-                                    public void onClassNotFound( String className, Throwable t )
-                                    {
-                                        // do nothing, just ignore it
-                                    }
-
-                                } );
-                            }
-
-                            public void scan( final ErrorHandler errorHandler )
-                            {
-                                if ( errorHandler == null )
-                                {
-                                    throw new IllegalArgumentException( "Parameter 'errorHandler' must not be null" );
-                                }
-
-                                for ( String path : paths )
-                                {
-                                    File file = new File( path );
-                                    if ( JAR_FILE.matcher( path ).matches() )
-                                    {
-                                        try
-                                        {
-                                            JarFile jarFile = new JarFile( path );
-                                            Enumeration<JarEntry> enumeration = jarFile.entries();
-                                            while ( enumeration.hasMoreElements() )
-                                            {
-                                                JarEntry entry = enumeration.nextElement();
-                                                if ( !entry.isDirectory() )
-                                                {
-                                                    handleEntry( entry.getName(), path, handlers, classLoader,
-                                                                 errorHandler );
-                                                }
-                                            }
-                                        }
-                                        catch ( IOException e )
-                                        {
-                                            errorHandler.onJARReadingError( file, e );
-                                        }
-                                    }
-                                    else
-                                    {
-                                        traverse( file, path, handlers, classLoader, errorHandler );
-                                    }
-                                    // else ignore it
-                                }
-                            }
-                        };
-                    }
-
-                };
-            }
-        };
-    }
-
-    /**
-     * Traverses recursively a directory and handle children with the input handlers.
-     *
-     * @param file the directory has to be traversed
-     * @param path the path where the input directory has been found
-     * @param handlers ClassPath entry handlers have to be invoked when {@link Matcher} pattern matches.
-     * @param classLoader the {@code ClassLoader} used to resolve/load classes
-     * @param errorHandler the {@link ErrorHandler} used to catch any scanning error
-     */
-    private static void traverse( final File file, final String path, final Collection<ClassPathHandler> handlers,
-                                  final ClassLoader classLoader, final ErrorHandler errorHandler )
-    {
-        if ( file.isDirectory() )
-        {
-
-            for ( File child : file.listFiles() )
-            {
-                traverse( child, path, handlers, classLoader, errorHandler );
-            }
-
-            return;
-        }
-
-        handleEntry( file.getAbsolutePath().substring( path.length() + 1 ), path, handlers, classLoader, errorHandler );
-    }
-
-    /**
-     * Handles an entry found in the ClassPath.
-     *
-     * @param entry the ClassPath entry name found.
-     * @param path the path where the ClassPath entry name is found.
-     * @param handlers ClassPath entry handlers have to be invoked when {@link Matcher} pattern matches.
-     * @param classLoader the {@code ClassLoader} used to resolve/load classes
-     * @param errorHandler the {@link ErrorHandler} used to catch any scanning error
-     */
-    private static void handleEntry( String entry, final String path, final Collection<ClassPathHandler> handlers,
-                                     final ClassLoader classLoader, final ErrorHandler errorHandler )
-    {
-        if ( !entry.endsWith( CLASS_EXTENSION ) )
-        {
-            return;
-        }
-
-        entry = entry.substring( 0, entry.lastIndexOf( '.' ) ).replace( '/', '.' );
-        try
-        {
-            Class<?> clazz = classLoader.loadClass( entry );
-
-            for ( ClassPathHandler classPathHandler : handlers )
-            {
-                classPathHandler.doHandle( path, clazz );
-            }
-        }
-        catch ( Throwable t )
-        {
-            errorHandler.onClassNotFound( entry, t );
-        }
+        return new HandlerConfigurationsBuilder( paths );
     }
 
 }

Added: commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/DefaultErrorHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/DefaultErrorHandler.java?rev=1204229&view=auto
==============================================================================
--- commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/DefaultErrorHandler.java (added)
+++ commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/DefaultErrorHandler.java Sun Nov 20 20:04:51 2011
@@ -0,0 +1,51 @@
+package org.apache.commons.meiyo.classpath;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Default {@link ErrorHandler} implementation.
+ */
+final class DefaultErrorHandler
+    implements ErrorHandler
+{
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onClassNotFound( String className, Throwable t )
+    {
+        // do nothing, just ignore it
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onJARReadingError( File file, IOException e )
+    {
+        throw new RuntimeException( "An error occurred while loading '"
+                                    + file
+                                    + "' jar entry", e );
+    }
+
+}

Propchange: commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/DefaultErrorHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/DefaultErrorHandler.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/DefaultErrorHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ErrorHandlerBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ErrorHandlerBuilder.java?rev=1204229&r1=1204228&r2=1204229&view=diff
==============================================================================
--- commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ErrorHandlerBuilder.java (original)
+++ commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/ErrorHandlerBuilder.java Sun Nov 20 20:04:51 2011
@@ -19,22 +19,146 @@ package org.apache.commons.meiyo.classpa
  * under the License.
  */
 
+import static java.util.regex.Pattern.compile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.regex.Pattern;
+
 /**
  * Builder to perform a scan, recording eventual errors inside a proper handler.
  */
-public interface ErrorHandlerBuilder
+public final class ErrorHandlerBuilder
 {
 
+    private static final Pattern JAR_FILE = compile( ".+\\.(jar|zip)", Pattern.CASE_INSENSITIVE );
+
+    private static final String CLASS_EXTENSION = ".class";
+
+    private final String[] paths;
+
+    private final Collection<ClassPathHandler> handlers;
+
+    private final ClassLoader classLoader;
+
+    private ErrorHandler errorHandler;
+
+    ErrorHandlerBuilder( String[] paths, Collection<ClassPathHandler> handlers, ClassLoader classLoader )
+    {
+        this.paths = paths;
+        this.handlers = handlers;
+        this.classLoader = classLoader;
+    }
+
     /**
      * Performs a ClassPath scanning operation, using the default {@link ErrorHandler}.
      */
-    void scan();
+    public void scan()
+    {
+        scan( new DefaultErrorHandler() );
+    }
 
     /**
      * Performs a ClassPath scanning operation, using the input {@link ErrorHandler}.
      *
      * @param errorHandler the handler to record scanning errors.
      */
-    void scan( ErrorHandler errorHandler );
+    public void scan( ErrorHandler errorHandler )
+    {
+        if ( errorHandler == null )
+        {
+            throw new IllegalArgumentException( "Parameter 'errorHandler' must not be null" );
+        }
+
+        this.errorHandler = errorHandler;
+
+        for ( String path : paths )
+        {
+            File file = new File( path );
+            if ( JAR_FILE.matcher( path ).matches() )
+            {
+                try
+                {
+                    JarFile jarFile = new JarFile( path );
+                    Enumeration<JarEntry> enumeration = jarFile.entries();
+                    while ( enumeration.hasMoreElements() )
+                    {
+                        JarEntry entry = enumeration.nextElement();
+                        if ( !entry.isDirectory() )
+                        {
+                            handleEntry( entry.getName(), path );
+                        }
+                    }
+                }
+                catch ( IOException e )
+                {
+                    errorHandler.onJARReadingError( file, e );
+                }
+            }
+            else
+            {
+                traverse( file, path );
+            }
+            // else ignore it
+        }
+    }
+
+    /**
+     * Traverses recursively a directory and handle children with the input handlers.
+     *
+     * @param file the directory has to be traversed
+     * @param path the path where the input directory has been found
+     */
+    private void traverse( final File file, final String path )
+    {
+        if ( file.isDirectory() )
+        {
+
+            for ( File child : file.listFiles() )
+            {
+                traverse( child, path );
+            }
+
+            return;
+        }
+
+        handleEntry( file.getAbsolutePath().substring( path.length() + 1 ), path );
+    }
+
+    /**
+     * Handles an entry found in the ClassPath.
+     *
+     * @param entry the ClassPath entry name found.
+     * @param path the path where the ClassPath entry name is found.
+     * @param handlers ClassPath entry handlers have to be invoked when {@link Matcher} pattern matches.
+     * @param classLoader the {@code ClassLoader} used to resolve/load classes
+     * @param errorHandler the {@link ErrorHandler} used to catch any scanning error
+     */
+    private void handleEntry( String entry, String path )
+    {
+        if ( !entry.endsWith( CLASS_EXTENSION ) )
+        {
+            return;
+        }
+
+        entry = entry.substring( 0, entry.lastIndexOf( '.' ) ).replace( '/', '.' );
+        try
+        {
+            Class<?> clazz = classLoader.loadClass( entry );
+
+            for ( ClassPathHandler classPathHandler : handlers )
+            {
+                classPathHandler.doHandle( path, clazz );
+            }
+        }
+        catch ( Throwable t )
+        {
+            errorHandler.onClassNotFound( entry, t );
+        }
+    }
 
 }

Modified: commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/HandlerConfigurationsBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/HandlerConfigurationsBuilder.java?rev=1204229&r1=1204228&r2=1204229&view=diff
==============================================================================
--- commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/HandlerConfigurationsBuilder.java (original)
+++ commons/sandbox/meiyo/trunk/src/main/java/org/apache/commons/meiyo/classpath/HandlerConfigurationsBuilder.java Sun Nov 20 20:04:51 2011
@@ -22,15 +22,32 @@ package org.apache.commons.meiyo.classpa
 /**
  * Builder to set-up the {@link ClassPathScanner} given the user defined configurations.
  */
-public interface HandlerConfigurationsBuilder
+public final class HandlerConfigurationsBuilder
 {
 
+    private final String[] paths;
+
+    HandlerConfigurationsBuilder( final String... paths )
+    {
+        this.paths = paths;
+    }
+
     /**
      * Initialize the scanner given one or more configuration.
      *
      * @param configurations configurations needed to set-up the scanner
      * @return the builder to set-up the scanner ClassLoader
      */
-    ClassLoaderBuilder withConfiguration( HandlerConfiguration configuration );
+    public ClassLoaderBuilder withConfiguration( HandlerConfiguration configuration )
+    {
+        if ( configuration == null )
+        {
+            throw new IllegalArgumentException( "At least one HandlerConfiguration has to be specified" );
+        }
+
+        configuration.configure();
+
+        return new ClassLoaderBuilder( paths, configuration.getHandlers() );
+    }
 
 }