You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2014/05/20 18:04:49 UTC
git commit: TAP5-2096: correctly scan for classes in nested
directories most of the changes such as making the inner Job class static
were necessary just to make the class testable
Repository: tapestry-5
Updated Branches:
refs/heads/master 925e84bb4 -> 5f8deb1fc
TAP5-2096: correctly scan for classes in nested directories
most of the changes such as making the inner Job class static were necessary just to make the class testable
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/5f8deb1f
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/5f8deb1f
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/5f8deb1f
Branch: refs/heads/master
Commit: 5f8deb1fc109af839e670b2d8dd5342ba94a1833
Parents: 925e84b
Author: Jochen Kemnade <jo...@eddyson.de>
Authored: Tue May 20 10:55:30 2014 +0200
Committer: Jochen Kemnade <jo...@eddyson.de>
Committed: Tue May 20 17:59:09 2014 +0200
----------------------------------------------------------------------
.../internal/services/ClasspathScannerImpl.java | 22 ++++++----
.../ioc/specs/ClasspathScannerImplSpec.groovy | 44 ++++++++++++++++++++
2 files changed, 58 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/5f8deb1f/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathScannerImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathScannerImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathScannerImpl.java
index 27e3777..775bf97 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathScannerImpl.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathScannerImpl.java
@@ -37,7 +37,7 @@ public class ClasspathScannerImpl implements ClasspathScanner
private final ClasspathURLConverter converter;
- private final Pattern FOLDER_NAME_PATTERN = Pattern.compile("^\\p{javaJavaIdentifierStart}[\\p{javaJavaIdentifierPart}]*$", Pattern.CASE_INSENSITIVE);
+ private static final Pattern FOLDER_NAME_PATTERN = Pattern.compile("^\\p{javaJavaIdentifierStart}[\\p{javaJavaIdentifierPart}]*$", Pattern.CASE_INSENSITIVE);
public ClasspathScannerImpl(ClasspathURLConverter converter)
@@ -61,13 +61,13 @@ public class ClasspathScannerImpl implements ClasspathScanner
assert packagePath != null && packagePath.endsWith("/");
assert matcher != null;
- return new Job(matcher).findMatches(packagePath);
+ return new Job(matcher, contextClassLoader, converter).findMatches(packagePath);
}
/**
* Check whether container supports opening a stream on a dir/package to get a list of its contents.
*/
- private boolean supportsDirStream(URL packageURL)
+ private static boolean supportsDirStream(URL packageURL)
{
InputStream is = null;
@@ -99,7 +99,7 @@ public class ClasspathScannerImpl implements ClasspathScanner
* @throws java.io.IOException
* If error occurs creating jar file
*/
- private JarFile getAlternativeJarFile(URL url) throws IOException
+ private static JarFile getAlternativeJarFile(URL url) throws IOException
{
String urlFile = url.getFile();
// Trim off any suffix - which is prefixed by "!/" on Weblogic
@@ -137,10 +137,14 @@ public class ClasspathScannerImpl implements ClasspathScanner
/**
* Encapsulates the data, result, and queue of deferred operations for performing the scan.
*/
- class Job
+ static class Job
{
final ClasspathMatcher matcher;
+ final ClasspathURLConverter converter;
+
+ final ClassLoader classloader;
+
final Set<String> matches = CollectionFactory.newSet();
/**
@@ -149,15 +153,17 @@ public class ClasspathScannerImpl implements ClasspathScanner
final Stack<IOWork> queue = CollectionFactory.newStack();
- Job(ClasspathMatcher matcher)
+ Job(ClasspathMatcher matcher, ClassLoader classloader, ClasspathURLConverter converter)
{
this.matcher = matcher;
+ this.classloader = classloader;
+ this.converter = converter;
}
Set<String> findMatches(String packagePath) throws IOException
{
- Enumeration<URL> urls = contextClassLoader.getResources(packagePath);
+ Enumeration<URL> urls = classloader.getResources(packagePath);
while (urls.hasMoreElements())
{
@@ -231,7 +237,7 @@ public class ClasspathScannerImpl implements ClasspathScanner
if (file.isDirectory())
{
- final String nestedPackagePath = fileName + "/";
+ final String nestedPackagePath = packagePath + fileName + "/";
queue.push(new IOWork()
{
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/5f8deb1f/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathScannerImplSpec.groovy
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathScannerImplSpec.groovy b/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathScannerImplSpec.groovy
new file mode 100644
index 0000000..72e6eaf
--- /dev/null
+++ b/tapestry-ioc/src/test/groovy/ioc/specs/ClasspathScannerImplSpec.groovy
@@ -0,0 +1,44 @@
+package ioc.specs
+
+import java.io.File;
+import java.net.URL;
+
+import org.apache.tapestry5.ioc.Locatable;
+import org.apache.tapestry5.ioc.internal.services.ClasspathScannerImpl;
+import org.apache.tapestry5.ioc.internal.services.ClasspathURLConverterImpl
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.ioc.services.ClasspathMatcher;
+import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
+
+import spock.lang.Specification;
+
+class ClasspathScannerImplSpec extends Specification {
+
+ // TAP5-2096
+ def "can locate classes inside a subpackage, inside an extracted JAR file"() {
+ setup:
+
+ ClasspathMatcher matchAll = new ClasspathMatcher(){
+ boolean matches(String arg0, String arg1) {
+ true
+ };
+ }
+ def scannerJob = new ClasspathScannerImpl.Job(matchAll, Thread.currentThread().getContextClassLoader(), new ClasspathURLConverterImpl())
+
+ when:
+ URL url = Locatable.class.getResource('Locatable.class');
+ scannerJob.scanDir("org/apache/tapestry5/ioc/", new File(url.getPath()).parentFile)
+ while (!scannerJob.queue.isEmpty())
+ {
+ def queued = scannerJob.queue.pop();
+
+ queued.run();
+ }
+ def classes = scannerJob.matches
+
+ then:
+ classes.contains(InternalUtils.class.getName().replaceAll(/\./, "/")+'.class')
+ }
+
+
+}