[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