You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2008/07/29 03:09:04 UTC

svn commit: r680592 - /tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImpl.java

Author: hlship
Date: Mon Jul 28 18:09:03 2008
New Revision: 680592

URL: http://svn.apache.org/viewvc?rev=680592&view=rev
Log:
TAPESTRY-2384: OutOfMemoryError exception if a regular file with no extension exists in a known component package

Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImpl.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImpl.java?rev=680592&r1=680591&r2=680592&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImpl.java Mon Jul 28 18:09:03 2008
@@ -27,6 +27,7 @@
 import java.util.Enumeration;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
+import java.util.regex.Pattern;
 
 public class ClassNameLocatorImpl implements ClassNameLocator
 {
@@ -34,6 +35,12 @@
 
     private final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
 
+    // This matches normal class files but not inner class files (which contain a '$'.
+
+    private final Pattern CLASS_NAME_PATTERN = Pattern.compile("^[_a-z][a-z0-9_]*\\.class$", Pattern.CASE_INSENSITIVE);
+
+    private final Pattern FOLDER_NAME_PATTERN = Pattern.compile("^[_a-z][a-z0-9_]*$", Pattern.CASE_INSENSITIVE);
+
     static class Queued
     {
         final URL packageURL;
@@ -186,9 +193,7 @@
 
                 if (line == null) break;
 
-                if (line.contains("$")) continue;
-
-                if (line.endsWith(CLASS_SUFFIX))
+                if (CLASS_NAME_PATTERN.matcher(line).matches())
                 {
                     if (packageName == null) packageName = packagePath.replace('/', '.');
 
@@ -201,16 +206,16 @@
                     continue;
                 }
 
-                // Either a file or a hidden directory (such as .svn)
+                // This should match just directories.  It may also match files that have no extension;
+                // when we read those, none of the lines should look like class files.
 
-                if (line.contains(".")) continue;
-
-                // The name of a subdirectory.
-
-                URL newURL = new URL(packageURL.toExternalForm() + line + "/");
-                String newPackagePath = packagePath + line + "/";
+                if (FOLDER_NAME_PATTERN.matcher(line).matches())
+                {
+                    URL newURL = new URL(packageURL.toExternalForm() + line + "/");
+                    String newPackagePath = packagePath + line + "/";
 
-                queue.push(new Queued(newURL, newPackagePath));
+                    queue.push(new Queued(newURL, newPackagePath));
+                }
             }
 
             lineReader.close();