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();


Reply via email to