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