You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2013/11/24 09:48:51 UTC

svn commit: r1544943 - in /cayenne/main/trunk: cayenne-di/src/main/java/org/apache/cayenne/di/ cayenne-di/src/main/java/org/apache/cayenne/di/spi/ cayenne-server/src/main/java/org/apache/cayenne/resource/ cayenne-server/src/test/java/org/apache/cayenne...

Author: aadamchik
Date: Sun Nov 24 08:48:50 2013
New Revision: 1544943

URL: http://svn.apache.org/r1544943
Log:
CAY-1887 Move class loading under Di, differentiate between Cayenne and application classes

adding 'getClassloader' method to have something to override when needed

Modified:
    cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java
    cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/resource/ClassLoaderResourceLocator.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.java

Modified: cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java?rev=1544943&r1=1544942&r2=1544943&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java (original)
+++ cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/AdhocObjectFactory.java Sun Nov 24 08:48:50 2013
@@ -19,7 +19,8 @@
 package org.apache.cayenne.di;
 
 /**
- * Creates objects for user-provided String class names, injecting dependencies into them.
+ * Creates objects for user-provided String class names, injecting dependencies
+ * into them.
  * 
  * @since 3.1
  */
@@ -30,4 +31,13 @@ public interface AdhocObjectFactory {
      * dependencies from the registry into it.
      */
     <T> T newInstance(Class<? super T> superType, String className);
+
+    /**
+     * Returns a ClassLoader appropriate for loading a given resource. Resource
+     * path should be compatible with Class.getResource(..) and such, i.e. the
+     * path component separator should be slash, not dot.
+     * 
+     * @since 3.2
+     */
+    ClassLoader getClassLoader(String resourceName);
 }

Modified: cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java?rev=1544943&r1=1544942&r2=1544943&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java (original)
+++ cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultAdhocObjectFactory.java Sun Nov 24 08:48:50 2013
@@ -72,6 +72,27 @@ public class DefaultAdhocObjectFactory i
         return instance;
     }
 
+    @Override
+    public ClassLoader getClassLoader(String resourceName) {
+
+        // here we are ignoring 'className' when looking for ClassLoader...
+        // other implementations (such as OSGi) may actually use it
+
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+
+        if (classLoader == null) {
+            classLoader = DefaultAdhocObjectFactory.class.getClassLoader();
+        }
+
+        // this is too paranoid I guess... "this" class will always have a
+        // ClassLoader
+        if (classLoader == null) {
+            throw new IllegalStateException("Can't find a ClassLoader");
+        }
+
+        return classLoader;
+    }
+
     public Class<?> getJavaClass(String className) throws ClassNotFoundException {
 
         // is there a better way to get array class from string name?
@@ -80,15 +101,10 @@ public class DefaultAdhocObjectFactory i
             throw new ClassNotFoundException("Null class name");
         }
 
-        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-
-        if (classLoader == null) {
-            classLoader = DefaultAdhocObjectFactory.class.getClassLoader();
-        }
+        ClassLoader classLoader = getClassLoader(className.replace('.', '/'));
 
         // use custom logic on failure only, assuming primitives and arrays are
-        // not that
-        // common
+        // not that common
         try {
             return Class.forName(className, true, classLoader);
         } catch (ClassNotFoundException e) {

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/resource/ClassLoaderResourceLocator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/resource/ClassLoaderResourceLocator.java?rev=1544943&r1=1544942&r2=1544943&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/resource/ClassLoaderResourceLocator.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/resource/ClassLoaderResourceLocator.java Sun Nov 24 08:48:50 2013
@@ -25,6 +25,8 @@ import java.util.Collection;
 import java.util.Enumeration;
 
 import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.di.AdhocObjectFactory;
+import org.apache.cayenne.di.Inject;
 
 /**
  * A {@link ResourceLocator} that looks up resources is the application
@@ -33,6 +35,12 @@ import org.apache.cayenne.ConfigurationE
  * @since 3.1
  */
 public class ClassLoaderResourceLocator implements ResourceLocator {
+    
+    private AdhocObjectFactory objectFactory;
+    
+    public ClassLoaderResourceLocator(@Inject AdhocObjectFactory objectFactory) {
+        this.objectFactory = objectFactory;
+    }
 
     @Override
     public Collection<Resource> findResources(String name) {
@@ -41,7 +49,7 @@ public class ClassLoaderResourceLocator 
 
         Enumeration<URL> urls;
         try {
-            urls = getClassLoader().getResources(name);
+            urls = objectFactory.getClassLoader(name).getResources(name);
         } catch (IOException e) {
             throw new ConfigurationException("Error getting resources for ");
         }
@@ -58,6 +66,10 @@ public class ClassLoaderResourceLocator 
         return resources;
     }
 
+    /**
+     * @deprecated since 3.2 unused, as AdhocObjectFactory.getClassLoader() is used instead.
+     */
+    @Deprecated
     protected ClassLoader getClassLoader() {
         ClassLoader loader = Thread.currentThread().getContextClassLoader();
 

Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java?rev=1544943&r1=1544942&r2=1544943&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DataDomainProviderTest.java Sun Nov 24 08:48:50 2013
@@ -108,20 +108,7 @@ public class DataDomainProviderTest exte
         nodeDescriptor2.setParameters("testDataNode2.driver.xml");
         testDescriptor.getNodeDescriptors().add(nodeDescriptor2);
 
-        final ResourceLocator locator = new ClassLoaderResourceLocator() {
-
-            public Collection<Resource> findResources(String name) {
-                // ResourceLocator also used by JdbcAdapter to locate
-                // types.xml... if this is the request we are getting, just let
-                // it go through..
-                if (name.endsWith("types.xml")) {
-                   return super.findResources(name);
-                }
-                
-                assertEquals(testConfigName, name);
-                return Collections.<Resource> singleton(new MockResource());
-            }
-        };
+       
 
         final DataChannelDescriptorLoader testLoader = new DataChannelDescriptorLoader() {
 
@@ -158,6 +145,22 @@ public class DataDomainProviderTest exte
 
                 binder.bind(EventManager.class).toInstance(eventManager);
                 binder.bind(EntitySorter.class).toInstance(new AshwoodEntitySorter());
+                
+                final ResourceLocator locator = new ClassLoaderResourceLocator(objectFactory) {
+
+                    public Collection<Resource> findResources(String name) {
+                        // ResourceLocator also used by JdbcAdapter to locate
+                        // types.xml... if this is the request we are getting, just let
+                        // it go through..
+                        if (name.endsWith("types.xml")) {
+                           return super.findResources(name);
+                        }
+                        
+                        assertEquals(testConfigName, name);
+                        return Collections.<Resource> singleton(new MockResource());
+                    }
+                };
+                
                 binder.bind(ResourceLocator.class).toInstance(locator);
                 binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
                 binder.bind(DataChannelDescriptorMerger.class).to(DefaultDataChannelDescriptorMerger.class);
@@ -168,7 +171,6 @@ public class DataDomainProviderTest exte
                 binder.bind(BatchQueryBuilderFactory.class).to(DefaultBatchQueryBuilderFactory.class);
 
                 binder.bind(DataSourceFactory.class).toInstance(new MockDataSourceFactory());
-                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
                 binder.bind(QueryCache.class).toInstance(mock(QueryCache.class));
             }

Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.java?rev=1544943&r1=1544942&r2=1544943&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.java Sun Nov 24 08:48:50 2013
@@ -20,15 +20,14 @@ package org.apache.cayenne.resource;
 
 import java.util.Collection;
 
-import org.apache.cayenne.resource.ClassLoaderResourceLocator;
-import org.apache.cayenne.resource.Resource;
-
 import junit.framework.TestCase;
 
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+
 public class ClassLoaderResourceLocatorTest extends TestCase {
 
     public void testFindResources() {
-        ClassLoaderResourceLocator locator = new ClassLoaderResourceLocator();
+        ClassLoaderResourceLocator locator = new ClassLoaderResourceLocator(new DefaultAdhocObjectFactory());
 
         Collection<Resource> resources = locator
                 .findResources("org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.class");
@@ -40,7 +39,7 @@ public class ClassLoaderResourceLocatorT
         assertNotNull(resource);
 
         assertNotNull(resource.getURL());
-        assertTrue(resource.getURL().toExternalForm().endsWith(
-                "org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.class"));
+        assertTrue(resource.getURL().toExternalForm()
+                .endsWith("org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.class"));
     }
 }