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