[picocontainer-scm] [5760] java/2.x/trunk/pico/container/src/test/org/picocontainer/classname: add recusive lookup of classes from a filesystem, with regex

paul-yCVjj/[email protected] Sat, 26 Feb 2011 20:37:14 -0600 (CST)
Newsgroups gmane.comp.java.picocontainer.cvs
Message-ID <[email protected]>
Revision 5760
Author paul
Date 2011-02-26 20:37:12 -0600 (Sat, 26 Feb 2011)

Log Message

add recusive lookup of classes from a filesystem, with regex

Modified Paths

- java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java

- java/2.x/trunk/pico/container/src/test/org/picocontainer/classname/DefaultClassLoadingPicoContainerTestCase.java

Diff

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java (5759 => 5760)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java 2011-02-27 00:09:42 UTC (rev 5759)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java 2011-02-27 02:37:12 UTC (rev 5760)
@@ -12,17 +12,18 @@
import org.picocontainer.*;
import org.picocontainer.security.CustomPermissionsURLClassLoader;
import org.picocontainer.lifecycle.LifecycleState;
-import org.picocontainer.classname.ClassPathElement;
-import org.picocontainer.classname.ClassLoadingPicoContainer;
import org.picocontainer.behaviors.Caching;
import org.picocontainer.containers.AbstractDelegatingMutablePicoContainer;

+import java.io.File;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.net.URL;
import java.security.AccessController;
+import java.security.CodeSource;
import java.security.PrivilegedAction;
import java.security.Permissions;
+import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -30,6 +31,7 @@
import java.util.List;
import java.util.Map;
import java.util.Properties;
+import java.util.regex.Pattern;

/**
* Default implementation of ClassLoadingPicoContainer.
@@ -170,7 +172,7 @@
public final Object getComponent(Object componentKeyOrType) throws PicoException {

if (componentKeyOrType instanceof ClassName) {
- componentKeyOrType = loadClass(componentKeyOrType.toString());
+ componentKeyOrType = loadClass((ClassName) componentKeyOrType);
}

Object instance = getDelegate().getComponent(componentKeyOrType);
@@ -263,7 +265,7 @@

public MutablePicoContainer addComponent(Object implOrInstance) {
if (implOrInstance instanceof ClassName) {
- super.addComponent(loadClass(implOrInstance.toString()));
+ super.addComponent(loadClass((ClassName) implOrInstance));
} else {
super.addComponent(implOrInstance);
}
@@ -279,7 +281,7 @@

private Object classNameToClassIfApplicable(Object key) {
if (key instanceof ClassName) {
- key = loadClass(key.toString());
+ key = loadClass((ClassName) key);
}
return key;
}
@@ -316,10 +318,10 @@
return this;
}

- private Class<?> loadClass(final String className) {
+ private Class<?> loadClass(final ClassName className) {
ClassLoader classLoader = getComponentClassLoader();
// this is deliberately not a doPrivileged operation.
- String cn = getClassName(className);
+ String cn = getClassName(className.toString());
try {
return classLoader.loadClass(cn);
} catch (ClassNotFoundException e) {
@@ -352,7 +354,7 @@
public ComponentAdapter<?> getComponentAdapter(Object componentKey) {
Object componentKey2 = componentKey;
if (componentKey instanceof ClassName) {
- componentKey2 = loadClass(componentKey.toString());
+ componentKey2 = loadClass((ClassName) componentKey);
}
return super.getComponentAdapter(componentKey2);
}
@@ -530,7 +532,7 @@

/**
* {@inheritDoc}
- * @see org.picocontainer.MutablePicoContainer#getName(java.lang.String)
+ * @see org.picocontainer.MutablePicoContainer#getName()
*/
public String getName() {
return DefaultClassLoadingPicoContainer.this.getName();
@@ -538,4 +540,57 @@

}

+ public int visit(ClassName thisClassesPackage, String regex, boolean recursive, ClassNameVisitor classNameVisitor) {
+ Class clazz = loadClass(thisClassesPackage);
+ String pkgName = clazz.getPackage().getName().replace(".", File.separator);
+ CodeSource codeSource = clazz.getProtectionDomain().getCodeSource();
+ if(codeSource == null) {
+ throw new CannotListClassesInAJarException();
+ }
+ String fileName = codeSource.getLocation().getFile() + File.separator + pkgName;
+ File file = new File(fileName);
+ if (file.isFile()) {
+ file = file.getParentFile();
+ }
+ return visit(file, pkgName, regex, recursive, classNameVisitor);
+ }
+
+
+ public int visit(File pkgDir, String pkgName, String regex, boolean recursive, ClassNameVisitor classNameVisitor) {
+ Pattern pattern = Pattern.compile(regex);
+ return visit(pkgDir, pkgName, pattern, recursive, classNameVisitor);
+ }
+
+ public int visit(File pkgDir, String pkgName, Pattern pattern, boolean recursive, ClassNameVisitor classNameVisitor) {
+ int found = 0;
+ File files[] = pkgDir.listFiles();
+ if(files != null) {
+ for (File file : files) {
+ if (file.isDirectory()) {
+ if (recursive) {
+ found = found + visit(file, pkgName, pattern, recursive, classNameVisitor);
+ }
+ } else {
+ String name = file.getName();
+ boolean matches = pattern.matcher(name).matches();
+ if (matches) {
+ String fullPath = file.getAbsolutePath();
+ String fqn = fullPath.substring(fullPath.indexOf(pkgName));
+ classNameVisitor.classFound(loadClass(new ClassName(fqn.substring(0, fqn.indexOf(".class")).replace(File.separator, "."))));
+ found++;
+ }
+ }
+ }
+ }
+ return found;
+ }
+
+ public interface ClassNameVisitor {
+ void classFound(Class clazz);
+ }
+
+ public static class CannotListClassesInAJarException extends PicoException {
+
+ }
+
}
\ No newline at end of file

Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/classname/DefaultClassLoadingPicoContainerTestCase.java (5759 => 5760)

--- java/2.x/trunk/pico/container/src/test/org/picocontainer/classname/DefaultClassLoadingPicoContainerTestCase.java 2011-02-27 00:09:42 UTC (rev 5759)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/classname/DefaultClassLoadingPicoContainerTestCase.java 2011-02-27 02:37:12 UTC (rev 5760)
@@ -10,6 +10,7 @@

package org.picocontainer.classname;

+import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

@@ -24,6 +25,7 @@
import org.picocontainer.Characteristics;
import org.picocontainer.DefaultPicoContainer;
import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.PicoClassNotFoundException;
import org.picocontainer.PicoContainer;
import org.picocontainer.classname.ClassLoadingPicoContainer;
import org.picocontainer.classname.DefaultClassLoadingPicoContainer;
@@ -122,5 +124,76 @@
expectedList.add(Caching.class);
}

+ @Test()
+ public void visitingClassesSiblingToAClassWithRegexSubsetWorksWithRecursive() {

+ final StringBuilder sb = new StringBuilder();
+ DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
+ int found = pico.visit(new ClassName("org.picocontainer.DefaultPicoContainer"), ".*Container\\.class", true, new DefaultClassLoadingPicoContainer.ClassNameVisitor() {
+ public void classFound(Class clazz) {
+ sb.append(clazz.getName()).append("\n");
+ }
+ });
+ assertEquals("org.picocontainer.classname.ClassLoadingPicoContainer\n" +
+ "org.picocontainer.classname.DefaultClassLoadingPicoContainer$AsPropertiesPicoContainer\n" +
+ "org.picocontainer.classname.DefaultClassLoadingPicoContainer\n" +
+ "org.picocontainer.containers.AbstractDelegatingMutablePicoContainer\n" +
+ "org.picocontainer.containers.AbstractDelegatingPicoContainer\n" +
+ "org.picocontainer.containers.CommandLineArgumentsPicoContainer\n" +
+ "org.picocontainer.containers.CommandLinePicoContainer\n" +
+ "org.picocontainer.containers.CompositePicoContainer\n" +
+ "org.picocontainer.containers.EmptyPicoContainer\n" +
+ "org.picocontainer.containers.ImmutablePicoContainer\n" +
+ "org.picocontainer.containers.PropertiesPicoContainer\n" +
+ "org.picocontainer.containers.SystemPropertiesPicoContainer\n" +
+ "org.picocontainer.containers.TieringPicoContainer\n" +
+ "org.picocontainer.containers.TransientPicoContainer\n" +
+ "org.picocontainer.DefaultPicoContainer$AsPropertiesPicoContainer\n" +
+ "org.picocontainer.DefaultPicoContainer\n" +
+ "org.picocontainer.MutablePicoContainer\n" +
+ "org.picocontainer.PicoContainer\n",
+ sb.toString());
+ assertEquals(18, found);
+ }
+
+ @Test()
+ public void visitingClassesSiblingToAClassWithRegexSubsetWorksWithoutRecursive() {
+
+ final StringBuilder sb = new StringBuilder();
+ DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
+ int found = pico.visit(new ClassName("org.picocontainer.DefaultPicoContainer"), ".*Container\\.class", false, new DefaultClassLoadingPicoContainer.ClassNameVisitor() {
+ public void classFound(Class clazz) {
+ sb.append(clazz.getName()).append("\n");
+ }
+ });
+ assertEquals("org.picocontainer.DefaultPicoContainer$AsPropertiesPicoContainer\n" +
+ "org.picocontainer.DefaultPicoContainer\n" +
+ "org.picocontainer.MutablePicoContainer\n" +
+ "org.picocontainer.PicoContainer\n",
+ sb.toString());
+ assertEquals(4, found);
+ }
+
+ @Test(expected = PicoClassNotFoundException.class)
+ public void visitingFailsIfBogusClass() {
+
+ DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
+ int found = pico.visit(new ClassName("org.picocontainer.BlahBlah"), ".*Container\\.class", false, new DefaultClassLoadingPicoContainer.ClassNameVisitor() {
+ public void classFound(Class clazz) {
+ }
+ });
+ }
+
+ @Test(expected = DefaultClassLoadingPicoContainer.CannotListClassesInAJarException.class)
+ public void visitingFailsIfClassInAJar() {
+
+ DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
+ int found = pico.visit(new ClassName("java.util.ArrayList"), ".*List\\.class", false, new DefaultClassLoadingPicoContainer.ClassNameVisitor() {
+ public void classFound(Class clazz) {
+ }
+ });
+ }
+
+
+
}

----------

To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email