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/30 00:58:26 UTC
svn commit: r680870 - in /tapestry/tapestry5/trunk:
tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/
tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/
tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/ser...
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 {@link 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 {@link 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");