]> source.dussan.org Git - javassist.git/commitdiff
supported the class path wildcards.
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 2 Nov 2007 17:15:01 +0000 (17:15 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 2 Nov 2007 17:15:01 +0000 (17:15 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@413 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

src/main/javassist/ClassPool.java
src/main/javassist/ClassPoolTail.java

index e7e209a9a3216af01cbeb82a872004a57484fa22..3bab74ae38acb42e55d17d4d7d7fb1e785af569c 100644 (file)
@@ -757,6 +757,9 @@ public class ClassPool {
      *
      * @param pathname      the path name of the directory or jar file.
      *                      It must not end with a path separator ("/").
+     *                      If the path name ends with "/*", then all the
+     *                      jar files matching the path name are inserted.
+     *
      * @return the inserted class path.
      * @throws NotFoundException    if the jar file is not found.
      */
@@ -772,6 +775,9 @@ public class ClassPool {
      *
      * @param pathname the path name of the directory or jar file.
      *                 It must not end with a path separator ("/").
+     *                      If the path name ends with "/*", then all the
+     *                      jar files matching the path name are appended.
+     *
      * @return the appended class path.
      * @throws NotFoundException if the jar file is not found.
      */
index fc21c0a3a75de7bef06dcf00a6b0ad521a8e954f..8b6dfabc13983d42ba08099e9d5c5552a724a51e 100644 (file)
@@ -72,6 +72,51 @@ final class DirClassPath implements ClassPath {
     }
 }
 
+final class JarDirClassPath implements ClassPath {
+    JarClassPath[] jars;
+
+    JarDirClassPath(String dirName) throws NotFoundException {
+        File[] files = new File(dirName).listFiles(new FilenameFilter() {
+            public boolean accept(File dir, String name) {
+                name = name.toLowerCase();
+                return name.endsWith(".jar") || name.endsWith(".zip");
+            }
+        });
+
+        jars = new JarClassPath[files.length];
+        for (int i = 0; i < files.length; i++)
+            jars[i] = new JarClassPath(files[i].getPath());
+    }
+
+    public InputStream openClassfile(String classname) throws NotFoundException {
+        if (jars != null)
+            for (int i = 0; i < jars.length; i++) {
+                InputStream is = jars[i].openClassfile(classname);
+                if (is != null)
+                    return is;
+            }
+
+        return null;    // not found
+    }
+
+    public URL find(String classname) {
+        if (jars != null)
+            for (int i = 0; i < jars.length; i++) {
+                URL url = jars[i].find(classname);
+                if (url != null)
+                    return url;
+            }
+
+        return null;    // not found
+    }
+
+    public void close() {
+        if (jars != null)
+            for (int i = 0; i < jars.length; i++)
+                jars[i].close();
+    }
+}
+
 final class JarClassPath implements ClassPath {
     JarFile jarfile;
     String jarfileURL;
@@ -206,11 +251,16 @@ final class ClassPoolTail {
     private static ClassPath makePathObject(String pathname)
         throws NotFoundException
     {
-        int i = pathname.lastIndexOf('.');
-        if (i >= 0) {
-            String ext = pathname.substring(i).toLowerCase();
-            if (ext.equals(".jar") || ext.equals(".zip"))
-                return new JarClassPath(pathname);
+        String lower = pathname.toLowerCase();
+        if (lower.endsWith(".jar") || lower.endsWith(".zip"))
+            return new JarClassPath(pathname);
+
+        int len = pathname.length();
+        if (len > 2 && pathname.charAt(len - 1) == '*'
+            && (pathname.charAt(len - 2) == '/'
+                || pathname.charAt(len - 2) == File.separatorChar)) {
+            String dir = pathname.substring(0, len - 2);
+            return new JarDirClassPath(dir);
         }
 
         return new DirClassPath(pathname);