[jboss-svn-commits] JBoss Common SVN: r4267 - in shrinkwrap/trunk: api/src/main/java/org/jboss/shrinkwrap/api/container and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Apr 20 10:24:14 EDT 2010


Author: aslak
Date: 2010-04-20 10:24:13 -0400 (Tue, 20 Apr 2010)
New Revision: 4267

Modified:
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Filters.java
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/container/ClassContainer.java
   shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/URLPackageScanner.java
   shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/asset/AssetUtil.java
   shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container/ContainerBase.java
   shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/FiltersTestCase.java
   shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/URLPackageScannerTestCase.java
   shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/DynamicContainerTestBase.java
Log:
SHRINKWRAP-132 Changed addPackage filter to use ArchivePath and URLPackageScanner to use a callback on classname instead of returning a list of Classes.


Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Filters.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Filters.java	2010-04-20 14:19:46 UTC (rev 4266)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Filters.java	2010-04-20 14:24:13 UTC (rev 4267)
@@ -28,8 +28,6 @@
    // Class Members ----------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
 
-   private static final String INCLUDE_ALL_CLASSES = "org.jboss.shrinkwrap.impl.base.filter.IncludeAllClasses";
-
    private static final String INCLUDE_ALL_PATHS = "org.jboss.shrinkwrap.impl.base.filter.IncludeAllPaths";
    
    private static final String INCLUDE_REGEXP_PATHS = "org.jboss.shrinkwrap.impl.base.filter.IncludeRegExpPaths";
@@ -37,23 +35,6 @@
    private static final String EXCLUDE_REGEXP_PATHS = "org.jboss.shrinkwrap.impl.base.filter.ExcludeRegExpPaths";
    
    /**
-    * {@link Filter} that include all {@link Class}s.
-    * 
-    * Only meant to be used internally.
-    * 
-    * @return A {@link Filter} that always return true
-    */
-   @SuppressWarnings("unchecked")
-   public static Filter<Class<?>> includeAllClasses() 
-   {
-      return SecurityActions.newInstance(
-            INCLUDE_ALL_CLASSES, 
-            new Class<?>[]{}, 
-            new Object[]{}, 
-            Filter.class);
-   }
-
-   /**
     * {@link Filter} that includes all {@link ArchivePath}s.
     * 
     * Only meant to be used internally.
@@ -101,7 +82,25 @@
             new Object[]{regexp}, 
             Filter.class);
    }
-
+   
+   /**
+    * {@link Filter} that includes a specific {@link Class}.
+    * 
+    * @param clazz To be included
+    * @return 
+    */
+   @SuppressWarnings("unchecked")
+   public static Filter<ArchivePath> include(Class<?> clazz)
+   {
+      String classExpression = ".*" + clazz.getName().replaceAll("\\.", "\\.") + "\\.class";
+      
+      return SecurityActions.newInstance(
+            INCLUDE_REGEXP_PATHS, 
+            new Class<?>[]{String.class}, 
+            new Object[]{ classExpression }, 
+            Filter.class);
+   }
+   
    //-------------------------------------------------------------------------------------||
    // Constructor ------------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||

Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/container/ClassContainer.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/container/ClassContainer.java	2010-04-20 14:19:46 UTC (rev 4266)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/container/ClassContainer.java	2010-04-20 14:24:13 UTC (rev 4267)
@@ -17,6 +17,7 @@
 package org.jboss.shrinkwrap.api.container;
 
 import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ArchivePath;
 import org.jboss.shrinkwrap.api.Filter;
 
 /**
@@ -107,13 +108,17 @@
    T addPackages(boolean recursive, Package... packages) throws IllegalArgumentException;
    
    /**
-    * Adds all classes accepted by the filter in the specified {@link Package}s to the {@link Archive}.
+    * Adds all classes accepted by the filter in the specified {@link Package}s to the {@link Archive}. <br/>
     * 
+    * The {@link ArchivePath} returned to the filter is the {@link ArchivePath} of the class, not the final location. <br/>
+    * package.MyClass = /package/MyClass.class <br/>
+    * <b>not:</b> package.MyClass = /WEB-INF/classes/package/MyClass.class <br/>
+    * 
     * @param recursive Should the sub packages be added
     * @param filter filter out specific classes
     * @param packages All the packages to add
     * @return This virtual archive
     * @throws IllegalArgumentException If no packages were specified
     */
-   T addPackages(boolean recursive, Filter<Class<?>> filter, Package... packages) throws IllegalArgumentException;
+   T addPackages(boolean recursive, Filter<ArchivePath> filter, Package... packages) throws IllegalArgumentException;
 }

Modified: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/URLPackageScanner.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/URLPackageScanner.java	2010-04-20 14:19:46 UTC (rev 4266)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/URLPackageScanner.java	2010-04-20 14:24:13 UTC (rev 4267)
@@ -54,7 +54,8 @@
 
    private final ClassLoader classLoader;
    
-   private final Set<Class<?>> classes = new HashSet<Class<?>>();
+   //private final Set<String> classes = new HashSet<String>();
+   private Callback callback;
 
    /**
     * Factory method to create an instance of URLPackageScanner.
@@ -63,25 +64,27 @@
     * @param classLoader class loader that will have classes added 
     * @return new instance of URLPackageScanner
     */
-   public static URLPackageScanner newInstance(Package pkg, boolean addRecursively, ClassLoader classLoader)
+   public static URLPackageScanner newInstance(Package pkg, boolean addRecursively, ClassLoader classLoader, Callback callback)
    {
       Validate.notNull(pkg, "Pkg must be specified");
       Validate.notNull(pkg.getName(), "Pkg must have a name");
       Validate.notNull(addRecursively, "AddRecursively must be specified");
       Validate.notNull(classLoader, "ClassLoader must be specified");
+      Validate.notNull(callback, "Callback must be specified");
 
-      return new URLPackageScanner(pkg, addRecursively, classLoader);
+      return new URLPackageScanner(pkg, addRecursively, classLoader, callback);
    }
 
-   private URLPackageScanner(Package pkg, boolean addRecursively, ClassLoader classLoader)
+   private URLPackageScanner(Package pkg, boolean addRecursively, ClassLoader classLoader, Callback callback)
    {
       this.packageName = pkg.getName();
       this.packageNamePath = packageName.replace(".", "/");
       this.addRecursively = addRecursively;
       this.classLoader = classLoader;
+      this.callback = callback;
    }
 
-   private void scanPackage()
+   public void scanPackage()
    {
       try
       {
@@ -128,7 +131,7 @@
                   && (addRecursively || !name.substring(packageNamePath.length() + 1).contains("/")))
             {
                String className = name.replace("/", ".").replace(".class", "");
-               classes.add(classLoader.loadClass(className));
+               foundClass(className);
             }
          }
       }
@@ -161,7 +164,7 @@
       {
          if (!child.isDirectory() && child.getName().endsWith(".class"))
          {
-            classes.add(classLoader.loadClass(packageName + "." + child.getName().substring(0, child.getName().lastIndexOf(".class"))));
+            foundClass(packageName + "." + child.getName().substring(0, child.getName().lastIndexOf(".class")));
          }
          else if (child.isDirectory() && addRecursively)
          {
@@ -170,14 +173,31 @@
       }
    }
 
-   public List<URL> loadResources(String name) throws IOException
+   private void foundClass(String className) 
    {
+      callback.classFound(className);
+   }
+   
+   
+   private List<URL> loadResources(String name) throws IOException
+   {
       return Collections.list(classLoader.getResources(name));
    }
 
-   public Set<Class<?>> getClasses()
+   
+   /**
+    * Callback interface for found classes.
+    *
+    * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+    * @version $Revision: $
+    */
+   public interface Callback 
    {
-      scanPackage();
-      return classes;
+      /**
+       * Called for each found class.
+       * 
+       * @param className The name of the found class
+       */
+      void classFound(String className);
    }
 }

Modified: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/asset/AssetUtil.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/asset/AssetUtil.java	2010-04-20 14:19:46 UTC (rev 4266)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/asset/AssetUtil.java	2010-04-20 14:24:13 UTC (rev 4267)
@@ -135,4 +135,21 @@
       String classFullPath = classResourceDelimiter + EXTENSION_CLASS;
       return new BasicPath(classFullPath);
    }
+
+   /**
+    * Helper to extract a ClassResources full path.
+    * <br/><br/>
+    * 
+    * ie: package.MyClass = package/MyClass.class
+    * 
+    * @param className
+    * @return
+    */
+   public static ArchivePath getFullPathForClassResource(String className) 
+   {
+      String classResourceDelimiter = className.replaceAll(
+            DELIMITER_CLASS_NAME_PATH, DELIMITER_RESOURCE_PATH);
+      String classFullPath = classResourceDelimiter + EXTENSION_CLASS;
+      return new BasicPath(classFullPath);
+   }
 }

Modified: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container/ContainerBase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container/ContainerBase.java	2010-04-20 14:19:46 UTC (rev 4266)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/container/ContainerBase.java	2010-04-20 14:24:13 UTC (rev 4267)
@@ -21,7 +21,6 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.Map;
-import java.util.Set;
 
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.ArchivePath;
@@ -858,11 +857,21 @@
          // Get all inner classes and add them
          addPackages(
                false,
-               new Filter<Class<?>>()
+               new Filter<ArchivePath>()
                {
-                  public boolean include(Class<?> object)
+                  /**
+                   * path  = /package/MyClass$Test.class <br/>
+                   * clazz = /package/MyClass.class <br/>
+                   * 
+                   *  
+                   * @param path The added classes 
+                   * @return 
+                   */
+                  public boolean include(ArchivePath path)
                   {
-                     return object.getName().startsWith(clazz.getName() + "$");
+                     ArchivePath classArchivePath = AssetUtil.getFullPathForClassResource(clazz);
+                     String expression = classArchivePath.get().replace(".class", "\\$.*");
+                     return path.get().matches(expression);
                   };
                },
                clazz.getPackage()
@@ -889,33 +898,48 @@
    public T addPackages(boolean recursive, Package... packages) throws IllegalArgumentException
    {
       Validate.notNull(packages, "Packages must be specified");
-      return addPackages(recursive, Filters.includeAllClasses(), packages);
+      return addPackages(recursive, Filters.includeAll(), packages);
    }
    
    /* (non-Javadoc)
     * @see org.jboss.shrinkwrap.api.container.ClassContainer#addPackages(boolean, org.jboss.shrinkwrap.api.Filter, java.lang.Package[])
     */
    @Override
-   public T addPackages(boolean recursive, Filter<Class<?>> filter, Package... packages) throws IllegalArgumentException
+   public T addPackages(final boolean recursive, final Filter<ArchivePath> filter, final Package... packages) throws IllegalArgumentException
    {
       Validate.notNull(filter, "Filter must be specified");
       Validate.notNull(packages, "Packages must be specified");
       
+      final ClassLoader classLoader = SecurityActions.getThreadContextClassLoader();
+      
       for(Package pack : packages) 
       {
-         URLPackageScanner scanner = URLPackageScanner.newInstance(
-               pack, recursive, SecurityActions.getThreadContextClassLoader());
-         Set<Class<?>> classes = scanner.getClasses(); 
-         for(Class<?> clazz : classes) 
-         {
-            if(!filter.include(clazz))
-            {
-               continue;
-            }
-            Asset asset = new ClassAsset(clazz);
-            ArchivePath location = new BasicPath(getClassesPath(), AssetUtil.getFullPathForClassResource(clazz));
-            add(asset, location);
-         }
+         URLPackageScanner.newInstance(
+               pack, recursive, classLoader, 
+               new URLPackageScanner.Callback()
+               {
+                  @Override
+                  public void classFound(String className)
+                  {
+                     ArchivePath classNamePath = AssetUtil.getFullPathForClassResource(className);
+                     if(!filter.include(classNamePath))
+                     {
+                        return;
+                     }
+                     Class<?> clazz;
+                     try
+                     {
+                        clazz = classLoader.loadClass(className);
+                     } 
+                     catch (ClassNotFoundException e)
+                     {
+                        throw new IllegalStateException("Could not load found class " + className);
+                     }
+                     Asset asset = new ClassAsset(clazz);
+                     ArchivePath location = new BasicPath(getClassesPath(), classNamePath);
+                     add(asset, location);
+                  }
+               }).scanPackage();
       }
       return covarientReturn();
    }

Modified: shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/FiltersTestCase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/FiltersTestCase.java	2010-04-20 14:19:46 UTC (rev 4266)
+++ shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/FiltersTestCase.java	2010-04-20 14:24:13 UTC (rev 4267)
@@ -86,20 +86,6 @@
             filteredPaths.get(0));
    }
 
-   @Test
-   public void shouldIncludeAllClasses() throws Exception 
-   {
-      List<Class<?>> classes = new ArrayList<Class<?>>();
-      classes.add(FiltersTestCase.class);
-      
-      List<Class<?>> filteredClasses = executeFilter(classes, Filters.includeAllClasses());
-      
-      Assert.assertArrayEquals(
-            "Should include all classes", 
-            classes.toArray(), 
-            filteredClasses.toArray());
-   }
-
    private <T> List<T> executeFilter(Class<T> clazz, List<T> items, Filter<T> filter) 
    {
       List<T> result = new ArrayList<T>();
@@ -111,16 +97,4 @@
       }
       return result;
    }
-
-   private List<Class<?>> executeFilter(List<Class<?>> items, Filter<Class<?>> filter) 
-   {
-      List<Class<?>> result = new ArrayList<Class<?>>();
-      for(Class<?> item : items)
-      {
-         if(filter.include(item)) {
-            result.add(item);
-         }
-      }
-      return result;
-   }
 }

Modified: shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/URLPackageScannerTestCase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/URLPackageScannerTestCase.java	2010-04-20 14:19:46 UTC (rev 4266)
+++ shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/URLPackageScannerTestCase.java	2010-04-20 14:24:13 UTC (rev 4267)
@@ -32,7 +32,16 @@
    @Test(expected = IllegalArgumentException.class)
    public void shouldThrowExceptionNullPackage()
    {
-      URLPackageScanner.newInstance((Package)null, true,
-         URLPackageScannerTestCase.class.getClassLoader());
+      URLPackageScanner.newInstance(
+            (Package)null, 
+            true,
+            URLPackageScannerTestCase.class.getClassLoader(), 
+            new URLPackageScanner.Callback()
+            {
+               @Override
+               public void classFound(String className)
+               {
+               }
+            });
    }
 }

Modified: shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/DynamicContainerTestBase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/DynamicContainerTestBase.java	2010-04-20 14:19:46 UTC (rev 4266)
+++ shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/DynamicContainerTestBase.java	2010-04-20 14:24:13 UTC (rev 4267)
@@ -25,7 +25,7 @@
 import org.jboss.shrinkwrap.api.ArchivePath;
 import org.jboss.shrinkwrap.api.ArchivePaths;
 import org.jboss.shrinkwrap.api.Asset;
-import org.jboss.shrinkwrap.api.Filter;
+import org.jboss.shrinkwrap.api.Filters;
 import org.jboss.shrinkwrap.api.container.ClassContainer;
 import org.jboss.shrinkwrap.api.container.LibraryContainer;
 import org.jboss.shrinkwrap.api.container.ManifestContainer;
@@ -672,14 +672,10 @@
    @ArchiveType(ClassContainer.class)
    public void testAddPackageRecursiveFiltered() throws Exception 
    {
-      getClassContainer().addPackages(true, new Filter<Class<?>>()
-      {
-         @Override
-         public boolean include(Class<?> clazz)
-         {
-            return clazz == DynamicContainerTestBase.class;
-         }
-      }, DynamicContainerTestBase.class.getPackage());
+      getClassContainer().addPackages(
+            true, 
+            Filters.include(DynamicContainerTestBase.class),
+            DynamicContainerTestBase.class.getPackage());
       
       ArchivePath expectedPath = new BasicPath(
             getClassPath(), AssetUtil.getFullPathForClassResource(DynamicContainerTestBase.class));



More information about the jboss-svn-commits mailing list