You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2011/11/05 18:17:33 UTC

svn commit: r1197994 [4/10] - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/ant/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/...

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java Sat Nov  5 17:17:26 2011
@@ -43,15 +43,16 @@ import serp.bytecode.lowlevel.ConstantPo
 public class PCClassFileTransformer
     implements ClassFileTransformer {
 
-    private static final Localizer _loc = Localizer.forPackage(PCClassFileTransformer.class);
+    private static final Localizer _loc = Localizer.forPackage
+        (PCClassFileTransformer.class);
 
     private final MetaDataRepository _repos;
     private final PCEnhancer.Flags _flags;
     private final ClassLoader _tmpLoader;
     private final Log _log;
-    private final Set<String> _names;
+    private final Set _names;
     private boolean _transforming = false;
-    private static final String PERSISTENCE_CAPABLE = "org/apache/openjpa/enhance/PersistenceCapable";
+
     /**
      * Constructor.
      *
@@ -93,20 +94,17 @@ public class PCClassFileTransformer
         _repos = repos;
         _tmpLoader = tmpLoader;
 
-        _log = repos.getConfiguration().getLog(OpenJPAConfiguration.LOG_ENHANCE);
+        _log = repos.getConfiguration().
+            getLog(OpenJPAConfiguration.LOG_ENHANCE);
         _flags = flags;
-        repos.getConfiguration().addClassLoader(tmpLoader);
-        _names = repos.getPersistentTypeNames(devscan);
+
+        _names = repos.getPersistentTypeNames(devscan, tmpLoader);
         if (_names == null && _log.isInfoEnabled())
             _log.info(_loc.get("runtime-enhance-pcclasses"));
     }
 
-    /**
-     * The hook to transform byte code as they are loaded in Java Virtual Machine.
-     * 
-     */
     public byte[] transform(ClassLoader loader, String className,
-        Class<?> redef, ProtectionDomain domain, byte[] bytes)
+        Class redef, ProtectionDomain domain, byte[] bytes)
         throws IllegalClassFormatException {
         if (loader == _tmpLoader)
             return null;
@@ -131,27 +129,29 @@ public class PCClassFileTransformer
      * ClassCircularityError when executing method using pure-JIT JVMs
      * such as JRockit.
      */
-    private byte[] transform0(String className, Class<?> redef, byte[] bytes)
+    private byte[] transform0(String className, Class redef, byte[] bytes)
         throws IllegalClassFormatException {
         
+        byte[] returnBytes = null;
         try {
             Boolean enhance = needsEnhance(className, redef, bytes);
-            if (enhance != null && _log.isTraceEnabled()) {
-                _log.trace(_loc.get("needs-runtime-enhance", className,  enhance));
-            } 
-            if (enhance != Boolean.TRUE) {
+            if (enhance != null && _log.isTraceEnabled())
+                _log.trace(_loc.get("needs-runtime-enhance", className,
+                    enhance));
+            if (enhance != Boolean.TRUE)
                 return null;
-            }
 
             PCEnhancer enhancer = new PCEnhancer(_repos.getConfiguration(),
-                new Project().loadClass(new ByteArrayInputStream(bytes),  _tmpLoader), _repos);
+                new Project().loadClass(new ByteArrayInputStream(bytes),
+                    _tmpLoader), _repos);
             enhancer.setAddDefaultConstructor(_flags.addDefaultConstructor);
-            enhancer.setEnforcePropertyRestrictions(_flags.enforcePropertyRestrictions);
+            enhancer.setEnforcePropertyRestrictions
+                (_flags.enforcePropertyRestrictions);
 
-            if (enhancer.run() == PCEnhancer.ENHANCE_NONE) {
+            if (enhancer.run() == PCEnhancer.ENHANCE_NONE)
                 return null;
-            }
-            return enhancer.getPCBytecode().toByteArray();
+            returnBytes = enhancer.getPCBytecode().toByteArray();
+            return returnBytes;
         } catch (Throwable t) {
             _log.warn(_loc.get("cft-exception-thrown", className), t);
             if (t instanceof RuntimeException)
@@ -161,38 +161,40 @@ public class PCClassFileTransformer
             throw new GeneralException(t);
         } finally {
             _transforming = false;
+            if (returnBytes != null && _log.isTraceEnabled())
+                _log.trace(_loc.get("runtime-enhance-complete", className,
+                    bytes.length, returnBytes.length));
         }
     }
 
     /**
      * Return whether the given class needs enhancement.
      */
-    private Boolean needsEnhance(String clsName, Class<?> redef, byte[] bytes) {
+    private Boolean needsEnhance(String clsName, Class redef, byte[] bytes) {
         if (redef != null) {
-            Class<?>[] intfs = redef.getInterfaces();
-            for (int i = 0; i < intfs.length; i++) {
-                if (PersistenceCapable.class.getName().equals(intfs[i].getName())) {
-                    return !isEnhanced(bytes);
-                }
-            }
+            Class[] intfs = redef.getInterfaces();
+            for (int i = 0; i < intfs.length; i++)
+                if (PersistenceCapable.class.getName().
+                    equals(intfs[i].getName()))
+                    return Boolean.valueOf(!isEnhanced(bytes));
             return null;
         }
 
         if (_names != null) {
             if (_names.contains(clsName.replace('/', '.')))
-                return !isEnhanced(bytes);
+                return Boolean.valueOf(!isEnhanced(bytes));
             return null;
         }
 
-        if (clsName.startsWith("java/") || clsName.startsWith("javax/")) {
+        if (clsName.startsWith("java/") || clsName.startsWith("javax/"))
             return null;
-        }
         if (isEnhanced(bytes))
             return Boolean.FALSE;
 
         try {
-            Class<?> c = Class.forName(clsName.replace('/', '.'), false,  _tmpLoader);
-            if (_repos.getMetaData(c, false) != null)
+            Class c = Class.forName(clsName.replace('/', '.'), false,
+                _tmpLoader);
+            if (_repos.getMetaData(c, null, false) != null)
                 return Boolean.TRUE;
             return null;
         } catch (ClassNotFoundException cnfe) {
@@ -227,7 +229,7 @@ public class PCClassFileTransformer
             clsEntry = table.readUnsignedShort(idx);
             utfEntry = table.readUnsignedShort(table.get(clsEntry));
             name = table.readString(table.get(utfEntry));
-            if (PERSISTENCE_CAPABLE.equals(name))
+            if ("org/apache/openjpa/enhance/PersistenceCapable".equals(name))
                 return true;
         }
         return false;

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Sat Nov  5 17:17:26 2011
@@ -249,14 +249,18 @@ public class PCEnhancer { 
      * @deprecated use {@link #PCEnhancer(OpenJPAConfiguration, BCClass,
         MetaDataRepository, ClassLoader)} instead. 
      */
+    public PCEnhancer(OpenJPAConfiguration conf, BCClass type,
+        MetaDataRepository repos) {
+        this(conf, type, repos, null);
+    }
 
     /**
      * Constructor. Supply configuration.
      *
-     * @param type the bytecode representation for the type to
+     * @param type the bytecode representation fo the type to
      * enhance; this can be created from any stream or file
      * @param repos a metadata repository to use for metadata access,
-     * or null to create a new repository; the repository
+     * or null to create a new reporitory; the repository
      * from the given configuration isn't used by default
      * because the configuration might be an
      * implementation-specific subclass whose metadata
@@ -264,7 +268,8 @@ public class PCEnhancer { 
      * @param loader the environment classloader to use for loading
      * classes and resources.
      */
-    public PCEnhancer(OpenJPAConfiguration conf, BCClass type, MetaDataRepository repos) {
+    public PCEnhancer(OpenJPAConfiguration conf, BCClass type,
+        MetaDataRepository repos, ClassLoader loader) {
         _managedType = type;
         _pc = type;
 
@@ -273,10 +278,9 @@ public class PCEnhancer { 
         if (repos == null) {
             _repos = conf.newMetaDataRepositoryInstance();
             _repos.setSourceMode(MetaDataRepository.MODE_META);
-        } else {
+        } else
             _repos = repos;
-        }
-        _meta = _repos.getMetaData(type.getType(), false);
+        _meta = _repos.getMetaData(type.getType(), loader, false);
     }
 
     /**
@@ -1128,7 +1132,7 @@ public class PCEnhancer { 
         if (_meta != null && _meta.getDescribedType().isInterface())
             return _meta;
 
-        return _repos.getMetaData(f.getDeclaringClass(), false);
+        return _repos.getMetaData(f.getDeclaringClass(), null, false);
     }
 
     /**
@@ -4682,18 +4686,22 @@ public class PCEnhancer { 
             PCEnhancer.class.getName() + "#bytecodeWriter");
 
         Configurations.populateConfiguration(conf, opts);
-        return run(conf, args, flags, null, writer);
+        return run(conf, args, flags, null, writer, null);
     }
 
     /**
      * Enhance the given classes.
      */
     public static boolean run(OpenJPAConfiguration conf, String[] args,
-        Flags flags, MetaDataRepository repos, BytecodeWriter writer)
+        Flags flags, MetaDataRepository repos, BytecodeWriter writer,
+        ClassLoader loader)
         throws IOException {
-        ClassLoader loader = conf.getClassLoader();
-//        if (flags.tmpClassLoader)
-//            loader = AccessController.doPrivileged(J2DoPrivHelper.newTemporaryClassLoaderAction(loader));
+        if (loader == null)
+            loader = conf.getClassResolverInstance().
+                getClassLoader(PCEnhancer.class, null);
+        if (flags.tmpClassLoader)
+            loader = AccessController.doPrivileged(J2DoPrivHelper
+                .newTemporaryClassLoaderAction(loader));
 
         if (repos == null) {
             repos = conf.newMetaDataRepositoryInstance();
@@ -4704,7 +4712,7 @@ public class PCEnhancer { 
         Collection classes;
         if (args == null || args.length == 0) {
             log.info(_loc.get("running-all-classes"));
-            classes = repos.getPersistentTypeNames(true);
+            classes = repos.getPersistentTypeNames(true, loader);
             if (classes == null) {
             	log.warn(_loc.get("no-class-to-enhance"));
             	return false;
@@ -4714,9 +4722,8 @@ public class PCEnhancer { 
                 getMetaDataFactory().newClassArgParser();
             cap.setClassLoader(loader);
             classes = new HashSet();
-            for (int i = 0; i < args.length; i++) {
+            for (int i = 0; i < args.length; i++)
                 classes.addAll(Arrays.asList(cap.parseTypes(args[i])));
-            }
         }
 
         Project project = new Project();
@@ -4732,7 +4739,7 @@ public class PCEnhancer { 
                 bc = project.loadClass((String) o, loader);
             else
                 bc = project.loadClass((Class) o);
-            enhancer = new PCEnhancer(conf, bc, repos);
+            enhancer = new PCEnhancer(conf, bc, repos, loader);
             if (writer != null)
                 enhancer.setBytecodeWriter(writer);
             enhancer.setDirectory(flags.directory);

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java Sat Nov  5 17:17:26 2011
@@ -74,38 +74,38 @@ public class PCEnhancerAgent {
     private static boolean disableDynamicAgent = false;
 
     /**
-     * Affirms if the Agent has ran successfully. 
+     * @return True if the Agent has ran successfully. False otherwise.
      */
     public static synchronized boolean getLoadSuccessful() {
         return loadSuccessful;
     }
     /**
-     * disables dynamic agent. 
+     * @return True if the dynamic agent was disabled via configuration. 
      */
     public static void disableDynamicAgent(){
-        disableDynamicAgent = true;
+        disableDynamicAgent=true;
     }
     
     /**
-     * @param configuration
+     * @param log
      * @return True if the agent is loaded successfully
      */
-    public static synchronized boolean loadDynamicAgent(OpenJPAConfiguration conf) {
-        if (loadAttempted || disableDynamicAgent) {
-        	return false;
+    public static synchronized boolean loadDynamicAgent(Log log) {
+        if (loadAttempted == false && disableDynamicAgent == false) {
+            Instrumentation inst =
+                InstrumentationFactory.getInstrumentation(log);
+            if (inst != null) {
+                premain("", inst);
+                return true;
+            } 
+            // If we successfully get the Instrumentation, we will call premain
+            // where loadAttempted will be set to true. This case is the path 
+            // where we were unable to get Instrumentation so we need to set the
+            // loadAttempted flag to true. We do this so we will only run
+            // through this code one time.
+            loadAttempted = true;
         }
-        
-        Instrumentation inst = InstrumentationFactory.getInstrumentation(conf);
-        if (inst != null) {
-            premain("", inst);
-            return true;
-        } 
-        // If we successfully get the Instrumentation, we will call premain
-        // where loadAttempted will be set to true. This case is the path 
-        // where we were unable to get Instrumentation so we need to set the
-        // loadAttempted flag to true. We do this so we will only run
-        // through this code one time.
-        loadAttempted = true;
+
         return false;
     }
 
@@ -116,7 +116,7 @@ public class PCEnhancerAgent {
         // The agent will be disabled when running in an application
         // server.
         synchronized (PCEnhancerAgent.class) {
-            if (loadAttempted) {
+            if (loadAttempted == true) {
                 return;
             }
             // See the comment in loadDynamicAgent as to why we set this to true
@@ -128,11 +128,15 @@ public class PCEnhancerAgent {
 
         if (opts.containsKey("ClassLoadEnhancement") ||
             opts.containsKey("classLoadEnhancement")) {
-            if (opts.getBooleanProperty("ClassLoadEnhancement", "classLoadEnhancement", true))
+            if (opts.getBooleanProperty(
+                "ClassLoadEnhancement", "classLoadEnhancement", true))
                 registerClassLoadEnhancer(inst, opts);
-        } else if (opts.containsKey("RuntimeEnhancement") || opts.containsKey("runtimeEnhancement")) {
+        }
+        else if (opts.containsKey("RuntimeEnhancement") ||
+            opts.containsKey("runtimeEnhancement")) {
             // Deprecated property setting
-            if (opts.getBooleanProperty("RuntimeEnhancement", "runtimeEnhancement", true))
+            if (opts.getBooleanProperty(
+                "RuntimeEnhancement", "runtimeEnhancement", true))
                 registerClassLoadEnhancer(inst, opts);
         } else {
             // if neither is set, then we should be turning it on. We need this
@@ -141,7 +145,8 @@ public class PCEnhancerAgent {
             registerClassLoadEnhancer(inst, opts);
         }
 
-        if (opts.getBooleanProperty("RuntimeRedefinition", "runtimeRedefinition", true)) {
+        if (opts.getBooleanProperty(
+            "RuntimeRedefinition", "runtimeRedefinition", true)) {
             InstrumentationFactory.setInstrumentation(inst);
         } else {
             InstrumentationFactory.setDynamicallyInstallAgent(false);
@@ -149,8 +154,10 @@ public class PCEnhancerAgent {
         loadSuccessful = true;
     }
 
-    private static void registerClassLoadEnhancer(Instrumentation inst,  Options opts) {
-    	List<String> anchors = Configurations.getFullyQualifiedAnchorsInPropertiesLocation(opts);
+    private static void registerClassLoadEnhancer(Instrumentation inst,
+        Options opts) {
+    	List<String> anchors = Configurations.
+            getFullyQualifiedAnchorsInPropertiesLocation(opts);
     	for (String a : anchors) {
     		Options clonedOptions = (Options) opts.clone();
     		clonedOptions.setProperty("properties", a);
@@ -168,7 +175,12 @@ public class PCEnhancerAgent {
     		    .newTemporaryClassLoaderAction(AccessController
     		    .doPrivileged(J2DoPrivHelper.getContextClassLoaderAction())
     		    ));
-    		conf.addClassLoader(tmpLoader);
+    		conf.setClassResolver(new ClassResolver() {
+    		    public ClassLoader getClassLoader(Class context,
+                    ClassLoader env) {
+    		        return tmpLoader;
+    		    }
+    		});
     		conf.setReadOnly(Configuration.INIT_STATE_FREEZING);
     		conf.instantiateAll(); // avoid threading issues
 

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ReflectingPersistenceCapable.java Sat Nov  5 17:17:26 2011
@@ -64,7 +64,7 @@ public class ReflectingPersistenceCapabl
         Class type = o.getClass();
         pcSubclassInstance = PCRegistry.newInstance(type, null, false);
         meta = conf.getMetaDataRepositoryInstance()
-            .getMetaData(type, true);
+            .getMetaData(type, null, true);
     }
 
     public int pcGetEnhancementContractVersion() {

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/instrumentation/InstrumentationManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/instrumentation/InstrumentationManager.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/instrumentation/InstrumentationManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/instrumentation/InstrumentationManager.java Sat Nov  5 17:17:26 2011
@@ -38,7 +38,7 @@ public interface InstrumentationManager 
      * @param conf the configuration to use for initialization
      * @param providers one or more providers as supplied via plugin list value
      */
-    public void initialize(OpenJPAConfiguration conf, PluginListValue<InstrumentationProvider> providers);
+    public void initialize(OpenJPAConfiguration conf, PluginListValue providers);
 
     /**
      * Manage a given provider.  This will plug the instruments managed by the 

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/instrumentation/InstrumentationManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/instrumentation/InstrumentationManagerImpl.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/instrumentation/InstrumentationManagerImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/instrumentation/InstrumentationManagerImpl.java Sat Nov  5 17:17:26 2011
@@ -43,8 +43,9 @@ public class InstrumentationManagerImpl 
      * @param conf
      * @param providers
      */
-    public void initialize(OpenJPAConfiguration conf, PluginListValue<InstrumentationProvider> pluginVal) {
-        InstrumentationProvider[] providers = pluginVal.instantiate(conf);
+    public void initialize(OpenJPAConfiguration conf, PluginListValue pluginVal) {
+        InstrumentationProvider[] providers = 
+            (InstrumentationProvider[])pluginVal.instantiate(InstrumentationProvider.class, conf);
         _providers.addAll(Arrays.asList(providers));
     }
     

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java Sat Nov  5 17:17:26 2011
@@ -19,6 +19,7 @@
 package org.apache.openjpa.kernel;
 
 import java.io.ObjectStreamException;
+import java.security.AccessController;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -39,6 +40,7 @@ import javax.transaction.TransactionMana
 
 import org.apache.commons.collections.set.MapBackedSet;
 import org.apache.commons.lang.StringUtils;
+import org.apache.openjpa.kernel.AuditManager;
 import org.apache.openjpa.audit.Auditor;
 import org.apache.openjpa.conf.BrokerValue;
 import org.apache.openjpa.conf.OpenJPAConfiguration;
@@ -103,7 +105,7 @@ public abstract class AbstractBrokerFact
     // cache the class names loaded from the persistent classes property so
     // that we can re-load them for each new broker
     private transient Collection<String> _pcClassNames = null;
-//    private transient Collection<ClassLoader> _pcClassLoaders = null;
+    private transient Collection<ClassLoader> _pcClassLoaders = null;
     private transient boolean _persistentTypesLoaded = false;
 
     // lifecycle listeners to pass to each broker
@@ -153,6 +155,7 @@ public abstract class AbstractBrokerFact
     protected AbstractBrokerFactory(OpenJPAConfiguration config) {
         _conf = config;
         _brokers = newBrokerSet();
+        getPcClassLoaders();
     }
 
     /**
@@ -232,7 +235,7 @@ public abstract class AbstractBrokerFact
         if (remote.areRemoteEventsEnabled())
             broker.addTransactionListener(remote);
 
-       loadPersistentTypes();
+       loadPersistentTypes(broker.getClassLoader());
         _brokers.add(broker);
         _conf.setReadOnly(Configuration.INIT_STATE_FROZEN);
     }
@@ -259,7 +262,7 @@ public abstract class AbstractBrokerFact
      * Load the configured persistent classes list. Performed automatically
      * whenever a broker is created.
      */
-    public void loadPersistentTypes() {
+    public void loadPersistentTypes(ClassLoader envLoader) {
         // if we've loaded the persistent types and the class name list
         // is empty, then we can simply return. Note that there is a
         // potential threading scenario in which _persistentTypesLoaded is
@@ -272,11 +275,12 @@ public abstract class AbstractBrokerFact
             return;
 
         // cache persistent type names if not already
-        ClassLoader loader = _conf.getClassLoader();
+        ClassLoader loader = _conf.getClassResolverInstance().
+            getClassLoader(getClass(), envLoader);
         Collection<Class<?>> toRedefine = new ArrayList<Class<?>>();
         if (!_persistentTypesLoaded) {
             Collection<Class<?>> clss = _conf.getMetaDataRepositoryInstance().
-                loadPersistentTypes(false, _conf.isInitializeEagerly());
+                loadPersistentTypes(false, loader, _conf.isInitializeEagerly());
             if (clss.isEmpty())
                 _pcClassNames = Collections.emptyList();
             else {
@@ -287,27 +291,27 @@ public abstract class AbstractBrokerFact
                     if (needsSub(cls))
                         toRedefine.add(cls);
                 }
-//                getPcClassLoaders().add(loader);
+                getPcClassLoaders().add(loader);
                 _pcClassNames = c;
             }
             _persistentTypesLoaded = true;
         } else {
             // reload with this loader
-//            if (getPcClassLoaders().add(loader)) {
-//                for (String clsName : _pcClassNames) {
-//                    try {
-//                        Class<?> cls = Class.forName(clsName, true, loader);
-//                        if (needsSub(cls))
-//                            toRedefine.add(cls);
-//                    } catch (Throwable t) {
-//                        _conf.getLog(OpenJPAConfiguration.LOG_RUNTIME).warn(null, t);
-//                    }
-//                }
-//            }
+            if (getPcClassLoaders().add(loader)) {
+                for (String clsName : _pcClassNames) {
+                    try {
+                        Class<?> cls = Class.forName(clsName, true, loader);
+                        if (needsSub(cls))
+                            toRedefine.add(cls);
+                    } catch (Throwable t) {
+                        _conf.getLog(OpenJPAConfiguration.LOG_RUNTIME).warn(null, t);
+                    }
+                }
+            }
         }
 
         // get the ManagedClassSubclasser into the loop
-        ManagedClassSubclasser.prepareUnenhancedClasses(_conf, toRedefine);
+        ManagedClassSubclasser.prepareUnenhancedClasses(_conf, toRedefine, envLoader);
     }
 
     private boolean needsSub(Class<?> cls) {
@@ -809,12 +813,12 @@ public abstract class AbstractBrokerFact
     /**
      * Method insures that deserialized EMF has this reference re-instantiated
      */
-//    private Collection<ClassLoader> getPcClassLoaders() {
-//       if (_pcClassLoaders == null)
-//         _pcClassLoaders = new ConcurrentReferenceHashSet<ClassLoader>(ConcurrentReferenceHashSet.WEAK);
-//          
-//       return _pcClassLoaders;
-//    }
+    private Collection<ClassLoader> getPcClassLoaders() {
+       if (_pcClassLoaders == null)
+         _pcClassLoaders = new ConcurrentReferenceHashSet<ClassLoader>(ConcurrentReferenceHashSet.WEAK);
+          
+       return _pcClassLoaders;
+    }
 
     /**
      * <P>
@@ -857,13 +861,14 @@ public abstract class AbstractBrokerFact
         }
         // Don't catch any exceptions here because we want to fail-fast if something bad happens when we're preloading.
         Options o = Configurations.parseProperties(Configurations.getProperties(_conf.getMetaDataRepository()));
-        if (MetaDataRepository.needsPreload(o)) {
+        if (MetaDataRepository.needsPreload(o) == true) {
             MetaDataRepository mdr = _conf.getMetaDataRepositoryInstance();
             mdr.setValidate(MetaDataRepository.VALIDATE_RUNTIME, true);
             mdr.setResolve(MetaDataRepository.MODE_MAPPING_INIT, true);
 
             // Load persistent classes and hook in subclasser
-            loadPersistentTypes();
+            loadPersistentTypes((ClassLoader) AccessController.doPrivileged(J2DoPrivHelper
+                .getContextClassLoaderAction()));
             mdr.preload();
         }
 

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractPCResultObjectProvider.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractPCResultObjectProvider.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractPCResultObjectProvider.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractPCResultObjectProvider.java Sat Nov  5 17:17:26 2011
@@ -62,10 +62,13 @@ public abstract class AbstractPCResultOb
         load(sm, fetch);
     }
 
-    public Object getResultObject() throws Exception {
-        Class<?> type = getPCType();
-        MetaDataRepository repos = ctx.getConfiguration().getMetaDataRepositoryInstance();
-        ClassMetaData meta = repos.getMetaData(type, true);
+    public Object getResultObject()
+        throws Exception {
+        Class type = getPCType();
+        MetaDataRepository repos = ctx.getConfiguration().
+            getMetaDataRepositoryInstance();
+        ClassMetaData meta = repos.getMetaData
+            (type, ctx.getClassLoader(), true);
 
         Object oid = getObjectId(meta);
         Object res = ctx.find(oid, null, null, this, 0);
@@ -78,25 +81,30 @@ public abstract class AbstractPCResultOb
      * Implement this method to extract the object id value from the
      * current record of the input.
      */
-    protected abstract Object getObjectId(ClassMetaData meta) throws Exception;
+    protected abstract Object getObjectId(ClassMetaData meta)
+        throws Exception;
 
     /**
      * Implement this method to extract the type of the pc stored
      * in the current record of the input.
      */
-    protected abstract Class<?> getPCType() throws Exception;
+    protected abstract Class getPCType()
+        throws Exception;
 
     /**
      * Load data from the current input record into the given state
      * manager. Remember to call {@link OpenJPAStateManager#setVersion} to set
      * the optimistic versioning information, if it has any.
      */
-    protected abstract void load(OpenJPAStateManager sm, FetchConfiguration fetch) throws Exception;
+    protected abstract void load(OpenJPAStateManager sm, 
+        FetchConfiguration fetch)
+        throws Exception;
 
     /**
      * Override if desired. Does nothing by default.
      */
-    public void open() throws Exception {
+    public void open()
+        throws Exception {
     }
 
     /**
@@ -113,14 +121,16 @@ public abstract class AbstractPCResultOb
      *
      * @see ResultObjectProvider#next
      */
-    public abstract boolean next() throws Exception;
+    public abstract boolean next()
+        throws Exception;
 
     /**
      * Override if desired. Throws an exception by default.
      *
      * @see ResultObjectProvider#absolute
      */
-    public boolean absolute(int pos) throws Exception {
+    public boolean absolute(int pos)
+        throws Exception {
         throw new UnsupportedOperationException();
     }
 
@@ -129,7 +139,8 @@ public abstract class AbstractPCResultOb
      *
      * @see ResultObjectProvider#size
      */
-    public int size() throws Exception {
+    public int size()
+        throws Exception {
         return Integer.MAX_VALUE;
     }
 
@@ -138,7 +149,8 @@ public abstract class AbstractPCResultOb
      *
      * @see ResultObjectProvider#reset
      */
-    public void reset() throws Exception {
+    public void reset()
+        throws Exception {
         throw new UnsupportedOperationException();
     }
 
@@ -147,7 +159,8 @@ public abstract class AbstractPCResultOb
      *
      * @see ResultObjectProvider#close
      */
-    public void close() throws Exception {
+    public void close()
+        throws Exception {
     }
 
     /**

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java Sat Nov  5 17:17:26 2011
@@ -247,7 +247,8 @@ public class AttachManager {
         //### need to handle ACT_RUN without also ACT_CASCADE
         ClassMetaData meta = _broker.getConfiguration().
             getMetaDataRepositoryInstance().getMetaData(
-                ImplHelper.getManagedInstance(toAttach).getClass(), true);
+                ImplHelper.getManagedInstance(toAttach).getClass(),
+                _broker.getClassLoader(), true);
         return getStrategy(toAttach).attach(this, toAttach, meta, into,
             owner, ownerMeta, explicit);
     }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Bootstrap.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Bootstrap.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Bootstrap.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Bootstrap.java Sat Nov  5 17:17:26 2011
@@ -39,7 +39,11 @@ import org.apache.openjpa.util.UserExcep
  */
 public class Bootstrap {
 
-    private static final Class<?>[] CONFIGURATION_ARG = { ConfigurationProvider.class };
+    private static final Class<?>[] CONFIGURATION_ARG =
+        new Class<?>[]{ ConfigurationProvider.class };
+    
+    private static final Class<?>[] CONFIGURATION_CLASSLOADER_ARGS =
+        new Class<?>[] { ConfigurationProvider.class, ClassLoader.class };
 
     private static Localizer s_loc = Localizer.forPackage(Bootstrap.class);
 
@@ -47,24 +51,30 @@ public class Bootstrap {
      * Return a new factory for the default configuration.
      */
     public static BrokerFactory newBrokerFactory() {
-        return Bootstrap.newBrokerFactory(null);
+        return Bootstrap.newBrokerFactory(null, null);
     }
 
     /**
-     * Return a new factory for the given configuration. 
+     * Return a new factory for the given configuration. The classloader
+     * will be used to load the factory class. If no classloader is given,
+     * the thread's context classloader is used.
      */
-    public static BrokerFactory newBrokerFactory(ConfigurationProvider conf) {
+    public static BrokerFactory newBrokerFactory(ConfigurationProvider conf,
+        ClassLoader loader) {
         try {
-            BrokerFactory factory = invokeFactory(conf, "newInstance", CONFIGURATION_ARG, new Object[] { conf });
+            BrokerFactory factory =
+                invokeFactory(conf, loader, "newInstance", CONFIGURATION_ARG, new Object[] { conf });
             factory.postCreationCallback();
             return factory;
         } catch (InvocationTargetException ite) {
             Throwable cause = ite.getTargetException();
             if (cause instanceof OpenJPAException)
                 throw (OpenJPAException) cause;
-            throw new InternalException(s_loc.get("new-brokerfactory-excep", getFactoryClassName(conf), cause));
+            throw new InternalException(s_loc.get("new-brokerfactory-excep",
+                getFactoryClassName(conf, loader)), cause);
         } catch (Exception e) {
-            throw new UserException(s_loc.get("bad-new-brokerfactory", getFactoryClassName(conf)), e).setFatal(true);
+            throw new UserException(s_loc.get("bad-new-brokerfactory",
+                getFactoryClassName(conf, loader)), e).setFatal(true);
         }
     }
 
@@ -72,41 +82,59 @@ public class Bootstrap {
      * Return a pooled factory for the default configuration.
      */
     public static BrokerFactory getBrokerFactory() {
-        return Bootstrap.getBrokerFactory(null);
+        return Bootstrap.getBrokerFactory(null, null);
     }
 
     /**
-     * Return a pooled factory for the given configuration. 
+     * Return a pooled factory for the given configuration. The classloader
+     * will be used to load the factory class. If no classloader is given,
+     * the thread's context classloader is used.
      */
-    public static BrokerFactory getBrokerFactory(ConfigurationProvider conf) {
+    public static BrokerFactory getBrokerFactory(ConfigurationProvider conf,
+        ClassLoader loader) {
         try {
-            return invokeFactory(conf, "getInstance", CONFIGURATION_ARG, new Object[] { conf});
+            return invokeFactory(conf, loader, "getInstance", CONFIGURATION_CLASSLOADER_ARGS, new Object[] { conf,
+                loader });
         } catch (InvocationTargetException ite) {
             Throwable cause = ite.getTargetException();
             if (cause instanceof OpenJPAException)
                 throw (OpenJPAException) cause;
-            throw new InternalException(s_loc.get("brokerfactory-excep", getFactoryClassName(conf)), cause);
+            throw new InternalException(s_loc.get("brokerfactory-excep",
+                getFactoryClassName(conf, loader)), cause);
         } catch (Exception e) {
-            throw new UserException(s_loc.get("bad-brokerfactory", getFactoryClassName(conf)), e).setFatal(true);
+            throw new UserException(s_loc.get("bad-brokerfactory",
+                getFactoryClassName(conf, loader)), e).setFatal(true);
         }
     }
 
-    private static BrokerFactory invokeFactory(ConfigurationProvider conf, String methodName, 
-    		Class<?>[] argTypes, Object[] args)
-        throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
+    private static BrokerFactory invokeFactory(ConfigurationProvider conf,
+        ClassLoader loader, String methodName, Class<?>[] argTypes, Object[] args)
+        throws InvocationTargetException, NoSuchMethodException,
+            IllegalAccessException {
         if (conf == null)
             conf = new MapConfigurationProvider();
         ProductDerivations.beforeConfigurationConstruct(conf);
 
-        Class<?> cls = getFactoryClass(conf);
-        Method meth = cls.getMethod(methodName, argTypes); 
+        Class cls = getFactoryClass(conf, loader);
+        Method meth;
+        try {
+            meth = cls.getMethod(methodName, argTypes); 
+        } catch (NoSuchMethodException nsme) {
+            // handle cases where there is a mismatch between loaders by falling
+            // back to the configuration's class loader for broker resolution
+            cls = getFactoryClass(conf,
+                AccessController.doPrivileged(
+                    J2DoPrivHelper.getClassLoaderAction(conf.getClass()))); 
+            meth = cls.getMethod(methodName, argTypes); 
+        }
 
         return (BrokerFactory) meth.invoke(null, args);
     }
 
-    private static String getFactoryClassName(ConfigurationProvider conf) {
+    private static String getFactoryClassName(ConfigurationProvider conf,
+        ClassLoader loader) {
         try {
-            return getFactoryClass(conf).getName();
+            return getFactoryClass(conf, loader).getName();
         } catch (Exception e) {
             return "<" + e.toString() + ">";
         }
@@ -115,21 +143,28 @@ public class Bootstrap {
     /**
      * Instantiate the factory class designated in properties.
      */
-    private static Class<?> getFactoryClass(ConfigurationProvider conf) {
+    private static Class getFactoryClass(ConfigurationProvider conf,
+        ClassLoader loader) {
+        if (loader == null)
+            loader = AccessController.doPrivileged(
+                J2DoPrivHelper.getContextClassLoaderAction()); 
+
         Object cls = BrokerFactoryValue.get(conf);
         if (cls instanceof Class)
-            return (Class<?>) cls;
+            return (Class) cls;
 
         BrokerFactoryValue value = new BrokerFactoryValue();
         value.setString((String) cls);
         String clsName = value.getClassName();
         if (clsName == null)
-            throw new UserException(s_loc.get("no-brokerfactory", conf.getProperties())).setFatal(true);
+            throw new UserException(s_loc.get("no-brokerfactory", 
+                conf.getProperties())).setFatal(true);
 
         try {
-            return Class.forName(clsName, true, conf.getClassLoader());
+            return Class.forName(clsName, true, loader);
         } catch (Exception e) {
-            throw new UserException(s_loc.get("bad-brokerfactory-class", clsName), e).setFatal(true);
+            throw new UserException(s_loc.get("bad-brokerfactory-class",
+                clsName), e).setFatal(true);
 		}
 	}
 }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Broker.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Broker.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Broker.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Broker.java Sat Nov  5 17:17:26 2011
@@ -53,7 +53,8 @@ public interface Broker
      * after the first invocation with non-null arguments,
      * subsequent invocations of this method are ignored.
      */
-    public void setImplicitBehavior(OpCallbacks call, RuntimeExceptionTranslator ex);
+    public void setImplicitBehavior(OpCallbacks call,
+        RuntimeExceptionTranslator ex);
 
     /**
      * Return the factory that produced this broker.
@@ -287,7 +288,7 @@ public interface Broker
      *
      * @since 0.3.3
      */
-    public void addLifecycleListener(Object listener, Class<?>[] classes);
+    public void addLifecycleListener(Object listener, Class[] classes);
 
     /**
      * Remove a listener for lifecycle-related events.
@@ -468,7 +469,7 @@ public interface Broker
     /**
      * Persist the given objects.
      */
-    public void persistAll(Collection<?> objs, OpCallbacks call);
+    public void persistAll(Collection objs, OpCallbacks call);
 
     /**
      * Make the given instance persistent. Unlike other persist operations,
@@ -489,7 +490,7 @@ public interface Broker
     /**
      * Delete the given objects.
      */
-    public void deleteAll(Collection<?> objs, OpCallbacks call);
+    public void deleteAll(Collection objs, OpCallbacks call);
 
     /**
      * Release the given object from management. This operation is not
@@ -501,7 +502,7 @@ public interface Broker
      * Release the given objects from management. This operation is not
      * recursive.
      */
-    public void releaseAll(Collection<?> objs, OpCallbacks call);
+    public void releaseAll(Collection objs, OpCallbacks call);
 
     /**
      * Refresh the state of the given object.
@@ -511,7 +512,7 @@ public interface Broker
     /**
      * Refresh the state of the given objects.
      */
-    public void refreshAll(Collection<?> objs, OpCallbacks call);
+    public void refreshAll(Collection objs, OpCallbacks call);
 
     /**
      * Evict the given object.
@@ -521,7 +522,7 @@ public interface Broker
     /**
      * Evict the given objects.
      */
-    public void evictAll(Collection<?> objs, OpCallbacks call);
+    public void evictAll(Collection objs, OpCallbacks call);
 
     /**
      * Evict all clean objects.
@@ -532,7 +533,7 @@ public interface Broker
      * Evict all persistent-clean and persistent-nontransactional
      * instances in the given {@link Extent}.
      */
-    public void evictAll(Extent<?> extent, OpCallbacks call);
+    public void evictAll(Extent extent, OpCallbacks call);
 
     /**
      * Detach all objects in place.  A flush will be performed before
@@ -572,7 +573,7 @@ public interface Broker
      * @param objs the instances to detach
      * @return the detached instances
      */
-    public Object[] detachAll(Collection<?> objs, OpCallbacks call);
+    public Object[] detachAll(Collection objs, OpCallbacks call);
 
     /**
      * Import the specified detached object into the broker.
@@ -593,7 +594,8 @@ public interface Broker
      * @return the re-attached instances
      * @param copyNew whether to copy new instances
      */
-    public Object[] attachAll(Collection<?> objs, boolean copyNew,  OpCallbacks call);
+    public Object[] attachAll(Collection objs, boolean copyNew,
+        OpCallbacks call);
 
     /**
      * Create a new instance of type <code>cls</code>. If <code>cls</code> is
@@ -606,7 +608,7 @@ public interface Broker
      * @throws IllegalArgumentException if <code>cls</code> is not a managed
      * type or interface.
      */
-    public Object newInstance(Class<?> cls);
+    public Object newInstance(Class cls);
 
     /**
      * Returns <code>true</code> if <code>obj</code> is a detached object
@@ -618,13 +620,13 @@ public interface Broker
     /**
      * Return an extent of the given class, optionally including subclasses.
      */
-    public <T> Extent<T> newExtent(Class<T> cls, boolean subs);
+    public Extent newExtent(Class cls, boolean subs);
 
     /**
      * Create a new query from the given data, with the given candidate class
      * and language.
      */
-    public Query newQuery(String language, Class<?> cls, Object query);
+    public Query newQuery(String language, Class cls, Object query);
 
     /**
      * Create a new query in the given language.
@@ -672,7 +674,8 @@ public interface Broker
      * giving up, or -1 for no limit
      * @since 0.3.1
      */
-    public void lockAll(Collection<?> objs, int level, int timeout, OpCallbacks call);
+    public void lockAll(Collection objs, int level, int timeout,
+        OpCallbacks call);
 
     /**
      * Ensure that the given instances are locked at the current lock level, as
@@ -680,7 +683,7 @@ public interface Broker
      *
      * @since 0.3.1
      */
-    public void lockAll(Collection<?> objs, OpCallbacks call);
+    public void lockAll(Collection objs, OpCallbacks call);
 
     /**
      * Cancel all pending data store statements. If statements are cancelled
@@ -697,7 +700,7 @@ public interface Broker
      *
      * @since 0.3.0
      */
-    public void dirtyType(Class<?> cls);
+    public void dirtyType(Class cls);
 
     /**
      * Begin a logical operation. This indicates to the broker the

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java Sat Nov  5 17:17:26 2011
@@ -180,6 +180,9 @@ public class BrokerImpl
     private transient OpenJPAConfiguration _conf = null;
     private transient MetaDataRepository _repo = null;
 
+    // cache class loader associated with the broker
+    private transient ClassLoader _loader = null;
+
     // user state
     private Synchronization _sync = null;
     private Map<Object, Object> _userObjects = null;
@@ -326,6 +329,8 @@ public class BrokerImpl
         boolean fromDeserialization, boolean fromWriteBehindCallback) {
         _fromWriteBehindCallback = fromWriteBehindCallback;
         _initializeWasInvoked = true;
+        _loader = AccessController.doPrivileged(
+            J2DoPrivHelper.getContextClassLoaderAction());
         if (!fromDeserialization){
             _conf = factory.getConfiguration();
             _repo = _conf.getMetaDataRepositoryInstance();
@@ -482,6 +487,10 @@ public class BrokerImpl
         return _runtime;
     }
 
+    public ClassLoader getClassLoader() {
+        return _loader;
+    }
+
     public DelegatingStoreManager getStoreManager() {
         return _store;
     }
@@ -735,7 +744,7 @@ public class BrokerImpl
     // Events
     // ////////
 
-    public void addLifecycleListener(Object listener, Class<?>[] classes) {
+    public void addLifecycleListener(Object listener, Class[] classes) {
         beginOperation(false);
         try {
             _lifeEventManager.addListener(listener, classes);
@@ -1032,22 +1041,23 @@ public class BrokerImpl
         return sm;
     }
 
-    public Object[] findAll(Collection<?> oids, boolean validate, FindCallbacks call) {
+    public Object[] findAll(Collection oids, boolean validate,
+        FindCallbacks call) {
         int flags = OID_COPY | OID_ALLOW_NEW | OID_NODELETED;
-        if (!validate) {
+        if (!validate)
             flags |= OID_NOVALIDATE;
-        }
         return findAll(oids, _fc, null, null, flags, call);
     }
 
-    public Object[] findAll(Collection<?> oids, FetchConfiguration fetch, BitSet exclude, Object edata, int flags) {
+    public Object[] findAll(Collection oids, FetchConfiguration fetch,
+        BitSet exclude, Object edata, int flags) {
         return findAll(oids, fetch, exclude, edata, flags, null);
     }
 
     /**
      * Internal finder.
      */
-    protected Object[] findAll(Collection<?> oids, FetchConfiguration fetch,
+    protected Object[] findAll(Collection oids, FetchConfiguration fetch,
         BitSet exclude, Object edata, int flags, FindCallbacks call) {
         findAllDepth ++;
 
@@ -1110,8 +1120,10 @@ public class BrokerImpl
             // pass all state managers in need of loading or validation to the
             // store manager
             if (load != null) {
-                PCState state = (transState) ? PCState.PCLEAN : PCState.PNONTRANS;
-                Collection<Object> failed = _store.loadAll(load, state, StoreManager.FORCE_LOAD_NONE, fetch, edata);
+                PCState state = (transState) ? PCState.PCLEAN
+                    : PCState.PNONTRANS;
+                Collection<Object> failed = _store.loadAll(load, state,
+                    StoreManager.FORCE_LOAD_NONE, fetch, edata);
 
                 // set failed instances to null
                 if (failed != null && !failed.isEmpty()) {
@@ -1223,7 +1235,7 @@ public class BrokerImpl
 
         beginOperation(false);
         try {
-            ClassMetaData meta = _repo.getMetaData(cls, false);
+            ClassMetaData meta = _repo.getMetaData(cls, _loader, false);
             if (meta == null
                 || meta.getIdentityType() == ClassMetaData.ID_UNKNOWN)
                 return null;
@@ -1246,7 +1258,7 @@ public class BrokerImpl
 
         beginOperation(false);
         try {
-            ClassMetaData meta = _repo.getMetaData(cls, true);
+            ClassMetaData meta = _repo.getMetaData(cls, _loader, true);
             switch (meta.getIdentityType()) {
             case ClassMetaData.ID_DATASTORE:
                 // delegate to store manager for datastore ids
@@ -1308,9 +1320,9 @@ public class BrokerImpl
         Class<?> pcType = _store.getManagedType(oid);
         ClassMetaData meta;
         if (pcType != null)
-            meta = _repo.getMetaData(pcType, true);
+            meta = _repo.getMetaData(pcType, _loader, true);
         else
-            meta = _repo.getMetaData(oid, true);
+            meta = _repo.getMetaData(oid, _loader, true);
 
         // copy the oid if needed
         if (copy && _compat.getCopyObjectIds()) {
@@ -2075,7 +2087,7 @@ public class BrokerImpl
     protected void flush(int reason) {
         // this will enlist proxied states as necessary so we know whether we
         // have anything to flush
-        Collection<StateManagerImpl> transactional = getTransactionalStates();
+        Collection transactional = getTransactionalStates();
 
         // do we actually have to flush?  only if our flags say so, or if
         // we have transaction listeners that need to be invoked for commit
@@ -2090,14 +2102,13 @@ public class BrokerImpl
         if (!flush && (reason != FLUSH_COMMIT || !listeners))
             return;
 
-        ManagedObjectCollection mobjs = null;
+        Collection mobjs = null;
         _flags |= FLAG_PRESTORING;
         try {
             if (flush) {
                 // call pre store on all currently transactional objs
-                for (StateManagerImpl sm : transactional) {
-                    sm.beforeFlush(reason, _call);
-                }
+                for (Iterator itr = transactional.iterator(); itr.hasNext();)
+                    ((StateManagerImpl) itr.next()).beforeFlush(reason, _call);
                 flushAdditions(transactional, reason);
             }
 
@@ -2172,7 +2183,9 @@ public class BrokerImpl
 
             // mark states as flushed
             if (flush) {
-                for (StateManagerImpl sm : transactional) {
+                StateManagerImpl sm;
+                for (Iterator itr = transactional.iterator(); itr.hasNext();) {
+                    sm = (StateManagerImpl) itr.next();
                     try {
                         // the state may have become transient, such as if
                         // it is embedded and the owner has been deleted during
@@ -2210,7 +2223,7 @@ public class BrokerImpl
     /**
      * Flush newly-transactional objects.
      */
-    private void flushAdditions(Collection<StateManagerImpl> transactional, int reason) {
+    private void flushAdditions(Collection transactional, int reason) {
         boolean loop;
         do {
             // flush new transactional instances; note logical or
@@ -2222,7 +2235,7 @@ public class BrokerImpl
     /**
      * Flush transactional additions.
      */
-    private boolean flushTransAdditions(Collection<StateManagerImpl> transactional, int reason) {
+    private boolean flushTransAdditions(Collection transactional, int reason) {
         if (_transAdditions == null || _transAdditions.isEmpty())
             return false;
 
@@ -2230,7 +2243,8 @@ public class BrokerImpl
         transactional.addAll(_transAdditions);
 
         // copy the change set, then clear it for the next iteration
-        StateManagerImpl[] states = _transAdditions.toArray(new StateManagerImpl[_transAdditions.size()]);
+        StateManagerImpl[] states = (StateManagerImpl[]) _transAdditions.
+            toArray(new StateManagerImpl[_transAdditions.size()]);
         _transAdditions = null;
 
         for (int i = 0; i < states.length; i++)
@@ -2241,14 +2255,15 @@ public class BrokerImpl
     /**
      * Delete new dereferenced objects.
      */
-    private boolean deleteDerefAdditions(Collection<StateManagerImpl> derefs) {
+    private boolean deleteDerefAdditions(Collection derefs) {
         if (_derefAdditions == null || _derefAdditions.isEmpty())
             return false;
 
         // remember these additions in case one becomes derefed again later
         derefs.addAll(_derefAdditions);
 
-        StateManagerImpl[] states = _derefAdditions.toArray(new StateManagerImpl[_derefAdditions.size()]);
+        StateManagerImpl[] states = (StateManagerImpl[]) _derefAdditions.
+            toArray(new StateManagerImpl[_derefAdditions.size()]);
         _derefAdditions = null;
 
         for (int i = 0; i < states.length; i++)
@@ -2260,7 +2275,8 @@ public class BrokerImpl
      * Delete a dereferenced dependent.
      */
     private void deleteDeref(StateManagerImpl sm) {
-        int action = processArgument(OpCallbacks.OP_DELETE, sm.getManagedInstance(), sm, null);
+        int action = processArgument(OpCallbacks.OP_DELETE,
+            sm.getManagedInstance(), sm, null);
         if ((action & OpCallbacks.ACT_RUN) != 0)
             sm.delete();
         if ((action & OpCallbacks.ACT_CASCADE) != 0)
@@ -2271,7 +2287,8 @@ public class BrokerImpl
      * Determine the action to take based on the user's given callbacks and
      * our implicit behavior.
      */
-    private int processArgument(int op, Object obj, OpenJPAStateManager sm, OpCallbacks call) {
+    private int processArgument(int op, Object obj, OpenJPAStateManager sm,
+        OpCallbacks call) {
         if (call != null)
             return call.processArgument(op, obj, sm);
         if (_call != null)
@@ -2341,15 +2358,14 @@ public class BrokerImpl
         _fc.setWriteLockLevel(LOCK_NONE);
         _fc.setLockTimeout(-1);
 
-        TransactionalCache transStates;
-        if (hasTransactionalObjects()) {
+        Collection transStates;
+        if (hasTransactionalObjects())
             transStates = _transCache;
-        } else {
-        	transStates = new TransactionalCache(true);
-        }
+        else
+            transStates = Collections.EMPTY_SET;
 
         // fire after rollback/commit event
-        ManagedObjectCollection mobjs = null;
+        Collection mobjs = null;
         if (_transEventManager.hasEndListeners()) {
             mobjs = new ManagedObjectCollection(transStates);
             int eventType = (rollback) ? TransactionEvent.AFTER_ROLLBACK
@@ -2384,7 +2400,9 @@ public class BrokerImpl
         }
 
         // perform commit or rollback state transitions on each instance
-        for (StateManagerImpl sm : transStates) {
+        StateManagerImpl sm;
+        for (Iterator itr = transStates.iterator(); itr.hasNext();) {
+            sm = (StateManagerImpl) itr.next();
             try {
                 if (rollback) {
                     // tell objects that may have been derefed then flushed
@@ -2444,7 +2462,7 @@ public class BrokerImpl
         return persist(obj, id, true, call);
     }
 
-    public void persistAll(Collection<?> objs, OpCallbacks call) {
+    public void persistAll(Collection objs, OpCallbacks call) {
         persistAll(objs, true, call);
     }
 
@@ -2452,7 +2470,7 @@ public class BrokerImpl
      * Persist the given objects.  Indicate whether this was an explicit persist
      * (PNEW) or a provisonal persist (PNEWPROVISIONAL).
      */
-    public void persistAll(Collection<?> objs, boolean explicit, 
+    public void persistAll(Collection objs, boolean explicit, 
         OpCallbacks call) {
         if (objs.isEmpty())
             return;
@@ -2611,7 +2629,7 @@ public class BrokerImpl
             }
         }
 
-        ClassMetaData meta = _repo.getMetaData(obj.getClass(), true);
+        ClassMetaData meta = _repo.getMetaData(obj.getClass(), _loader, true);
         if (fireEvent) {
             fireLifecycleEvent(obj, null, meta, LifecycleEvent.BEFORE_PERSIST);
         }
@@ -2665,7 +2683,7 @@ public class BrokerImpl
         if (pc.pcGetStateManager() != null)
             throw newDetachedException(obj, errOp);
 
-        ClassMetaData meta = _repo.getMetaData(obj.getClass(), true);
+        ClassMetaData meta = _repo.getMetaData(obj.getClass(), _loader, true);
         StateManagerImpl sm = newStateManagerImpl(StateManagerId.
             newInstance(this), meta);
         sm.initialize(pc, PCState.TLOADED);
@@ -2689,7 +2707,7 @@ public class BrokerImpl
         }
     }
 
-    public void deleteAll(Collection<?> objs, OpCallbacks call) {
+    public void deleteAll(Collection objs, OpCallbacks call) {
         beginOperation(true);
         try {
             assertWriteOperation();
@@ -2786,7 +2804,7 @@ public class BrokerImpl
             Exceptions.toString(obj))).setFailedObject(obj);
     }
 
-    public void releaseAll(Collection<?> objs, OpCallbacks call) {
+    public void releaseAll(Collection objs, OpCallbacks call) {
         beginOperation(false);
         try {
             List<Exception> exceps = null;
@@ -2929,7 +2947,7 @@ public class BrokerImpl
             if (sm == null) {
                 MetaDataRepository repos = _conf.
                     getMetaDataRepositoryInstance();
-                ClassMetaData meta = repos.getMetaData(type, true);
+                ClassMetaData meta = repos.getMetaData(type, _loader, true);
                 // construct a new state manager with all info known
                 sm = newStateManagerImpl(oid, meta);
                 sm.setObjectId(oid);
@@ -2941,7 +2959,7 @@ public class BrokerImpl
         }
     }
     
-    public void refreshAll(Collection<?> objs, OpCallbacks call) {
+    public void refreshAll(Collection objs, OpCallbacks call) {
         if (objs == null || objs.isEmpty())
             return;
 
@@ -3007,7 +3025,7 @@ public class BrokerImpl
      * This method is called with the full set of objects reachable via
      * cascade-refresh relations from the user-given instances.
      */
-    protected void refreshInternal(Collection<?> objs, OpCallbacks call) {
+    protected void refreshInternal(Collection objs, OpCallbacks call) {
     	if (objs == null || objs.isEmpty())
     		return;
         List<Exception> exceps = null;
@@ -3124,7 +3142,8 @@ public class BrokerImpl
     }
     
     
-    public void retrieveAll(Collection<?> objs, boolean dfgOnly, OpCallbacks call) {
+    public void retrieveAll(Collection objs, boolean dfgOnly,
+        OpCallbacks call) {
         if (objs == null || objs.isEmpty())
             return;
         if (objs.size() == 1) {
@@ -3260,7 +3279,7 @@ public class BrokerImpl
         }
     }
 
-    public void evictAll(Collection<?> objs, OpCallbacks call) {
+    public void evictAll(Collection objs, OpCallbacks call) {
         List<Exception> exceps = null;
         beginOperation(false);
         try {
@@ -3277,7 +3296,7 @@ public class BrokerImpl
         throwNestedExceptions(exceps, false);
     }
 
-    public void evictAll(Extent<?> extent, OpCallbacks call) {
+    public void evictAll(Extent extent, OpCallbacks call) {
         if (extent == null)
             return;
 
@@ -3349,7 +3368,7 @@ public class BrokerImpl
         }
     }
 
-    public Object[] detachAll(Collection<?> objs, OpCallbacks call) {
+    public Object[] detachAll(Collection objs, OpCallbacks call) {
         if (objs == null)
             return null;
         if (objs.isEmpty())
@@ -3466,7 +3485,8 @@ public class BrokerImpl
         }
     }
 
-    public Object[] attachAll(Collection<?> objs, boolean copyNew, OpCallbacks call) {
+    public Object[] attachAll(Collection objs, boolean copyNew,
+        OpCallbacks call) {
         if (objs == null)
             return null;
         if (objs.isEmpty())
@@ -3492,7 +3512,7 @@ public class BrokerImpl
         }
     }
 
-    public void nontransactionalAll(Collection<?> objs, OpCallbacks call) {
+    public void nontransactionalAll(Collection objs, OpCallbacks call) {
         beginOperation(true);
         try {
             List<Exception> exceps = null;
@@ -3533,7 +3553,7 @@ public class BrokerImpl
     /**
      * Make the given instances transactional.
      */
-    public void transactionalAll(Collection<?> objs, boolean updateVersion,
+    public void transactionalAll(Collection objs, boolean updateVersion,
         OpCallbacks call) {
         if (objs.isEmpty())
             return;
@@ -3565,7 +3585,7 @@ public class BrokerImpl
 
                     if (sm == null) {
                         // manage transient instance
-                        meta = _repo.getMetaData(obj.getClass(), true);
+                        meta = _repo.getMetaData(obj.getClass(), _loader, true);
 
                         sm = newStateManagerImpl
                             (StateManagerId.newInstance(this), meta);
@@ -3636,7 +3656,7 @@ public class BrokerImpl
                 _flags |= FLAG_FLUSH_REQUIRED; // version check/up
             } else if (sm == null) {
                 // manage transient instance
-                ClassMetaData meta = _repo.getMetaData(obj.getClass(), true);
+                ClassMetaData meta = _repo.getMetaData(obj.getClass(), _loader, true);
                 Object id = StateManagerId.newInstance(this);
                 sm = newStateManagerImpl(id, meta);
                 sm.initialize(assertPersistenceCapable(obj),
@@ -3655,10 +3675,12 @@ public class BrokerImpl
     /**
      * Transition the given state managers to transactional.
      */
-    private void transactionalStatesAll(Collection<StateManagerImpl> sms, Collection<?> failed, 
-    		List<Exception> exceps) {
+    private void transactionalStatesAll(Collection sms, Collection failed,
+        List<Exception> exceps) {
         // make instances transactional and make sure they are loaded
-        for (StateManagerImpl sm : sms) {
+        StateManagerImpl sm;
+        for (Iterator<?> itr = sms.iterator(); itr.hasNext();) {
+            sm = (StateManagerImpl) itr.next();
             if (failed != null && failed.contains(sm.getId()))
                 continue;
 
@@ -3676,14 +3698,15 @@ public class BrokerImpl
     // Extent, Query
     /////////////////
 
-    public <T> Extent<T> newExtent(Class<T> type, boolean subclasses) {
+    public Extent newExtent(Class type, boolean subclasses) {
         return newExtent(type, subclasses, null);
     }
 
-    private <T> Extent<T> newExtent(Class<T> type, boolean subclasses, FetchConfiguration fetch) {
+    private Extent newExtent(Class type, boolean subclasses,
+        FetchConfiguration fetch) {
         beginOperation(true);
         try {
-            ExtentImpl<T> extent = new ExtentImpl<T>(this, type, subclasses, fetch);
+            ExtentImpl extent = new ExtentImpl(this, type, subclasses, fetch);
             if (_extents == null)
                 _extents = new ReferenceHashSet(ReferenceHashSet.WEAK);
             _extents.add(extent);
@@ -3698,14 +3721,14 @@ public class BrokerImpl
         }
     }
 
-    public <T> Iterator<T> extentIterator(Class<T> type, boolean subclasses,
-    		FetchConfiguration fetch, boolean ignoreChanges) {
-        Extent<T> extent = newExtent(type, subclasses, fetch);
+    public Iterator extentIterator(Class type, boolean subclasses,
+        FetchConfiguration fetch, boolean ignoreChanges) {
+        Extent extent = newExtent(type, subclasses, fetch);
         extent.setIgnoreChanges(ignoreChanges);
         return extent.iterator();
     }
 
-    public Query newQuery(String lang, Class<?> cls, Object query) {
+    public Query newQuery(String lang, Class cls, Object query) {
         Query q = newQuery(lang, query);
         q.setCandidateType(cls, true);
         return q;
@@ -3792,7 +3815,7 @@ public class BrokerImpl
                 SequenceMetaData smd = (fmd == null)
                     ? meta.getIdentitySequenceMetaData()
                     : fmd.getValueSequenceMetaData();
-                return smd.getInstance();
+                return smd.getInstance(_loader);
             default:
                 // use store manager for native sequence
                 if (fmd == null) {
@@ -3811,7 +3834,7 @@ public class BrokerImpl
                     }
 
                     if (smd != null) {
-                        return smd.getInstance();
+                        return smd.getInstance(_loader);
                     } else {
                         return _store.getDataStoreIdSequence(meta);
                     }
@@ -3862,7 +3885,7 @@ public class BrokerImpl
         }
     }
 
-    public void lockAll(Collection<?> objs, OpCallbacks call) {
+    public void lockAll(Collection objs, OpCallbacks call) {
         if (objs.isEmpty())
             return;
 
@@ -3875,7 +3898,8 @@ public class BrokerImpl
         }
     }
 
-    public void lockAll(Collection<?> objs, int level, int timeout, OpCallbacks call) {
+    public void lockAll(Collection objs, int level, int timeout,
+        OpCallbacks call) {
         if (objs.isEmpty())
             return;
         if (objs.size() == 1) {
@@ -3904,9 +3928,8 @@ public class BrokerImpl
             }
 
             _lm.lockAll(sms, level, timeout, null);
-            for (Iterator<StateManagerImpl> itr = sms.iterator(); itr.hasNext();) {
+            for (Iterator<StateManagerImpl> itr = sms.iterator(); itr.hasNext();)
                 itr.next().readLocked(level, level);
-            }
         } catch (OpenJPAException ke) {
             throw ke;
         } catch (RuntimeException re) {
@@ -3978,7 +4001,7 @@ public class BrokerImpl
     // Cache
     /////////
 
-    public Collection<Object> getManagedObjects() {
+    public Collection getManagedObjects() {
         beginOperation(false);
         try {
             return new ManagedObjectCollection(getManagedStates());
@@ -3987,7 +4010,7 @@ public class BrokerImpl
         }
     }
 
-    public Collection<Object> getTransactionalObjects() {
+    public Collection getTransactionalObjects() {
         beginOperation(false);
         try {
             return new ManagedObjectCollection(getTransactionalStates());
@@ -3996,16 +4019,17 @@ public class BrokerImpl
         }
     }
 
-    public Collection<Object> getPendingTransactionalObjects() {
+    public Collection getPendingTransactionalObjects() {
         beginOperation(false);
         try {
-            return new ManagedObjectCollection(getPendingTransactionalStates());
+            return new ManagedObjectCollection
+                (getPendingTransactionalStates());
         } finally {
             endOperation();
         }
     }
 
-    public Collection<Object> getDirtyObjects() {
+    public Collection getDirtyObjects() {
         beginOperation(false);
         try {
             return new ManagedObjectCollection(getDirtyStates());
@@ -4025,7 +4049,7 @@ public class BrokerImpl
     /**
      * Return a copy of all managed state managers.
      */
-    protected Collection<StateManagerImpl> getManagedStates() {
+    protected Collection getManagedStates() {
         return _cache.copy();
     }
 
@@ -4053,9 +4077,9 @@ public class BrokerImpl
     /**
      * Return a copy of all dirty state managers.
      */
-    protected Collection<StateManagerImpl> getDirtyStates() {
+    protected Collection getDirtyStates() {
         if (!hasTransactionalObjects())
-            return Collections.emptySet();
+            return Collections.EMPTY_SET;
 
         return _transCache.copyDirty();
     }
@@ -4064,9 +4088,9 @@ public class BrokerImpl
      * Return a copy of all state managers which will become
      * transactional upon the next transaction.
      */
-    protected Collection<StateManagerImpl> getPendingTransactionalStates() {
+    protected Collection getPendingTransactionalStates() {
         if (_pending == null)
-            return Collections.emptySet();
+            return Collections.EMPTY_SET;
         return new LinkedHashSet<StateManagerImpl>(_pending);
     }
 
@@ -4275,7 +4299,7 @@ public class BrokerImpl
         }
     }
 
-    public void dirtyType(Class<?> cls) {
+    public void dirtyType(Class cls) {
         if (cls == null)
             return;
 
@@ -4289,21 +4313,21 @@ public class BrokerImpl
         }
     }
 
-    public Collection<Class<?>> getPersistedTypes() {
+    public Collection getPersistedTypes() {
         if (_persistedClss == null || _persistedClss.isEmpty())
-            return Collections.emptySet();
+            return Collections.EMPTY_SET;
         return Collections.unmodifiableCollection(_persistedClss);
     }
 
-    public Collection<Class<?>> getUpdatedTypes() {
+    public Collection getUpdatedTypes() {
         if (_updatedClss == null || _updatedClss.isEmpty())
-            return Collections.emptySet();
+            return Collections.EMPTY_SET;
         return Collections.unmodifiableCollection(_updatedClss);
     }
 
-    public Collection<Class<?>> getDeletedTypes() {
+    public Collection getDeletedTypes() {
         if (_deletedClss == null || _deletedClss.isEmpty())
-            return Collections.emptySet();
+            return Collections.EMPTY_SET;
         return Collections.unmodifiableCollection(_deletedClss);
     }
 
@@ -4359,6 +4383,7 @@ public class BrokerImpl
         _deletedClss = null;
         _derefCache = null;
         _pending = null;
+        _loader = null;
         _transEventManager = null;
         _lifeEventManager = null;
 
@@ -4382,9 +4407,9 @@ public class BrokerImpl
         }
 
         if (_extents != null) {
-            Extent<?> e;
+            Extent e;
             for (Iterator<?> itr = _extents.iterator(); itr.hasNext();) {
-                e = (Extent<?>) itr.next();
+                e = (Extent) itr.next();
                 try {
                     e.closeAll();
                 } catch (RuntimeException re) {
@@ -4429,11 +4454,12 @@ public class BrokerImpl
     // State management
     ////////////////////
 
-    public Object newInstance(Class<?> cls) {
+    public Object newInstance(Class cls) {
         assertOpen();
 
         if (!cls.isInterface() && Modifier.isAbstract(cls.getModifiers()))
-            throw new UnsupportedOperationException(_loc.get("new-abstract", cls).getMessage());
+            throw new UnsupportedOperationException(_loc.get
+                ("new-abstract", cls).getMessage());
 
         // 1.5 doesn't initialize classes without a true Class.forName
         if (!PCRegistry.isRegistered(cls)) {
@@ -4445,7 +4471,7 @@ public class BrokerImpl
             }
         }
 
-        if (_repo.getMetaData(cls, false) == null)
+        if (_repo.getMetaData(cls, getClassLoader(), false) == null)
             throw new IllegalArgumentException(
                 _loc.get("no-interface-metadata", cls.getName()).getMessage());
 
@@ -4467,7 +4493,7 @@ public class BrokerImpl
                 if (pc.pcGetStateManager() == null) {
                     // If the statemanager is null the call to pcFetchObjectId always returns null. Create a new object
                     // id.
-                    return ApplicationIds.create(pc, _repo.getMetaData(pc.getClass(), true));
+                    return ApplicationIds.create(pc, _repo.getMetaData(pc.getClass(), null, true));
                 }
                 return pc.pcFetchObjectId();
             }
@@ -4556,7 +4582,7 @@ public class BrokerImpl
             return detached.booleanValue();
 
         // last resort: instance is detached if it has a store record
-        ClassMetaData meta = _repo.getMetaData(ImplHelper.getManagedInstance(pc).getClass(), true);
+        ClassMetaData meta = _repo.getMetaData(ImplHelper.getManagedInstance(pc).getClass(), _loader, true);
         Object oid = ApplicationIds.create(pc, meta);
         if (oid == null)
             return false;
@@ -4685,7 +4711,8 @@ public class BrokerImpl
      * Return an object not found exception containing nested exceptions
      * for all of the given failed objects.
      */
-    private static ObjectNotFoundException newObjectNotFoundException(Collection<?> failed) {
+    private static ObjectNotFoundException newObjectNotFoundException
+        (Collection failed) {
         Throwable[] t = new Throwable[failed.size()];
         int idx = 0;
         for (Iterator<?> itr = failed.iterator(); itr.hasNext(); idx++)
@@ -4774,11 +4801,11 @@ public class BrokerImpl
      * Transactional cache that holds soft refs to clean instances.
      */
     static class TransactionalCache
-        implements Set<StateManagerImpl>, Serializable {
+        implements Set, Serializable {
 
         private final boolean _orderDirty;
-        private Set<StateManagerImpl> _dirty;
-        private Set<StateManagerImpl> _clean;
+        private Set<StateManagerImpl> _dirty = null;
+        private Set<StateManagerImpl> _clean = null;
 
         public TransactionalCache(boolean orderDirty) {
             _orderDirty = orderDirty;
@@ -4787,31 +4814,31 @@ public class BrokerImpl
         /**
          * Return a copy of all transactional state managers.
          */
-        public Collection<StateManagerImpl> copy() {
+        public Collection copy() {
             if (isEmpty()) {
                 // Transaction Listeners may add entities to the transaction. 
-                return new LinkedHashSet<StateManagerImpl>();
+                return new LinkedHashSet();
             }
 
             // size may not be entirely accurate due to refs expiring, so
             // manually copy each object; doesn't matter this way if size too
             // big by some
-            Set<StateManagerImpl> copy = new LinkedHashSet<StateManagerImpl>(size());
+            Set copy = new LinkedHashSet(size());
             if (_dirty != null)
-                for (StateManagerImpl dirty : _dirty)
-                    copy.add(dirty);
+                for (Iterator<StateManagerImpl> itr = _dirty.iterator(); itr.hasNext();)
+                    copy.add(itr.next());
             if (_clean != null)
-                for (StateManagerImpl clean : _clean)
-                    copy.add(clean);
+                for (Iterator<StateManagerImpl> itr = _clean.iterator(); itr.hasNext();)
+                    copy.add(itr.next());
             return copy;
         }
 
         /**
          * Return a copy of all dirty state managers.
          */
-        public Collection<StateManagerImpl> copyDirty() {
+        public Collection copyDirty() {
             if (_dirty == null || _dirty.isEmpty())
-                return Collections.emptySet();
+                return Collections.EMPTY_SET;
             return new LinkedHashSet<StateManagerImpl>(_dirty);
         }
 
@@ -4863,7 +4890,7 @@ public class BrokerImpl
             return _clean != null && _clean.remove(sm);
         }
 
-        public Iterator<StateManagerImpl> iterator() {
+        public Iterator iterator() {
             IteratorChain chain = new IteratorChain();
             if (_dirty != null && !_dirty.isEmpty())
                 chain.addIterator(_dirty.iterator());
@@ -4877,7 +4904,7 @@ public class BrokerImpl
                 || (_clean != null && _clean.contains(obj));
         }
 
-        public boolean containsAll(Collection<?> coll) {
+        public boolean containsAll(Collection coll) {
             for (Iterator<?> itr = coll.iterator(); itr.hasNext();)
                 if (!contains(itr.next()))
                     return false;
@@ -4905,11 +4932,11 @@ public class BrokerImpl
             return size;
         }
 
-        public boolean add(StateManagerImpl obj) {
+        public boolean add(Object obj) {
             throw new UnsupportedOperationException();
         }
 
-        public boolean addAll(Collection<? extends StateManagerImpl> coll) {
+        public boolean addAll(Collection coll) {
             throw new UnsupportedOperationException();
         }
 
@@ -4917,11 +4944,11 @@ public class BrokerImpl
             throw new UnsupportedOperationException();
         }
 
-        public boolean removeAll(Collection<?> coll) {
+        public boolean removeAll(Collection coll) {
             throw new UnsupportedOperationException();
         }
 
-        public boolean retainAll(Collection<?> c) {
+        public boolean retainAll(Collection c) {
             throw new UnsupportedOperationException();
         }
 
@@ -4929,10 +4956,9 @@ public class BrokerImpl
             throw new UnsupportedOperationException();
         }
 
-		@Override
-		public <T> T[] toArray(T[] a) {
+        public Object[] toArray(Object[] arr) {
             throw new UnsupportedOperationException();
-		}
+        }
     }
 
     /**
@@ -4989,15 +5015,15 @@ public class BrokerImpl
      * with the corresponding managed objects.
      */
     private static class ManagedObjectCollection
-        extends AbstractCollection<Object> {
+        extends AbstractCollection {
 
-        private final Collection<? extends OpenJPAStateManager> _states;
+        private final Collection _states;
 
-        public ManagedObjectCollection(Collection<? extends OpenJPAStateManager> states) {
+        public ManagedObjectCollection(Collection states) {
             _states = states;
         }
 
-        public Collection<? extends OpenJPAStateManager> getStateManagers() {
+        public Collection getStateManagers() {
             return _states;
         }
 
@@ -5005,16 +5031,17 @@ public class BrokerImpl
             return _states.size();
         }
 
-        public Iterator<Object> iterator() {
-            return new Iterator<Object>() {
-                private final Iterator<? extends OpenJPAStateManager> _itr = _states.iterator();
+        public Iterator iterator() {
+            return new Iterator() {
+                private final Iterator _itr = _states.iterator();
 
                 public boolean hasNext() {
                     return _itr.hasNext();
                 }
 
                 public Object next() {
-                    return ((OpenJPAStateManager) _itr.next()).getManagedInstance();
+                    return ((OpenJPAStateManager) _itr.next()).
+                        getManagedInstance();
                 }
 
                 public void remove() {

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingBroker.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingBroker.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingBroker.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingBroker.java Sat Nov  5 17:17:26 2011
@@ -170,6 +170,14 @@ public class DelegatingBroker
         }
     }
 
+    public ClassLoader getClassLoader() {
+        try {
+            return _broker.getClassLoader();
+        } catch (RuntimeException re) {
+            throw translate(re);
+        }
+    }
+
     public LockManager getLockManager() {
         try {
             return _broker.getLockManager();

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingStoreManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingStoreManager.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingStoreManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DelegatingStoreManager.java Sat Nov  5 17:17:26 2011
@@ -127,7 +127,7 @@ public abstract class DelegatingStoreMan
         _store.beforeStateChange(sm, fromState, toState);
     }
 
-    public Collection<Exception> flush(Collection<? extends OpenJPAStateManager> sms) {
+    public Collection<Exception> flush(Collection<OpenJPAStateManager> sms) {
         return _store.flush(sms);
     }
 

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateAttachStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateAttachStrategy.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateAttachStrategy.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateAttachStrategy.java Sat Nov  5 17:17:26 2011
@@ -48,10 +48,12 @@ class DetachedStateAttachStrategy
             return null;
 
         Broker broker = manager.getBroker();
-        PersistenceCapable pc = ImplHelper.toPersistenceCapable(toAttach, broker.getConfiguration());
+        PersistenceCapable pc = ImplHelper.toPersistenceCapable(toAttach,
+            broker.getConfiguration());
         ClassMetaData meta = broker.getConfiguration().
             getMetaDataRepositoryInstance().getMetaData(
-                ImplHelper.getManagedInstance(toAttach).getClass(), true);
+                ImplHelper.getManagedInstance(toAttach).getClass(),
+                broker.getClassLoader(), true);
 
         switch (meta.getIdentityType()) {
             case ClassMetaData.ID_DATASTORE:

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedValueStateManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedValueStateManager.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedValueStateManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedValueStateManager.java Sat Nov  5 17:17:26 2011
@@ -52,7 +52,8 @@ public class DetachedValueStateManager
     public DetachedValueStateManager(Object pc, StoreContext ctx) {
         this(ImplHelper.toPersistenceCapable(pc, ctx.getConfiguration()),
             ctx.getConfiguration().getMetaDataRepositoryInstance()
-                .getMetaData(ImplHelper.getManagedInstance(pc).getClass(), true), ctx);
+                .getMetaData(ImplHelper.getManagedInstance(pc).getClass(),
+            ctx.getClassLoader(), true), ctx);
     }
 
     public DetachedValueStateManager(PersistenceCapable pc, ClassMetaData meta,

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java?rev=1197994&r1=1197993&r2=1197994&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java Sat Nov  5 17:17:26 2011
@@ -94,8 +94,8 @@ public class ExpressionStoreQuery
         new StringContains(), new WildcardMatch(),
     };
 
-    protected final ExpressionParser _parser;
-    protected transient Object _parsed;
+    private final ExpressionParser _parser;
+    private transient Object _parsed;
 
     /**
      * Construct a query with a parser for the language.
@@ -172,7 +172,7 @@ public class ExpressionStoreQuery
 
     public Executor newInMemoryExecutor(ClassMetaData meta, boolean subs) {
         return new InMemoryExecutor(this, meta, subs, _parser,
-            ctx.getCompilation(), new InMemoryExpressionFactory());
+            ctx.getCompilation());
     }
 
     public Executor newDataStoreExecutor(ClassMetaData meta, boolean subs) {
@@ -576,7 +576,7 @@ public class ExpressionStoreQuery
     /**
      * Runs the expression query in memory.
      */
-    public static class InMemoryExecutor
+    private static class InMemoryExecutor
         extends AbstractExpressionExecutor
         implements Executor, Serializable {
 
@@ -588,10 +588,10 @@ public class ExpressionStoreQuery
 
         public InMemoryExecutor(ExpressionStoreQuery q,
             ClassMetaData candidate, boolean subclasses,
-            ExpressionParser parser, Object parsed, InMemoryExpressionFactory factory) {
+            ExpressionParser parser, Object parsed) {
             _meta = candidate;
             _subs = subclasses;
-            _factory = factory;
+            _factory = new InMemoryExpressionFactory();
 
             _exps = new QueryExpressions[] {
                 parser.eval(parsed, q, _factory, _meta)
@@ -637,9 +637,9 @@ public class ExpressionStoreQuery
                 Object obj;
                 while (itr.hasNext()) {
                     obj = itr.next();
-                    if (_factory.matches(_exps[0], _meta, _subs, obj, ctx, params)) {
+                    if (_factory.matches(_exps[0], _meta, _subs, obj, ctx,
+                        params))
                         results.add(obj);
-                    }
                 }
             }
             finally {
@@ -703,7 +703,6 @@ public class ExpressionStoreQuery
         public Class[] getProjectionTypes(StoreQuery q) {
             return _projTypes;
         }
-        
 
         /**
          * Throws an exception if a variable is found.