Author: awhite
Date: Thu Jan 29 22:27:00 2009
New Revision: 739054

URL: http://svn.apache.org/viewvc?rev=739054&view=rev
Log:
Use both envLoader and application loader for class loading when parsing
XML metadata files.  envLoader first to appease Spring integ.


Modified:
    
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java

Modified: 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java?rev=739054&r1=739053&r2=739054&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java
 Thu Jan 29 22:27:00 2009
@@ -48,6 +48,7 @@
 import org.apache.openjpa.lib.meta.MetaDataParser;
 import org.apache.openjpa.lib.util.J2DoPrivHelper;
 import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.lib.util.MultiClassLoader;
 import org.apache.openjpa.lib.util.Options;
 import org.apache.openjpa.meta.AbstractCFMetaDataFactory;
 import org.apache.openjpa.meta.ClassMetaData;
@@ -237,10 +238,24 @@
      * Parse the given XML resource.
      */
     private void parseXML(URL xml, Class cls, int mode, ClassLoader envLoader) 
{
+        // spring needs to use the envLoader first for all class resolution,
+        // but we must still fall back on application loader
         ClassLoader loader = repos.getConfiguration().
-            getClassResolverInstance().getClassLoader(cls, envLoader);
+            getClassResolverInstance().getClassLoader(cls, null);
+        if (envLoader != null && envLoader != loader) {
+          MultiClassLoader mult = new MultiClassLoader();
+          mult.addClassLoader(envLoader);
+
+          // loader from resolver is usually a multi loader itself
+          if (loader instanceof MultiClassLoader)
+            mult.addClassLoaders((MultiClassLoader)loader);
+          else
+            mult.addClassLoader(loader);
+          loader = mult;
+        }
+    
         XMLPersistenceMetaDataParser xmlParser = getXMLParser();
-        xmlParser.setClassLoader(envLoader != null ? envLoader : loader);
+        xmlParser.setClassLoader(loader);
         xmlParser.setEnvClassLoader(envLoader);
         xmlParser.setMode(mode);
         try {


Reply via email to