Author: hlship
Date: Tue Jul 29 15:58:26 2008
New Revision: 680870
URL: http://svn.apache.org/viewvc?rev=680870&view=rev
Log:
TAPESTRY-2519: Make ClassNameLocatorImpl resolve resources from URLs that use a
client-defined protocol
Added:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathURLConverterImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClasspathURLConverter.java
Modified:
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateSessionSourceImplTest.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClassNameLocator.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImplTest.java
Modified:
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateSessionSourceImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateSessionSourceImplTest.java?rev=680870&r1=680869&r2=680870&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateSessionSourceImplTest.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateSessionSourceImplTest.java
Tue Jul 29 15:58:26 2008
@@ -18,6 +18,7 @@
import org.apache.tapestry5.hibernate.HibernateEntityPackageManager;
import org.apache.tapestry5.hibernate.HibernateSessionSource;
import org.apache.tapestry5.ioc.internal.services.ClassNameLocatorImpl;
+import org.apache.tapestry5.ioc.internal.services.ClasspathURLConverterImpl;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.test.TapestryTestCase;
import org.example.app0.entities.User;
@@ -48,7 +49,8 @@
List<HibernateConfigurer> filters = Arrays.asList(
new DefaultHibernateConfigurer(),
- new PackageNameHibernateConfigurer(packageManager, new
ClassNameLocatorImpl()));
+ new PackageNameHibernateConfigurer(packageManager,
+ new
ClassNameLocatorImpl(new ClasspathURLConverterImpl())));
replay();
HibernateSessionSource source = new HibernateSessionSourceImpl(log,
filters);
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=680870&r1=680869&r2=680870&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
Tue Jul 29 15:58:26 2008
@@ -17,6 +17,7 @@
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.services.ClassNameLocator;
+import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
import org.apache.tapestry5.ioc.util.Stack;
import java.io.*;
@@ -35,6 +36,8 @@
private final ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
+ private final ClasspathURLConverter converter;
+
// 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);
@@ -54,6 +57,11 @@
}
}
+ public ClassNameLocatorImpl(ClasspathURLConverter converter)
+ {
+ this.converter = converter;
+ }
+
/**
* Synchronization should not be necessary, but perhaps the underlying
ClassLoader's are sensitive to threading.
*/
@@ -83,7 +91,9 @@
{
URL url = urls.nextElement();
- scanURL(packagePath, result, url);
+ URL converted = converter.convert(url);
+
+ scanURL(packagePath, result, converted);
}
return result;
Added:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathURLConverterImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathURLConverterImpl.java?rev=680870&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathURLConverterImpl.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ClasspathURLConverterImpl.java
Tue Jul 29 15:58:26 2008
@@ -0,0 +1,30 @@
+// Copyright 2008 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.internal.services;
+
+import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
+
+import java.net.URL;
+
+/**
+ * Default implementation that returns the URLs unchanged.
+ */
+public class ClasspathURLConverterImpl implements ClasspathURLConverter
+{
+ public URL convert(URL url)
+ {
+ return url;
+ }
+}
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClassNameLocator.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClassNameLocator.java?rev=680870&r1=680869&r2=680870&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClassNameLocator.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClassNameLocator.java
Tue Jul 29 15:58:26 2008
@@ -18,6 +18,8 @@
/**
* Scans the classpath for top-level classes within particular packages.
+ *
+ * @see org.apache.tapestry5.ioc.services.ClasspathURLConverter
*/
public interface ClassNameLocator
{
Added:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClasspathURLConverter.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClasspathURLConverter.java?rev=680870&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClasspathURLConverter.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/ClasspathURLConverter.java
Tue Jul 29 15:58:26 2008
@@ -0,0 +1,33 @@
+// Copyright 2008 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.services;
+
+import java.net.URL;
+
+/**
+ * Used by [EMAIL PROTECTED]
org.apache.tapestry5.ioc.services.ClassNameLocator} to convert URLs from one
protocol to another. This
+ * is a hook for supporting OSGi, allowing "bundleresource" and "bundleentry"
protocols to be converted to "jar:" or
+ * "file:".
+ */
+public interface ClasspathURLConverter
+{
+ /**
+ * Passed a URL provided by [EMAIL PROTECTED]
ClassLoader#getResources(String)} to check to see if can be converted.
+ *
+ * @param url to check
+ * @return the url, or an equivalent url of type jar: or file:
+ */
+ URL convert(URL url);
+}
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java?rev=680870&r1=680869&r2=680870&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
Tue Jul 29 15:58:26 2008
@@ -55,6 +55,7 @@
binder.bind(MasterObjectProvider.class,
MasterObjectProviderImpl.class);
binder.bind(ClassNameLocator.class, ClassNameLocatorImpl.class);
binder.bind(AspectDecorator.class, AspectDecoratorImpl.class);
+ binder.bind(ClasspathURLConverter.class,
ClasspathURLConverterImpl.class);
}
/**
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImplTest.java?rev=680870&r1=680869&r2=680870&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImplTest.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/ClassNameLocatorImplTest.java
Tue Jul 29 15:58:26 2008
@@ -17,6 +17,7 @@
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.services.ClassNameLocator;
+import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -29,6 +30,8 @@
*/
public class ClassNameLocatorImplTest extends Assert
{
+ private final ClasspathURLConverter converter = new
ClasspathURLConverterImpl();
+
/**
* Use various packages in javassist to test this, as those don't change
unexpectedly(-ish) and we know they are in
* a JAR on the classpath.
@@ -36,7 +39,7 @@
@Test
public void classes_in_jar_file()
{
- ClassNameLocator locator = new ClassNameLocatorImpl();
+ ClassNameLocator locator = new ClassNameLocatorImpl(converter);
Collection<String> names = locator
.locateClassNames("javassist.util");
@@ -55,7 +58,7 @@
@Test
public void classes_in_subpackage_in_jar_file()
{
- ClassNameLocator locator = new ClassNameLocatorImpl();
+ ClassNameLocator locator = new ClassNameLocatorImpl(converter);
Collection<String> names = locator.locateClassNames("javassist.util");
@@ -74,7 +77,7 @@
@Test
public void classes_in_local_folders()
{
- ClassNameLocator locator = new ClassNameLocatorImpl();
+ ClassNameLocator locator = new ClassNameLocatorImpl(converter);
Collection<String> names = locator
.locateClassNames("org.apache.tapestry5.ioc.services");
@@ -87,7 +90,7 @@
@Test
public void classes_in_subpackages_in_local_folders()
{
- ClassNameLocator locator = new ClassNameLocatorImpl();
+ ClassNameLocator locator = new ClassNameLocatorImpl(converter);
Collection<String> names =
locator.locateClassNames("org.apache.tapestry5");