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