[picocontainer-scm] [5773] java/2.x/trunk/pico/container/src/test/org/picocontainer/classname: can now recurse through classes in a jar
paul-yCVjj/[email protected] Tue, 8 Mar 2011 21:36:15 -0600 (CST)
| Newsgroups | gmane.comp.java.picocontainer.cvs |
|---|---|
| Message-ID | <[email protected]> |
Revision 5773
Author paul
Date 2011-03-08 21:36:14 -0600 (Tue, 08 Mar 2011)
Log Message
can now recurse through classes in a jar
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 (5772 => 5773)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java 2011-03-02 16:44:54 UTC (rev 5772)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java 2011-03-09 03:36:14 UTC (rev 5773)
@@ -16,6 +16,7 @@
import org.picocontainer.containers.AbstractDelegatingMutablePicoContainer;
import java.io.File;
+import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.net.URL;
@@ -23,15 +24,17 @@
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.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
/**
* Default implementation of ClassLoadingPicoContainer.
@@ -540,28 +543,52 @@
}
- public int visit(ClassName thisClassesPackage, String regex, boolean recursive, ClassNameVisitor classNameVisitor) {
+ public int visit(ClassName thisClassesPackage, String regex, boolean recursive, ClassVisitor classNameVisitor) {
Class clazz = loadClass(thisClassesPackage);
String pkgName = clazz.getPackage().getName().replace(".", File.separator);
CodeSource codeSource = clazz.getProtectionDomain().getCodeSource();
if(codeSource == null) {
- throw new CannotListClassesInAJarException();
+ throw new PicoCompositionException("no codesource for " + thisClassesPackage);
}
- String fileName = codeSource.getLocation().getFile() + File.separator + pkgName;
+ String codeSourceRoot = codeSource.getLocation().getFile();
+ String fileName = codeSourceRoot + File.separator + pkgName;
File file = new File(fileName);
- if (file.isFile()) {
- file = file.getParentFile();
+ Pattern compiledPattern = Pattern.compile(regex);
+ if (file.exists()) {
+ if (file.isFile()) {
+ file = file.getParentFile();
+ }
+ return visit(file, pkgName, compiledPattern, recursive, classNameVisitor);
+ } else {
+ return visit(pkgName, codeSourceRoot, compiledPattern, recursive, classNameVisitor);
}
- 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(String pkgName, String codeSourceRoot, Pattern compiledPattern, boolean recursive, ClassVisitor classNameVisitor) {
+ int found = 0;
+ try {
+ ZipFile zip = new ZipFile(new File(codeSourceRoot));
+ for (Enumeration e = zip.entries(); e.hasMoreElements();) {
+ ZipEntry entry = (ZipEntry) e.nextElement();
+ String entryName = entry.getName();
+ if (entryName.startsWith(pkgName) && entryName.endsWith(".class")) {
+ String name = entryName.substring(pkgName.length()+1);
+ if (name.endsWith("XStream.class")) {
+ System.out.println();
+ }
+ int length = name.split("/").length;
+ if (length == 1 || recursive) {
+ found = visit(pkgName, compiledPattern, classNameVisitor, found, entryName.replace("/","."), null);
+ }
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return found;
}
- public int visit(File pkgDir, String pkgName, Pattern pattern, boolean recursive, ClassNameVisitor classNameVisitor) {
+ public int visit(File pkgDir, String pkgName, Pattern pattern, boolean recursive, ClassVisitor classNameVisitor) {
int found = 0;
File files[] = pkgDir.listFiles();
if(files != null) {
@@ -571,26 +598,30 @@
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++;
- }
+ found = visit(pkgName, pattern, classNameVisitor, found, file.getName(), file.getAbsolutePath());
}
}
}
return found;
}
- public interface ClassNameVisitor {
- void classFound(Class clazz);
+ private int visit(String pkgName, Pattern pattern, ClassVisitor classNameVisitor, int foundSoFar, String fileName, String absolutePath) {
+ boolean matches = pattern.matcher(fileName).matches();
+ if (matches) {
+ if (absolutePath != null) {
+ String fqn = absolutePath.substring(absolutePath.indexOf(pkgName));
+ fileName = fqn.substring(0, fqn.indexOf(".class")).replace(File.separator, ".");
+ } else {
+ fileName = fileName.substring(0, fileName.indexOf(".class"));
+ }
+ classNameVisitor.classFound(loadClass(new ClassName(fileName)));
+ foundSoFar++;
+ }
+ return foundSoFar;
}
- public static class CannotListClassesInAJarException extends PicoException {
-
+ public interface ClassVisitor {
+ void classFound(Class clazz);
}
}
\ No newline at end of file
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/classname/DefaultClassLoadingPicoContainerTestCase.java (5772 => 5773)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/classname/DefaultClassLoadingPicoContainerTestCase.java 2011-03-02 16:44:54 UTC (rev 5772)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/classname/DefaultClassLoadingPicoContainerTestCase.java 2011-03-09 03:36:14 UTC (rev 5773)
@@ -26,9 +26,8 @@
import org.picocontainer.DefaultPicoContainer;
import org.picocontainer.MutablePicoContainer;
import org.picocontainer.PicoClassNotFoundException;
+import org.picocontainer.PicoCompositionException;
import org.picocontainer.PicoContainer;
-import org.picocontainer.classname.ClassLoadingPicoContainer;
-import org.picocontainer.classname.DefaultClassLoadingPicoContainer;
import org.picocontainer.behaviors.Caching;
import org.picocontainer.monitors.ConsoleComponentMonitor;
import org.picocontainer.tck.AbstractPicoContainerTest;
@@ -129,7 +128,7 @@
final StringBuilder sb = new StringBuilder();
DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
- int found = pico.visit(new ClassName("org.picocontainer.DefaultPicoContainer"), ".*Container\\.class", true, new DefaultClassLoadingPicoContainer.ClassNameVisitor() {
+ int found = pico.visit(new ClassName("org.picocontainer.DefaultPicoContainer"), ".*Container\\.class", true, new DefaultClassLoadingPicoContainer.ClassVisitor() {
public void classFound(Class clazz) {
sb.append(clazz.getName()).append("\n");
}
@@ -161,7 +160,7 @@
final StringBuilder sb = new StringBuilder();
DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
- int found = pico.visit(new ClassName("org.picocontainer.DefaultPicoContainer"), ".*Container\\.class", false, new DefaultClassLoadingPicoContainer.ClassNameVisitor() {
+ int found = pico.visit(new ClassName("org.picocontainer.DefaultPicoContainer"), ".*Container\\.class", false, new DefaultClassLoadingPicoContainer.ClassVisitor() {
public void classFound(Class clazz) {
sb.append(clazz.getName()).append("\n");
}
@@ -178,22 +177,55 @@
public void visitingFailsIfBogusClass() {
DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
- int found = pico.visit(new ClassName("org.picocontainer.BlahBlah"), ".*Container\\.class", false, new DefaultClassLoadingPicoContainer.ClassNameVisitor() {
+ pico.visit(new ClassName("org.picocontainer.BlahBlah"), ".*Container\\.class", false, new DefaultClassLoadingPicoContainer.ClassVisitor() {
public void classFound(Class clazz) {
}
});
}
- @Test(expected = DefaultClassLoadingPicoContainer.CannotListClassesInAJarException.class)
- public void visitingFailsIfClassInAJar() {
+ @Test(expected = PicoCompositionException.class)
+ public void visitingFailsIfJDKClass() {
+ DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
+ pico.visit(new ClassName("java.util.ArrayList"), ".*Container\\.class", false, new DefaultClassLoadingPicoContainer.ClassVisitor() {
+ public void classFound(Class clazz) {
+ }
+ });
+ }
+ @Test
+ public void visitingPassesIfClassInAJar() {
+
DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
- int found = pico.visit(new ClassName("java.util.ArrayList"), ".*List\\.class", false, new DefaultClassLoadingPicoContainer.ClassNameVisitor() {
+ final StringBuilder sb = new StringBuilder();
+ int found = pico.visit(new ClassName("com.thoughtworks.xstream.XStream"), ".*m\\.class", false, new DefaultClassLoadingPicoContainer.ClassVisitor() {
public void classFound(Class clazz) {
+ sb.append(clazz.getName()).append("\n");
}
});
+ assertEquals("com.thoughtworks.xstream.XStream\n",
+ sb.toString());
+ assertEquals(1, found);
}
+ @Test
+ public void visitingPassesIfClassInAJarRecursively() {
+ DefaultClassLoadingPicoContainer pico = new DefaultClassLoadingPicoContainer();
+ final StringBuilder sb = new StringBuilder();
+ int found = pico.visit(new ClassName("com.thoughtworks.xstream.XStream"), ".*m\\.class", true, new DefaultClassLoadingPicoContainer.ClassVisitor() {
+ public void classFound(Class clazz) {
+ sb.append(clazz.getName()).append("\n");
+ }
+ });
+ assertEquals("com.thoughtworks.xstream.io.xml.xppdom.Xpp3Dom\n" +
+ "com.thoughtworks.xstream.core.util.PrioritizedList$PrioritizedItem\n" +
+ "com.thoughtworks.xstream.core.util.CustomObjectInputStream\n" +
+ "com.thoughtworks.xstream.core.util.CustomObjectOutputStream\n" +
+ "com.thoughtworks.xstream.XStream\n",
+ sb.toString());
+ assertEquals(5, found);
+ }
+
+
}
----------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email