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 17:05:54 UTC

svn commit: r1545007 [1/2] - in /cayenne/main/trunk: cayenne-di/src/main/java/org/apache/cayenne/di/ cayenne-di/src/main/java/org/apache/cayenne/di/spi/ cayenne-project/src/test/java/org/apache/cayenne/project/ cayenne-project/src/test/java/org/apache/...

Author: aadamchik
Date: Sun Nov 24 16:05:53 2013
New Revision: 1545007

URL: http://svn.apache.org/r1545007
Log:
CAY-1882 Porting to OSGi environment

refactoring - new ClassLoaderManager service that can be easily switched between JEE and OSGi

Added:
    cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/ClassLoaderManager.java
      - copied, changed from r1544996, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java
    cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultClassLoaderManager.java
      - copied, changed from r1544996, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java
      - copied, changed from r1544996, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactory.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java
      - copied, changed from r1544996, cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactoryTest.java
Removed:
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/DefaultOsgiEnvironment.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactory.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactoryTest.java
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-project/src/test/java/org/apache/cayenne/project/DataChannelProjectLoaderTest.java
    cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectSaverTest.java
    cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/resource/ClassLoaderResourceLocator.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.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/configuration/server/DefaultDataSourceFactoryLoaderTest.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/resource/ClassLoaderResourceLocatorTest.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java
    cayenne/main/trunk/cayenne-tools/src/main/java/org/apache/cayenne/tools/configuration/ToolsModule.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=1545007&r1=1545006&r2=1545007&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 16:05:53 2013
@@ -39,13 +39,4 @@ public interface AdhocObjectFactory {
      * @since 3.2
      */
     Class<?> getJavaClass(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);
 }

Copied: cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/ClassLoaderManager.java (from r1544996, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/ClassLoaderManager.java?p2=cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/ClassLoaderManager.java&p1=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java&r1=1544996&r2=1545007&rev=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java (original)
+++ cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/ClassLoaderManager.java Sun Nov 24 16:05:53 2013
@@ -16,20 +16,21 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.configuration.osgi;
+package org.apache.cayenne.di;
 
 /**
- * Encapsulates OSGi-specific environment settings that can be used to configure
- * the rest of Cayenne.
+ * Maps ClassLoaders to resources. This is a useful abstraction when switching
+ * between environments. E.g. between JEE with thread/hierarchical classloaders
+ * and OSGi with per-bundle classloaders.
  * 
  * @since 3.2
  */
-public interface OsgiEnvironment {
-
-    ClassLoader resourceClassLoader(String resourceName);
-
-    ClassLoader cayenneDiClassLoader();
-
-    ClassLoader cayenneServerClassLoader();
+public interface ClassLoaderManager {
 
+    /**
+     * 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.
+     */
+    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=1545007&r1=1545006&r2=1545007&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 16:05:53 2013
@@ -19,6 +19,7 @@
 package org.apache.cayenne.di.spi;
 
 import org.apache.cayenne.di.AdhocObjectFactory;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIRuntimeException;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.di.Injector;
@@ -33,8 +34,16 @@ import org.apache.cayenne.di.Provider;
  */
 public class DefaultAdhocObjectFactory implements AdhocObjectFactory {
 
-    @Inject
     protected Injector injector;
+    protected ClassLoaderManager classLoaderManager;
+
+    /**
+     * @since 3.2
+     */
+    public DefaultAdhocObjectFactory(@Inject Injector injector, @Inject ClassLoaderManager classLoaderManager) {
+        this.injector = injector;
+        this.classLoaderManager = classLoaderManager;
+    }
 
     @SuppressWarnings("unchecked")
     @Override
@@ -68,27 +77,6 @@ public class DefaultAdhocObjectFactory i
     }
 
     @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;
-    }
-
-    @Override
     public Class<?> getJavaClass(String className) {
 
         // is there a better way to get array class from string name?
@@ -97,7 +85,7 @@ public class DefaultAdhocObjectFactory i
             throw new NullPointerException("Null class name");
         }
 
-        ClassLoader classLoader = getClassLoader(className.replace('.', '/'));
+        ClassLoader classLoader = classLoaderManager.getClassLoader(className.replace('.', '/'));
 
         // use custom logic on failure only, assuming primitives and arrays are
         // not that common

Copied: cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultClassLoaderManager.java (from r1544996, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultClassLoaderManager.java?p2=cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultClassLoaderManager.java&p1=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java&r1=1544996&r2=1545007&rev=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiEnvironment.java (original)
+++ cayenne/main/trunk/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultClassLoaderManager.java Sun Nov 24 16:05:53 2013
@@ -16,20 +16,35 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.configuration.osgi;
+package org.apache.cayenne.di.spi;
+
+import org.apache.cayenne.di.ClassLoaderManager;
 
 /**
- * Encapsulates OSGi-specific environment settings that can be used to configure
- * the rest of Cayenne.
+ * A {@link ClassLoaderManager} that
  * 
  * @since 3.2
  */
-public interface OsgiEnvironment {
+public class DefaultClassLoaderManager implements ClassLoaderManager {
+
+    @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();
 
-    ClassLoader resourceClassLoader(String resourceName);
+        if (classLoader == null) {
+            classLoader = DefaultClassLoaderManager.class.getClassLoader();
+        }
 
-    ClassLoader cayenneDiClassLoader();
+        // this is too paranoid I guess... "this" class will always have a
+        // ClassLoader
+        if (classLoader == null) {
+            throw new IllegalStateException("Can't find a ClassLoader");
+        }
 
-    ClassLoader cayenneServerClassLoader();
+        return classLoader;
+    }
 
 }

Modified: cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectLoaderTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectLoaderTest.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectLoaderTest.java (original)
+++ cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectLoaderTest.java Sun Nov 24 16:05:53 2013
@@ -29,10 +29,14 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
 import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader;
 import org.apache.cayenne.configuration.XMLDataMapLoader;
+import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.project.DataChannelProjectLoader;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.resource.Resource;
@@ -46,7 +50,11 @@ public class DataChannelProjectLoaderTes
 
         Module testModule = new Module() {
 
+            @Override
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
+
                 binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
                 binder.bind(DataChannelDescriptorLoader.class).to(
                         XMLDataChannelDescriptorLoader.class);

Modified: cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectSaverTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectSaverTest.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectSaverTest.java (original)
+++ cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/DataChannelProjectSaverTest.java Sun Nov 24 16:05:53 2013
@@ -29,10 +29,14 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
 import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader;
 import org.apache.cayenne.configuration.XMLDataMapLoader;
+import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.project.DataChannelProjectLoader;
 import org.apache.cayenne.project.FileProjectSaver;
 import org.apache.cayenne.project.Project;
@@ -49,7 +53,11 @@ public class DataChannelProjectSaverTest
 
         Module testModule = new Module() {
 
+            @Override
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
+
                 binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
                 binder.bind(DataChannelDescriptorLoader.class).to(
                         XMLDataChannelDescriptorLoader.class);
@@ -99,7 +107,10 @@ public class DataChannelProjectSaverTest
 
         Module testModule = new Module() {
 
+            @Override
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
                 binder.bind(DataChannelDescriptorLoader.class).to(
                         XMLDataChannelDescriptorLoader.class);

Modified: cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java (original)
+++ cayenne/main/trunk/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java Sun Nov 24 16:05:53 2013
@@ -34,18 +34,20 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.configuration.server.DBCPDataSourceFactory;
 import org.apache.cayenne.configuration.server.JNDIDataSourceFactory;
 import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory;
+import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.project.FileProjectSaver;
-import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.ProjectSaver;
 import org.apache.cayenne.project.unit.Project2Case;
 import org.apache.cayenne.project.upgrade.UpgradeHandler;
 import org.apache.cayenne.project.upgrade.UpgradeMetaData;
 import org.apache.cayenne.project.upgrade.UpgradeType;
-import org.apache.cayenne.project.upgrade.v6.ProjectUpgrader_V6;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.test.resource.ResourceUtil;
@@ -53,21 +55,19 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-public class ProjectUpgrader_V7Test extends Project2Case{
-    
+public class ProjectUpgrader_V7Test extends Project2Case {
+
     public void testMetadata_3_0_0_1() {
 
         String baseUrl = getClass().getPackage().getName().replace('.', '/');
-        URL url = getClass().getClassLoader().getResource(
-                baseUrl + "/3_0_0_1a/cayenne.xml");
+        URL url = getClass().getClassLoader().getResource(baseUrl + "/3_0_0_1a/cayenne.xml");
         assertNotNull(url);
 
         Module testModule = new Module() {
 
             public void configure(Binder binder) {
                 binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
-                binder.bind(ConfigurationNameMapper.class).to(
-                        DefaultConfigurationNameMapper.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
             }
         };
 
@@ -85,7 +85,7 @@ public class ProjectUpgrader_V7Test exte
         assertNotNull(md);
 
         assertSame(UpgradeType.UPGRADE_NEEDED, md.getUpgradeType());
-        //assertEquals("6", md.getIntermediateUpgradeVersion());
+        // assertEquals("6", md.getIntermediateUpgradeVersion());
         assertNull(md.getIntermediateUpgradeVersion());
         assertEquals("3.0.0.1", md.getProjectVersion());
         assertEquals("7", md.getSupportedVersion());
@@ -100,8 +100,7 @@ public class ProjectUpgrader_V7Test exte
 
             public void configure(Binder binder) {
                 binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
-                binder.bind(ConfigurationNameMapper.class).to(
-                        DefaultConfigurationNameMapper.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
             }
         };
 
@@ -125,16 +124,14 @@ public class ProjectUpgrader_V7Test exte
 
     public void testMetadata_Type6() {
         String baseUrl = getClass().getPackage().getName().replace('.', '/');
-        URL url = getClass().getClassLoader().getResource(
-                baseUrl + "/6a/cayenne-PROJECT1.xml");
+        URL url = getClass().getClassLoader().getResource(baseUrl + "/6a/cayenne-PROJECT1.xml");
         assertNotNull(url);
 
         Module testModule = new Module() {
 
             public void configure(Binder binder) {
                 binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
-                binder.bind(ConfigurationNameMapper.class).to(
-                        DefaultConfigurationNameMapper.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
             }
         };
 
@@ -155,19 +152,17 @@ public class ProjectUpgrader_V7Test exte
         assertEquals("6", md.getProjectVersion());
         assertEquals("7", md.getSupportedVersion());
     }
-    
+
     public void testMetadata_Type7() {
         String baseUrl = getClass().getPackage().getName().replace('.', '/');
-        URL url = getClass().getClassLoader().getResource(
-                baseUrl + "/7a/cayenne-PROJECT1.xml");
+        URL url = getClass().getClassLoader().getResource(baseUrl + "/7a/cayenne-PROJECT1.xml");
         assertNotNull(url);
 
         Module testModule = new Module() {
 
             public void configure(Binder binder) {
                 binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
-                binder.bind(ConfigurationNameMapper.class).to(
-                        DefaultConfigurationNameMapper.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
             }
         };
 
@@ -188,13 +183,12 @@ public class ProjectUpgrader_V7Test exte
         assertEquals("7", md.getProjectVersion());
         assertEquals("7", md.getSupportedVersion());
     }
-    
+
     public void testPerformUpgradeFrom3() throws Exception {
 
         System.out.println("TEST3");
         File testFolder = setupTestDirectory("testPerformUpgrade_3_0_0_1");
-        String sourceUrl = getClass().getPackage().getName().replace('.', '/')
-                + "/3_0_0_1a/";
+        String sourceUrl = getClass().getPackage().getName().replace('.', '/') + "/3_0_0_1a/";
 
         List<String> sources = new ArrayList<String>();
 
@@ -217,9 +211,10 @@ public class ProjectUpgrader_V7Test exte
         Module testModule = new Module() {
 
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
-                binder.bind(ConfigurationNameMapper.class).to(
-                        DefaultConfigurationNameMapper.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
                 binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
             }
         };
@@ -236,28 +231,21 @@ public class ProjectUpgrader_V7Test exte
         assertNotSame(source, upgrader);
 
         // check that all the new files are created...
-        String[] targetsAfterNames = new String[] {
-                "cayenne-d1.xml", "cayenne-d2.xml", "d1Map1.map.xml", "d1Map2.map.xml"
-        };
+        String[] targetsAfterNames = new String[] { "cayenne-d1.xml", "cayenne-d2.xml", "d1Map1.map.xml",
+                "d1Map2.map.xml" };
 
         File[] targetsAfter = new File[targetsAfterNames.length];
         for (int i = 0; i < targetsAfter.length; i++) {
             targetsAfter[i] = new File(testFolder, targetsAfterNames[i]);
-            assertTrue(
-                    "File was not created: " + targetsAfter[i].getAbsolutePath(),
-                    targetsAfter[i].exists());
+            assertTrue("File was not created: " + targetsAfter[i].getAbsolutePath(), targetsAfter[i].exists());
         }
 
         // DataMap files should remain the same; all others need to be deleted
         for (File file : targetsBefore) {
             if (file.getName().endsWith(".map.xml")) {
-                assertTrue("DataMap file disappeared: " + file.getAbsolutePath(), file
-                        .exists());
-            }
-            else {
-                assertFalse(
-                        "File expected to be deleted: " + file.getAbsolutePath(),
-                        file.exists());
+                assertTrue("DataMap file disappeared: " + file.getAbsolutePath(), file.exists());
+            } else {
+                assertFalse("File expected to be deleted: " + file.getAbsolutePath(), file.exists());
             }
         }
 
@@ -267,7 +255,7 @@ public class ProjectUpgrader_V7Test exte
         assertPerformUpgrade_3_0_0_1_d1Map1(targetsAfter[2]);
         assertPerformUpgrade_3_0_0_1_d1Map2(targetsAfter[3]);
     }
-    
+
     private void assertPerformUpgrade_3_0_0_1_cayenne_d1(File file) throws Exception {
         Document document = toDOMTree(file);
 
@@ -275,10 +263,7 @@ public class ProjectUpgrader_V7Test exte
         assertEquals("", xpath.evaluate("/domain/@name", document));
         assertEquals("7", xpath.evaluate("/domain/@project-version", document));
 
-        NodeList maps = (NodeList) xpath.evaluate(
-                "/domain/map",
-                document,
-                XPathConstants.NODESET);
+        NodeList maps = (NodeList) xpath.evaluate("/domain/map", document, XPathConstants.NODESET);
         assertNotNull(maps);
         assertEquals(2, maps.getLength());
 
@@ -288,34 +273,23 @@ public class ProjectUpgrader_V7Test exte
         assertEquals("d1Map1", xpath.evaluate("@name", map1));
         assertEquals("d1Map2", xpath.evaluate("@name", map2));
 
-        NodeList nodes = (NodeList) xpath.evaluate(
-                "/domain/node",
-                document,
-                XPathConstants.NODESET);
+        NodeList nodes = (NodeList) xpath.evaluate("/domain/node", document, XPathConstants.NODESET);
         assertNotNull(nodes);
         assertEquals(1, nodes.getLength());
 
         Node node1 = nodes.item(0);
 
         assertEquals("d1NodeDriver", xpath.evaluate("@name", node1));
-        assertEquals(XMLPoolingDataSourceFactory.class.getName(), xpath.evaluate(
-                "@factory",
-                node1));
-
-        NodeList mapRefs = (NodeList) xpath.evaluate(
-                "map-ref",
-                node1,
-                XPathConstants.NODESET);
+        assertEquals(XMLPoolingDataSourceFactory.class.getName(), xpath.evaluate("@factory", node1));
+
+        NodeList mapRefs = (NodeList) xpath.evaluate("map-ref", node1, XPathConstants.NODESET);
         assertNotNull(mapRefs);
         assertEquals(2, mapRefs.getLength());
 
         assertEquals("d1Map1", xpath.evaluate("@name", mapRefs.item(0)));
         assertEquals("d1Map2", xpath.evaluate("@name", mapRefs.item(1)));
 
-        NodeList dataSources = (NodeList) xpath.evaluate(
-                "data-source",
-                node1,
-                XPathConstants.NODESET);
+        NodeList dataSources = (NodeList) xpath.evaluate("data-source", node1, XPathConstants.NODESET);
         assertNotNull(dataSources);
         assertEquals(1, dataSources.getLength());
 
@@ -331,17 +305,11 @@ public class ProjectUpgrader_V7Test exte
         assertEquals("", xpath.evaluate("/domain/@name", document));
         assertEquals("7", xpath.evaluate("/domain/@project-version", document));
 
-        NodeList maps = (NodeList) xpath.evaluate(
-                "/domain/map",
-                document,
-                XPathConstants.NODESET);
+        NodeList maps = (NodeList) xpath.evaluate("/domain/map", document, XPathConstants.NODESET);
         assertNotNull(maps);
         assertEquals(0, maps.getLength());
 
-        NodeList nodes = (NodeList) xpath.evaluate(
-                "/domain/node",
-                document,
-                XPathConstants.NODESET);
+        NodeList nodes = (NodeList) xpath.evaluate("/domain/node", document, XPathConstants.NODESET);
         assertNotNull(nodes);
         assertEquals(2, nodes.getLength());
 
@@ -350,27 +318,17 @@ public class ProjectUpgrader_V7Test exte
 
         assertEquals("d2NodeDBCP", xpath.evaluate("@name", node1));
         assertEquals("dbcpx", xpath.evaluate("@parameters", node1));
-        assertEquals(DBCPDataSourceFactory.class.getName(), xpath.evaluate(
-                "@factory",
-                node1));
-
-        NodeList dataSources1 = (NodeList) xpath.evaluate(
-                "data-source",
-                node1,
-                XPathConstants.NODESET);
+        assertEquals(DBCPDataSourceFactory.class.getName(), xpath.evaluate("@factory", node1));
+
+        NodeList dataSources1 = (NodeList) xpath.evaluate("data-source", node1, XPathConstants.NODESET);
         assertNotNull(dataSources1);
         assertEquals(0, dataSources1.getLength());
 
         assertEquals("d2NodeJNDI", xpath.evaluate("@name", node2));
         assertEquals("jndi/x", xpath.evaluate("@parameters", node2));
-        assertEquals(JNDIDataSourceFactory.class.getName(), xpath.evaluate(
-                "@factory",
-                node2));
-
-        NodeList dataSources2 = (NodeList) xpath.evaluate(
-                "data-source",
-                node2,
-                XPathConstants.NODESET);
+        assertEquals(JNDIDataSourceFactory.class.getName(), xpath.evaluate("@factory", node2));
+
+        NodeList dataSources2 = (NodeList) xpath.evaluate("data-source", node2, XPathConstants.NODESET);
         assertNotNull(dataSources2);
         assertEquals(0, dataSources2.getLength());
     }
@@ -381,7 +339,7 @@ public class ProjectUpgrader_V7Test exte
         XPath xpath = XPathFactory.newInstance().newXPath();
         assertEquals("7", xpath.evaluate("/data-map/@project-version", document));
     }
-    
+
     private void assertPerformUpgrade_3_0_0_1_d1Map2(File file) throws Exception {
         Document document = toDOMTree(file);
 
@@ -391,74 +349,72 @@ public class ProjectUpgrader_V7Test exte
 
     public void testPerformUpgradeFrom6() throws Exception {
         File testForlder = setupTestDirectory("testUpgrade6a");
-        String sourceUrl = getClass().getPackage().getName().replace('.', '/')
-                + "/6a/";
+        String sourceUrl = getClass().getPackage().getName().replace('.', '/') + "/6a/";
         System.out.println(sourceUrl);
         Module testModule = new Module() {
 
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
+
                 binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
-                binder.bind(ConfigurationNameMapper.class).to(
-                        DefaultConfigurationNameMapper.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
                 binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
             }
         };
-        
-        String[] resources = {"cayenne-PROJECT1.xml","testProjectMap1_1.map.xml", "testProjectMap1_2.map.xml"};
+
+        String[] resources = { "cayenne-PROJECT1.xml", "testProjectMap1_1.map.xml", "testProjectMap1_2.map.xml" };
         List<File> files = new ArrayList<File>();
-        
+
         for (String name : resources) {
-            URL xmlUrl = getClass().getClassLoader().getResource(sourceUrl+name);
+            URL xmlUrl = getClass().getClassLoader().getResource(sourceUrl + name);
             File target = new File(testForlder, name);
             ResourceUtil.copyResourceToFile(xmlUrl, target);
             files.add(target);
         }
-        
-        
+
         Injector injector = DIBootstrap.createInjector(testModule);
         ProjectUpgrader_V7 upgrader = new ProjectUpgrader_V7();
         injector.injectMembers(upgrader);
-        
+
         Resource source = new URLResource(files.get(0).toURL());
         assertNotNull(source);
         UpgradeHandler handler = upgrader.getUpgradeHandler(source);
         assertNotNull(handler);
-        
+
         Resource upgraded = handler.performUpgrade();
         assertNotNull(upgraded);
         assertNotSame(source, upgraded);
-        
+
         assertPerformUpgrade6Cayenne(files.get(0));
         assertPerformUpgrade6Map1(files.get(1));
         assertPerformUpgradeMap2(files.get(2));
     }
-    
+
     private void assertPerformUpgrade6Map1(File file) throws Exception {
         Document document = toDOMTree(file);
 
         XPath xpath = XPathFactory.newInstance().newXPath();
         assertEquals("7", xpath.evaluate("/data-map/@project-version", document));
-        
-        NodeList maps = (NodeList) xpath.evaluate(
-                "/data-map/obj-entity/entity-listener",
-                document,
+
+        NodeList maps = (NodeList) xpath.evaluate("/data-map/obj-entity/entity-listener", document,
                 XPathConstants.NODESET);
         assertNotNull(maps);
         assertEquals(0, maps.getLength());
     }
-    
+
     private void assertPerformUpgrade6Cayenne(File file) throws Exception {
         Document document = toDOMTree(file);
 
         XPath xpath = XPathFactory.newInstance().newXPath();
         assertEquals("7", xpath.evaluate("/domain/@project-version", document));
     }
-    
+
     private void assertPerformUpgradeMap2(File file) throws Exception {
         Document document = toDOMTree(file);
 
         XPath xpath = XPathFactory.newInstance().newXPath();
         assertEquals("7", xpath.evaluate("/data-map/@project-version", document));
     }
-    
+
 }

Copied: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java (from r1544996, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactory.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java?p2=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java&p1=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactory.java&r1=1544996&r2=1545007&rev=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactory.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManager.java Sun Nov 24 16:05:53 2013
@@ -18,30 +18,33 @@
  ****************************************************************/
 package org.apache.cayenne.configuration.osgi;
 
-import org.apache.cayenne.di.AdhocObjectFactory;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import java.util.Map;
+
+import org.apache.cayenne.di.ClassLoaderManager;
+import org.apache.cayenne.di.Injector;
 
 /**
- * An OSGi-friendly {@link AdhocObjectFactory} that tries to detect the right
- * ClassLoader for any given resource based on the package name.
- * 
  * @since 3.2
  */
-class SplitClassLoaderAdhocObjectFactory extends DefaultAdhocObjectFactory {
+public class OsgiClassLoaderManager implements ClassLoaderManager {
 
     private static final String CAYENNE_PACKAGE = "org/apache/cayenne";
     private static final String CAYENNE_DI_PACKAGE_SUFFIX = "/di";
 
-    private OsgiEnvironment osgiEnvironment;
-
-    SplitClassLoaderAdhocObjectFactory(@Inject OsgiEnvironment osgiEnvironment) {
-        this.osgiEnvironment = osgiEnvironment;
+    private ClassLoader applicationClassLoader;
+    private ClassLoader cayenneServerClassLoader;
+    private ClassLoader cayenneDiClassLoader;
+    private Map<String, ClassLoader> perResourceClassLoaders;
+
+    public OsgiClassLoaderManager(ClassLoader applicationClassLoader, Map<String, ClassLoader> perResourceClassLoaders) {
+        this.applicationClassLoader = applicationClassLoader;
+        this.cayenneDiClassLoader = Injector.class.getClassLoader();
+        this.cayenneServerClassLoader = OsgiClassLoaderManager.class.getClassLoader();
+        this.perResourceClassLoaders = perResourceClassLoaders;
     }
 
     @Override
     public ClassLoader getClassLoader(String resourceName) {
-
         if (resourceName == null || resourceName.length() < 2) {
             return resourceClassLoader(resourceName);
         }
@@ -57,15 +60,15 @@ class SplitClassLoaderAdhocObjectFactory
     }
 
     protected ClassLoader resourceClassLoader(String resourceName) {
-        return osgiEnvironment.resourceClassLoader(resourceName);
+        ClassLoader cl = perResourceClassLoaders.get(resourceName);
+        return cl != null ? cl : applicationClassLoader;
     }
 
     protected ClassLoader cayenneDiClassLoader() {
-        return osgiEnvironment.cayenneDiClassLoader();
+        return cayenneDiClassLoader;
     }
 
     protected ClassLoader cayenneServerClassLoader() {
-        return osgiEnvironment.cayenneServerClassLoader();
+        return cayenneServerClassLoader;
     }
-
 }

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiDataDomainProvider.java Sun Nov 24 16:05:53 2013
@@ -21,6 +21,7 @@ package org.apache.cayenne.configuration
 import org.apache.cayenne.ConfigurationException;
 import org.apache.cayenne.access.DataDomain;
 import org.apache.cayenne.configuration.server.DataDomainProvider;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
@@ -32,10 +33,10 @@ import org.apache.cayenne.map.ObjEntity;
 // at the EntityResolver level per CAY-1887
 public class OsgiDataDomainProvider extends DataDomainProvider {
 
-    private OsgiEnvironment osgiEnvironment;
+    private ClassLoaderManager classLoaderManager;
 
-    public OsgiDataDomainProvider(@Inject OsgiEnvironment osgiEnvironment) {
-        this.osgiEnvironment = osgiEnvironment;
+    public OsgiDataDomainProvider(@Inject ClassLoaderManager classLoaderManager) {
+        this.classLoaderManager = classLoaderManager;
     }
 
     @Override
@@ -48,9 +49,9 @@ public class OsgiDataDomainProvider exte
         ClassLoader activeCl = thread.getContextClassLoader();
         try {
 
-            // using fake package name... may not work with all implementations
-            // of osgiEnvironment?
-            thread.setContextClassLoader(osgiEnvironment.resourceClassLoader("com/"));
+            // using fake package name... as long as it is not
+            // org.apache.cayenne, this do the right trick
+            thread.setContextClassLoader(classLoaderManager.getClassLoader("com/"));
 
             DataDomain domain = super.get();
             EntityResolver entityResolver = domain.getEntityResolver();

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/osgi/OsgiModule.java Sun Nov 24 16:05:53 2013
@@ -22,8 +22,8 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.cayenne.access.DataDomain;
-import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.Module;
 
 /**
@@ -50,13 +50,11 @@ public class OsgiModule implements Modul
 
     @Override
     public void configure(Binder binder) {
-        binder.bind(OsgiEnvironment.class).toInstance(createOsgiEnvironment());
-
-        binder.bind(AdhocObjectFactory.class).to(SplitClassLoaderAdhocObjectFactory.class);
+        binder.bind(ClassLoaderManager.class).toInstance(createClassLoaderManager());
         binder.bind(DataDomain.class).toProvider(OsgiDataDomainProvider.class);
     }
 
-    private OsgiEnvironment createOsgiEnvironment() {
-        return new DefaultOsgiEnvironment(typeFromProjectBundle.getClassLoader(), perTypeClassLoaders);
+    private ClassLoaderManager createClassLoaderManager() {
+        return new OsgiClassLoaderManager(typeFromProjectBundle.getClassLoader(), perTypeClassLoaders);
     }
 }

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java Sun Nov 24 16:05:53 2013
@@ -80,10 +80,11 @@ import org.apache.cayenne.dba.sqlserver.
 import org.apache.cayenne.dba.sybase.SybaseSniffer;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Key;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.ListBuilder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.event.DefaultEventManager;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.log.CommonsJdbcEventLogger;
@@ -128,7 +129,8 @@ public class ServerModule implements Mod
         binder.bindMap(Constants.PROPERTIES_MAP)
             .put(Constants.SERVER_MAX_ID_QUALIFIER_SIZE_PROPERTY, String.valueOf(DEFAULT_MAX_ID_QUALIFIER_SIZE));
 
-        binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);        
+        binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);  
+        binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
         binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
 
         // configure known DbAdapter detectors in reverse order of popularity. Users can

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=1545007&r1=1545006&r2=1545007&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 16:05:53 2013
@@ -25,7 +25,7 @@ import java.util.Collection;
 import java.util.Enumeration;
 
 import org.apache.cayenne.ConfigurationException;
-import org.apache.cayenne.di.AdhocObjectFactory;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.Inject;
 
 /**
@@ -35,11 +35,11 @@ import org.apache.cayenne.di.Inject;
  * @since 3.1
  */
 public class ClassLoaderResourceLocator implements ResourceLocator {
-    
-    private AdhocObjectFactory objectFactory;
-    
-    public ClassLoaderResourceLocator(@Inject AdhocObjectFactory objectFactory) {
-        this.objectFactory = objectFactory;
+
+    private ClassLoaderManager classLoaderManager;
+
+    public ClassLoaderResourceLocator(@Inject ClassLoaderManager classLoaderManager) {
+        this.classLoaderManager = classLoaderManager;
     }
 
     @Override
@@ -49,7 +49,7 @@ public class ClassLoaderResourceLocator 
 
         Enumeration<URL> urls;
         try {
-            urls = objectFactory.getClassLoader(name).getResources(name);
+            urls = classLoaderManager.getClassLoader(name).getResources(name);
         } catch (IOException e) {
             throw new ConfigurationException("Error getting resources for ");
         }
@@ -67,7 +67,8 @@ public class ClassLoaderResourceLocator 
     }
 
     /**
-     * @deprecated since 3.2 unused, as AdhocObjectFactory.getClassLoader() is used instead.
+     * @deprecated since 3.2 unused, as AdhocObjectFactory.getClassLoader() is
+     *             used instead.
      */
     @Deprecated
     protected ClassLoader getClassLoader() {

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java Sun Nov 24 16:05:53 2013
@@ -51,7 +51,9 @@ import javax.xml.parsers.SAXParserFactor
 import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
+import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.reflect.ArcProperty;
 import org.apache.cayenne.reflect.AttributeProperty;
 import org.apache.cayenne.reflect.PropertyVisitor;
@@ -65,15 +67,16 @@ import org.xml.sax.XMLReader;
  */
 public class Util {
 
+    @Deprecated
     private static DefaultAdhocObjectFactory objectFactory;
 
     static {
-        objectFactory = new DefaultAdhocObjectFactory();
+        objectFactory = new DefaultAdhocObjectFactory(null, new DefaultClassLoaderManager());
     }
 
     /**
-     * Converts URL to file. Throws {@link IllegalArgumentException} if the URL is not a
-     * "file://" URL.
+     * Converts URL to file. Throws {@link IllegalArgumentException} if the URL
+     * is not a "file://" URL.
      */
     public static File toFile(URL url) throws IllegalArgumentException {
         // must convert spaces to %20, or URL->URI conversion may fail
@@ -82,25 +85,23 @@ public class Util {
         URI uri;
         try {
             uri = new URI(urlString.replace(" ", "%20"));
-        }
-        catch (URISyntaxException e) {
-            throw new IllegalArgumentException("URL "
-                    + urlString
-                    + " can't be converted to URI", e);
+        } catch (URISyntaxException e) {
+            throw new IllegalArgumentException("URL " + urlString + " can't be converted to URI", e);
         }
         return new File(uri);
     }
 
     /**
-     * Reads file contents, returning it as a String, using System default line separator.
+     * Reads file contents, returning it as a String, using System default line
+     * separator.
      */
     public static String stringFromFile(File file) throws IOException {
         return stringFromFile(file, System.getProperty("line.separator"));
     }
 
     /**
-     * Reads file contents, returning it as a String, joining lines with provided
-     * separator.
+     * Reads file contents, returning it as a String, joining lines with
+     * provided separator.
      */
     public static String stringFromFile(File file, String joinWith) throws IOException {
         StringBuilder buf = new StringBuilder();
@@ -111,17 +112,19 @@ public class Util {
             while ((line = in.readLine()) != null) {
                 buf.append(line).append(joinWith);
             }
-        }
-        finally {
+        } finally {
             in.close();
         }
         return buf.toString();
     }
 
     /**
-     * @param strings The list of strings to join.
-     * @param separator The separator between the strings.
-     * @return A single string of all the input strings separated by the separator.
+     * @param strings
+     *            The list of strings to join.
+     * @param separator
+     *            The separator between the strings.
+     * @return A single string of all the input strings separated by the
+     *         separator.
      */
     public static String join(List<String> strings, String separator) {
         if (strings == null || strings.size() == 0)
@@ -142,17 +145,17 @@ public class Util {
     }
 
     /**
-     * Replaces all backslashes "\" with forward slashes "/". Convenience method to
-     * convert path Strings to URI format.
+     * Replaces all backslashes "\" with forward slashes "/". Convenience method
+     * to convert path Strings to URI format.
      */
     public static String substBackslashes(String string) {
         return RegexUtil.substBackslashes(string);
     }
 
     /**
-     * Looks up and returns the root cause of an exception. If none is found, returns
-     * supplied Throwable object unchanged. If root is found, recursively "unwraps" it,
-     * and returns the result to the user.
+     * Looks up and returns the root cause of an exception. If none is found,
+     * returns supplied Throwable object unchanged. If root is found,
+     * recursively "unwraps" it, and returns the result to the user.
      */
     public static Throwable unwindException(Throwable th) {
         if (th instanceof SAXException) {
@@ -160,14 +163,12 @@ public class Util {
             if (sax.getException() != null) {
                 return unwindException(sax.getException());
             }
-        }
-        else if (th instanceof SQLException) {
+        } else if (th instanceof SQLException) {
             SQLException sql = (SQLException) th;
             if (sql.getNextException() != null) {
                 return unwindException(sql.getNextException());
             }
-        }
-        else if (th.getCause() != null) {
+        } else if (th.getCause() != null) {
             return unwindException(th.getCause());
         }
 
@@ -175,8 +176,9 @@ public class Util {
     }
 
     /**
-     * Compares two objects similar to "Object.equals(Object)". Unlike Object.equals(..),
-     * this method doesn't throw an exception if any of the two objects is null.
+     * Compares two objects similar to "Object.equals(Object)". Unlike
+     * Object.equals(..), this method doesn't throw an exception if any of the
+     * two objects is null.
      */
     public static boolean nullSafeEquals(Object o1, Object o2) {
 
@@ -192,30 +194,26 @@ public class Util {
             EqualsBuilder builder = new EqualsBuilder();
             builder.append(o1, o2);
             return builder.isEquals();
-        }
-        else { // It is NOT an array, so use regular equals()
+        } else { // It is NOT an array, so use regular equals()
             return o1.equals(o2);
         }
     }
 
     /**
      * Compares two objects similar to "Comparable.compareTo(Object)". Unlike
-     * Comparable.compareTo(..), this method doesn't throw an exception if any of the two
-     * objects is null.
-     *
+     * Comparable.compareTo(..), this method doesn't throw an exception if any
+     * of the two objects is null.
+     * 
      * @since 1.1
      */
     public static <T> int nullSafeCompare(boolean nullsFirst, Comparable<T> o1, T o2) {
         if (o1 == null && o2 == null) {
             return 0;
-        }
-        else if (o1 == null) {
+        } else if (o1 == null) {
             return nullsFirst ? -1 : 1;
-        }
-        else if (o2 == null) {
+        } else if (o2 == null) {
             return nullsFirst ? 1 : -1;
-        }
-        else {
+        } else {
             return o1.compareTo(o2);
         }
     }
@@ -230,8 +228,7 @@ public class Util {
     /**
      * Creates Serializable object copy using serialization/deserialization.
      */
-    public static <T extends Serializable> T cloneViaSerialization(T object)
-            throws Exception {
+    public static <T extends Serializable> T cloneViaSerialization(T object) throws Exception {
         ByteArrayOutputStream bytes = new ByteArrayOutputStream() {
 
             @Override
@@ -244,23 +241,22 @@ public class Util {
         out.writeObject(object);
         out.close();
 
-        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes
-                .toByteArray()));
+        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()));
         T copy = (T) in.readObject();
 
-        // no need to close the stream - we created it and now will be throwing away...
+        // no need to close the stream - we created it and now will be throwing
+        // away...
         // in.close();
 
         return copy;
     }
 
     /**
-     * Creates an XMLReader with default feature set. Note that all Cayenne internal XML
-     * parsers should probably use XMLReader obtained via this method for consistency
-     * sake, and can customize feature sets as needed.
+     * Creates an XMLReader with default feature set. Note that all Cayenne
+     * internal XML parsers should probably use XMLReader obtained via this
+     * method for consistency sake, and can customize feature sets as needed.
      */
-    public static XMLReader createXmlReader() throws SAXException,
-            ParserConfigurationException {
+    public static XMLReader createXmlReader() throws SAXException, ParserConfigurationException {
         SAXParserFactory spf = SAXParserFactory.newInstance();
 
         // Create a JAXP SAXParser
@@ -276,10 +272,10 @@ public class Util {
     }
 
     /**
-     * Returns package name for the Java class as a path separated with forward slash
-     * ("/"). Method is used to lookup resources that are located in package
-     * subdirectories. For example, a String "a/b/c" will be returned for class name
-     * "a.b.c.ClassName".
+     * Returns package name for the Java class as a path separated with forward
+     * slash ("/"). Method is used to lookup resources that are located in
+     * package subdirectories. For example, a String "a/b/c" will be returned
+     * for class name "a.b.c.ClassName".
      */
     public static String getPackagePath(String className) {
         return RegexUtil.getPackagePath(className);
@@ -287,7 +283,7 @@ public class Util {
 
     /**
      * Returns an unqualified class name for the fully qualified name.
-     *
+     * 
      * @since 3.0
      */
     public static String stripPackageName(String className) {
@@ -304,7 +300,7 @@ public class Util {
 
     /**
      * Creates a mutable map out of two arrays with keys and values.
-     *
+     * 
      * @since 1.2
      */
     public static <K, V> Map<K, V> toMap(K[] keys, V[] values) {
@@ -317,8 +313,7 @@ public class Util {
         }
 
         if (keysSize != valuesSize) {
-            throw new IllegalArgumentException(
-                    "The number of keys doesn't match the number of values.");
+            throw new IllegalArgumentException("The number of keys doesn't match the number of values.");
         }
 
         Map<K, V> map = new HashMap<K, V>();
@@ -330,15 +325,15 @@ public class Util {
     }
 
     /**
-     * Extracts extension from the file name. Dot is not included in the returned string.
+     * Extracts extension from the file name. Dot is not included in the
+     * returned string.
      */
     public static String extractFileExtension(String fileName) {
         int dotInd = fileName.lastIndexOf('.');
 
         // if dot is in the first position,
         // we are dealing with a hidden file rather than an extension
-        return (dotInd > 0 && dotInd < fileName.length()) ? fileName
-                .substring(dotInd + 1) : null;
+        return (dotInd > 0 && dotInd < fileName.length()) ? fileName.substring(dotInd + 1) : null;
     }
 
     /**
@@ -353,9 +348,9 @@ public class Util {
     }
 
     /**
-     * Strips "\n", "\r\n", "\r" from the argument string, replacing them with a provided
-     * character.
-     *
+     * Strips "\n", "\r\n", "\r" from the argument string, replacing them with a
+     * provided character.
+     * 
      * @since 3.1
      */
     public static String stripLineBreaks(String string, char replaceWith) {
@@ -383,8 +378,7 @@ public class Util {
                 }
 
                 buffer[j] = replaceWith;
-            }
-            else {
+            } else {
                 buffer[j] = c;
             }
         }
@@ -393,8 +387,9 @@ public class Util {
     }
 
     /**
-     * Encodes a string so that it can be used as an attribute value in an XML document.
-     * Will do conversion of the greater/less signs, quotes and ampersands.
+     * Encodes a string so that it can be used as an attribute value in an XML
+     * document. Will do conversion of the greater/less signs, quotes and
+     * ampersands.
      */
     public static String encodeXmlAttribute(String string) {
         if (string == null) {
@@ -428,18 +423,18 @@ public class Util {
 
     /**
      * Trims long strings substituting middle part with "...".
-     *
-     * @param str String to trim.
-     * @param maxLength maximum allowable length. Must be at least 5, or an
+     * 
+     * @param str
+     *            String to trim.
+     * @param maxLength
+     *            maximum allowable length. Must be at least 5, or an
      *            IllegalArgumentException is thrown.
      * @return String
      */
     public static String prettyTrim(String str, int maxLength) {
         if (maxLength < 5) {
-            throw new IllegalArgumentException(
-                    "Algorithm for 'prettyTrim' works only with length >= 5. "
-                            + "Supplied length is "
-                            + maxLength);
+            throw new IllegalArgumentException("Algorithm for 'prettyTrim' works only with length >= 5. "
+                    + "Supplied length is " + maxLength);
         }
 
         if (str == null || str.length() <= maxLength) {
@@ -455,9 +450,9 @@ public class Util {
     }
 
     /**
-     * Returns a sorted iterator from an unsorted one. Use this method as a last resort,
-     * since it is much less efficient then just sorting a collection that backs the
-     * original iterator.
+     * Returns a sorted iterator from an unsorted one. Use this method as a last
+     * resort, since it is much less efficient then just sorting a collection
+     * that backs the original iterator.
      */
     public static <T> Iterator<T> sortedIterator(Iterator<T> it, Comparator<T> comparator) {
         List<T> list = new ArrayList<T>();
@@ -491,14 +486,13 @@ public class Util {
     }
 
     /**
-     * Returns true if a Member is accessible via reflection under normal Java access
-     * controls.
-     *
+     * Returns true if a Member is accessible via reflection under normal Java
+     * access controls.
+     * 
      * @since 1.2
      */
     public static boolean isAccessible(Member member) {
-        return Modifier.isPublic(member.getModifiers())
-                && Modifier.isPublic(member.getDeclaringClass().getModifiers());
+        return Modifier.isPublic(member.getModifiers()) && Modifier.isPublic(member.getDeclaringClass().getModifiers());
     }
 
     /**
@@ -516,14 +510,9 @@ public class Util {
         return objectFactory.getJavaClass(className);
     }
 
-    static void setReverse(
-            final Persistent sourceObject,
-            String propertyName,
-            final Persistent targetObject) {
-
-        ArcProperty property = (ArcProperty) Cayenne
-                .getClassDescriptor(sourceObject)
-                .getProperty(propertyName);
+    static void setReverse(final Persistent sourceObject, String propertyName, final Persistent targetObject) {
+
+        ArcProperty property = (ArcProperty) Cayenne.getClassDescriptor(sourceObject).getProperty(propertyName);
         ArcProperty reverseArc = property.getComplimentaryReverseArc();
         if (reverseArc != null) {
             reverseArc.visit(new PropertyVisitor() {
@@ -544,23 +533,16 @@ public class Util {
 
             });
 
-            sourceObject.getObjectContext().getGraphManager().arcCreated(
-                    targetObject.getObjectId(),
-                    sourceObject.getObjectId(),
-                    reverseArc.getName());
+            sourceObject.getObjectContext().getGraphManager()
+                    .arcCreated(targetObject.getObjectId(), sourceObject.getObjectId(), reverseArc.getName());
 
             markAsDirty(targetObject);
         }
     }
 
-    static void unsetReverse(
-            final Persistent sourceObject,
-            String propertyName,
-            final Persistent targetObject) {
-
-        ArcProperty property = (ArcProperty) Cayenne
-                .getClassDescriptor(sourceObject)
-                .getProperty(propertyName);
+    static void unsetReverse(final Persistent sourceObject, String propertyName, final Persistent targetObject) {
+
+        ArcProperty property = (ArcProperty) Cayenne.getClassDescriptor(sourceObject).getProperty(propertyName);
         ArcProperty reverseArc = property.getComplimentaryReverseArc();
         if (reverseArc != null) {
             reverseArc.visit(new PropertyVisitor() {
@@ -581,18 +563,16 @@ public class Util {
 
             });
 
-            sourceObject.getObjectContext().getGraphManager().arcDeleted(
-                    targetObject.getObjectId(),
-                    sourceObject.getObjectId(),
-                    reverseArc.getName());
+            sourceObject.getObjectContext().getGraphManager()
+                    .arcDeleted(targetObject.getObjectId(), sourceObject.getObjectId(), reverseArc.getName());
 
             markAsDirty(targetObject);
         }
     }
 
     /**
-     * Changes object state to MODIFIED if needed, returning true if the change has
-     * occurred, false if not.
+     * Changes object state to MODIFIED if needed, returning true if the change
+     * has occurred, false if not.
      */
     static boolean markAsDirty(Persistent object) {
         if (object.getPersistenceState() == PersistenceState.COMMITTED) {

Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java Sun Nov 24 16:05:53 2013
@@ -29,10 +29,12 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.configuration.XMLDataMapLoader;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.Relationship;
@@ -50,6 +52,7 @@ public class ManyToManyCandidateEntityTe
         Module testModule = new Module() {
 
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
                 binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);

Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoaderTest.java Sun Nov 24 16:05:53 2013
@@ -27,10 +27,12 @@ import junit.framework.TestCase;
 import org.apache.cayenne.ConfigurationException;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.resource.URLResource;
 
@@ -43,6 +45,7 @@ public class XMLDataChannelDescriptorLoa
         Module testModule = new Module() {
 
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
                 binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);

Copied: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java (from r1544996, cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactoryTest.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java?p2=cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java&p1=cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactoryTest.java&r1=1544996&r2=1545007&rev=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/SplitClassLoaderAdhocObjectFactoryTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/osgi/OsgiClassLoaderManagerTest.java Sun Nov 24 16:05:53 2013
@@ -18,12 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.configuration.osgi;
 
-import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+
 import junit.framework.TestCase;
 
-public class SplitClassLoaderAdhocObjectFactoryTest extends TestCase {
+public class OsgiClassLoaderManagerTest extends TestCase {
 
     public void testGetClassLoader() {
 
@@ -31,20 +32,25 @@ public class SplitClassLoaderAdhocObject
         final ClassLoader diCl = mock(ClassLoader.class);
         final ClassLoader serverCl = mock(ClassLoader.class);
 
-        OsgiEnvironment osgiEnvironment = mock(OsgiEnvironment.class);
-        when(osgiEnvironment.resourceClassLoader(anyString())).thenReturn(appCl);
-        when(osgiEnvironment.cayenneDiClassLoader()).thenReturn(diCl);
-        when(osgiEnvironment.cayenneServerClassLoader()).thenReturn(serverCl);
-        
-        SplitClassLoaderAdhocObjectFactory factory = new SplitClassLoaderAdhocObjectFactory(osgiEnvironment);
-
-        assertSame(appCl, factory.getClassLoader(null));
-        assertSame(appCl, factory.getClassLoader(""));
-        assertSame(appCl, factory.getClassLoader("org/example/test"));
-        assertSame(appCl, factory.getClassLoader("/org/example/test"));
-        assertSame(serverCl, factory.getClassLoader("/org/apache/cayenne/access/DataContext.class"));
-        assertSame(diCl, factory.getClassLoader("/org/apache/cayenne/di/Injector.class"));
-        assertSame(diCl, factory.getClassLoader("org/apache/cayenne/di/Injector.class"));
+        OsgiClassLoaderManager manager = new OsgiClassLoaderManager(appCl, Collections.<String, ClassLoader> emptyMap()) {
+            @Override
+            protected ClassLoader cayenneDiClassLoader() {
+                return diCl;
+            }
+
+            @Override
+            protected ClassLoader cayenneServerClassLoader() {
+                return serverCl;
+            }
+        };
+
+        assertSame(appCl, manager.getClassLoader(null));
+        assertSame(appCl, manager.getClassLoader(""));
+        assertSame(appCl, manager.getClassLoader("org/example/test"));
+        assertSame(appCl, manager.getClassLoader("/org/example/test"));
+        assertSame(serverCl, manager.getClassLoader("/org/apache/cayenne/access/DataContext.class"));
+        assertSame(diCl, manager.getClassLoader("/org/apache/cayenne/di/Injector.class"));
+        assertSame(diCl, manager.getClassLoader("org/apache/cayenne/di/Injector.class"));
 
     }
 

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=1545007&r1=1545006&r2=1545007&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 16:05:53 2013
@@ -50,6 +50,7 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.configuration.mock.MockDataSourceFactory;
 import org.apache.cayenne.dba.db2.DB2Sniffer;
 import org.apache.cayenne.dba.derby.DerbySniffer;
+import org.apache.cayenne.dba.firebird.FirebirdSniffer;
 import org.apache.cayenne.dba.frontbase.FrontBaseSniffer;
 import org.apache.cayenne.dba.h2.H2Sniffer;
 import org.apache.cayenne.dba.hsqldb.HSQLDBSniffer;
@@ -64,10 +65,12 @@ import org.apache.cayenne.dba.sqlserver.
 import org.apache.cayenne.dba.sybase.SybaseSniffer;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.event.EventManager;
 import org.apache.cayenne.event.MockEventManager;
 import org.apache.cayenne.log.CommonsJdbcEventLogger;
@@ -108,10 +111,9 @@ public class DataDomainProviderTest exte
         nodeDescriptor2.setParameters("testDataNode2.driver.xml");
         testDescriptor.getNodeDescriptors().add(nodeDescriptor2);
 
-       
-
         final DataChannelDescriptorLoader testLoader = new DataChannelDescriptorLoader() {
 
+            @Override
             public ConfigurationTree<DataChannelDescriptor> load(Resource configurationResource)
                     throws ConfigurationException {
                 return new ConfigurationTree<DataChannelDescriptor>(testDescriptor, null);
@@ -122,19 +124,34 @@ public class DataDomainProviderTest exte
 
         Module testModule = new Module() {
 
+            @Override
             public void configure(Binder binder) {
-                final AdhocObjectFactory objectFactory = new DefaultAdhocObjectFactory();
-                binder.bind(AdhocObjectFactory.class).toInstance(objectFactory);
+                final ClassLoaderManager classLoaderManager = new DefaultClassLoaderManager();
+                binder.bind(ClassLoaderManager.class).toInstance(classLoaderManager);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
 
                 binder.bindMap(Constants.PROPERTIES_MAP);
 
-                binder.bindList(Constants.SERVER_ADAPTER_DETECTORS_LIST).add(new OpenBaseSniffer(objectFactory))
-                        .add(new FrontBaseSniffer(objectFactory)).add(new IngresSniffer(objectFactory))
-                        .add(new SQLiteSniffer(objectFactory)).add(new DB2Sniffer(objectFactory))
-                        .add(new H2Sniffer(objectFactory)).add(new HSQLDBSniffer(objectFactory))
-                        .add(new SybaseSniffer(objectFactory)).add(new DerbySniffer(objectFactory))
-                        .add(new SQLServerSniffer(objectFactory)).add(new OracleSniffer(objectFactory))
-                        .add(new PostgresSniffer(objectFactory)).add(new MySQLSniffer(objectFactory));
+                binder.bind(FirebirdSniffer.class).to(FirebirdSniffer.class);
+                binder.bind(OpenBaseSniffer.class).to(OpenBaseSniffer.class);
+                binder.bind(FrontBaseSniffer.class).to(FrontBaseSniffer.class);
+                binder.bind(IngresSniffer.class).to(IngresSniffer.class);
+                binder.bind(SQLiteSniffer.class).to(SQLiteSniffer.class);
+                binder.bind(DB2Sniffer.class).to(DB2Sniffer.class);
+                binder.bind(H2Sniffer.class).to(H2Sniffer.class);
+                binder.bind(HSQLDBSniffer.class).to(HSQLDBSniffer.class);
+                binder.bind(SybaseSniffer.class).to(SybaseSniffer.class);
+                binder.bind(DerbySniffer.class).to(DerbySniffer.class);
+                binder.bind(SQLServerSniffer.class).to(SQLServerSniffer.class);
+                binder.bind(OracleSniffer.class).to(OracleSniffer.class);
+                binder.bind(PostgresSniffer.class).to(PostgresSniffer.class);
+                binder.bind(MySQLSniffer.class).to(MySQLSniffer.class);
+
+                binder.bindList(Constants.SERVER_ADAPTER_DETECTORS_LIST).add(FirebirdSniffer.class)
+                        .add(OpenBaseSniffer.class).add(FrontBaseSniffer.class).add(IngresSniffer.class)
+                        .add(SQLiteSniffer.class).add(DB2Sniffer.class).add(H2Sniffer.class).add(HSQLDBSniffer.class)
+                        .add(SybaseSniffer.class).add(DerbySniffer.class).add(SQLServerSniffer.class)
+                        .add(OracleSniffer.class).add(PostgresSniffer.class).add(MySQLSniffer.class);
                 binder.bindList(Constants.SERVER_DOMAIN_FILTERS_LIST);
                 binder.bindList(Constants.SERVER_PROJECT_LOCATIONS_LIST).add(testConfigName);
 
@@ -145,22 +162,23 @@ public class DataDomainProviderTest exte
 
                 binder.bind(EventManager.class).toInstance(eventManager);
                 binder.bind(EntitySorter.class).toInstance(new AshwoodEntitySorter());
-                
-                final ResourceLocator locator = new ClassLoaderResourceLocator(objectFactory) {
+
+                final ResourceLocator locator = new ClassLoaderResourceLocator(classLoaderManager) {
 
                     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
+                        // types.xml... if this is the request we are getting,
+                        // just let
                         // it go through..
                         if (name.endsWith("types.xml")) {
-                           return super.findResources(name);
+                            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);

Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java Sun Nov 24 16:05:53 2013
@@ -30,10 +30,12 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.log.CommonsJdbcEventLogger;
 import org.apache.cayenne.log.JdbcEventLogger;
 import org.apache.cayenne.resource.ResourceLocator;
@@ -41,24 +43,30 @@ import org.apache.cayenne.resource.mock.
 
 public class DefaultDataSourceFactoryLoaderTest extends TestCase {
 
-    public void testGetDataSourceFactory_Implicit() throws Exception {
-
-        DataNodeDescriptor nodeDescriptor = new DataNodeDescriptor();
-        nodeDescriptor.setName("node1");
-        nodeDescriptor.setDataSourceDescriptor(new DataSourceInfo());
+    private Injector injector;
 
+    @Override
+    protected void setUp() throws Exception {
         Module testModule = new Module() {
 
+            @Override
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(ResourceLocator.class).to(MockResourceLocator.class);
-                binder.bind(RuntimeProperties.class).toInstance(
-                        mock(RuntimeProperties.class));
+                binder.bind(RuntimeProperties.class).toInstance(mock(RuntimeProperties.class));
                 binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
             }
         };
 
-        Injector injector = DIBootstrap.createInjector(testModule);
+        this.injector = DIBootstrap.createInjector(testModule);
+    }
+
+    public void testGetDataSourceFactory_Implicit() throws Exception {
+
+        DataNodeDescriptor nodeDescriptor = new DataNodeDescriptor();
+        nodeDescriptor.setName("node1");
+        nodeDescriptor.setDataSourceDescriptor(new DataSourceInfo());
 
         DelegatingDataSourceFactory factoryLoader = new DelegatingDataSourceFactory();
         injector.injectMembers(factoryLoader);
@@ -74,36 +82,20 @@ public class DefaultDataSourceFactoryLoa
         nodeDescriptor.setName("node1");
         nodeDescriptor.setDataSourceFactoryType(MockDataSourceFactory1.class.getName());
 
-        Module testModule = new Module() {
-
-            public void configure(Binder binder) {
-                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
-                binder.bind(ResourceLocator.class).to(MockResourceLocator.class);
-                binder.bind(RuntimeProperties.class).toInstance(
-                        mock(RuntimeProperties.class));
-                binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
-            }
-        };
-
-        Injector injector = DIBootstrap.createInjector(testModule);
-
         DelegatingDataSourceFactory factoryLoader = new DelegatingDataSourceFactory();
         injector.injectMembers(factoryLoader);
 
         DataSourceFactory factory = factoryLoader.getDataSourceFactory(nodeDescriptor);
         assertNotNull(factory);
         assertTrue(factory instanceof MockDataSourceFactory1);
-        assertSame(
-                "Injection on the factory hasn't been performed",
-                injector,
+        assertSame("Injection on the factory hasn't been performed", injector,
                 ((MockDataSourceFactory1) factory).getInjector());
     }
 
     public void testGetDataSourceFactory_Property() throws Exception {
 
         final RuntimeProperties properties = mock(RuntimeProperties.class);
-        when(properties.get(Constants.JDBC_DRIVER_PROPERTY)).thenReturn(
-                "x");
+        when(properties.get(Constants.JDBC_DRIVER_PROPERTY)).thenReturn("x");
         when(properties.get(Constants.JDBC_URL_PROPERTY)).thenReturn("y");
 
         DataChannelDescriptor channelDescriptor = new DataChannelDescriptor();
@@ -116,6 +108,7 @@ public class DefaultDataSourceFactoryLoa
         Module testModule = new Module() {
 
             public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(ResourceLocator.class).to(MockResourceLocator.class);
                 binder.bind(RuntimeProperties.class).toInstance(properties);
@@ -132,20 +125,17 @@ public class DefaultDataSourceFactoryLoa
         assertNotNull(factory);
         assertTrue(factory instanceof PropertyDataSourceFactory);
 
-        when(properties.get(Constants.JDBC_URL_PROPERTY))
-                .thenReturn(null);
+        when(properties.get(Constants.JDBC_URL_PROPERTY)).thenReturn(null);
         factory = factoryLoader.getDataSourceFactory(nodeDescriptor);
         assertNotNull(factory);
         assertFalse(factory instanceof PropertyDataSourceFactory);
 
-        when(properties.get(Constants.JDBC_URL_PROPERTY + ".X.node2"))
-                .thenReturn("y");
+        when(properties.get(Constants.JDBC_URL_PROPERTY + ".X.node2")).thenReturn("y");
         factory = factoryLoader.getDataSourceFactory(nodeDescriptor);
         assertNotNull(factory);
         assertFalse(factory instanceof PropertyDataSourceFactory);
 
-        when(properties.get(Constants.JDBC_URL_PROPERTY + ".X.node1"))
-                .thenReturn("y");
+        when(properties.get(Constants.JDBC_URL_PROPERTY + ".X.node1")).thenReturn("y");
         factory = factoryLoader.getDataSourceFactory(nodeDescriptor);
         assertNotNull(factory);
         assertTrue(factory instanceof PropertyDataSourceFactory);

Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java?rev=1545007&r1=1545006&r2=1545007&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDbAdapterFactoryTest.java Sun Nov 24 16:05:53 2013
@@ -39,10 +39,12 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.sybase.SybaseAdapter;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.log.CommonsJdbcEventLogger;
 import org.apache.cayenne.log.JdbcEventLogger;
 import org.apache.cayenne.map.DbEntity;
@@ -78,6 +80,7 @@ public class DefaultDbAdapterFactoryTest
                 binder.bindMap(Constants.PROPERTIES_MAP);
 
                 binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
             }
@@ -106,6 +109,7 @@ public class DefaultDbAdapterFactoryTest
                 binder.bindList(Constants.SERVER_TYPE_FACTORIES_LIST);
 
                 binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(ResourceLocator.class).to(ClassLoaderResourceLocator.class);
                 binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
@@ -140,6 +144,7 @@ public class DefaultDbAdapterFactoryTest
                 binder.bindList(Constants.SERVER_TYPE_FACTORIES_LIST);
 
                 binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(ResourceLocator.class).to(ClassLoaderResourceLocator.class);
                 binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
@@ -180,6 +185,7 @@ public class DefaultDbAdapterFactoryTest
             public void configure(Binder binder) {
                 binder.bindMap(Constants.PROPERTIES_MAP);
 
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
                 binder.bind(JdbcEventLogger.class).to(CommonsJdbcEventLogger.class);
                 binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
                 binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);