You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2006/12/30 02:40:08 UTC

svn commit: r491149 [1/3] - in /incubator/openejb/trunk/openejb3: assembly/openejb-standalone/src/main/resources/ container/ container/openejb-core/ container/openejb-core/src/main/java/org/apache/openejb/alt/config/ container/openejb-core/src/main/jav...

Author: dain
Date: Fri Dec 29 17:40:06 2006
New Revision: 491149

URL: http://svn.apache.org/viewvc?view=rev&rev=491149
Log:
OPENEJB-425 Add support for runtime enhancement of JPA classes

Added:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/TemporaryClassLoader.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/instrument/
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/SampleAnnotation.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/TemporaryClassLoaderTest.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/Employee.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/JpaTestObject.java
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/   (with props)
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/DISCLAIMER.txt
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/LICENSE.txt
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/NOTICE.txt
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/pom.xml
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/src/
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/src/main/
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/src/main/java/
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/src/main/java/org/
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/src/main/java/org/apache/
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/src/main/java/org/apache/openejb/
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/src/main/java/org/apache/openejb/javaagent/
    incubator/openejb/trunk/openejb3/container/openejb-javaagent/src/main/java/org/apache/openejb/javaagent/Agent.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceClassLoaderHandler.java
Removed:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/TempCodebase.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/temp-persistence.xml
Modified:
    incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb
    incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.bat
    incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/DeploymentsFactory.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/PersistenceUnitReference.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SafeToolkit.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/JpaTest.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/iTest.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/pom.xml
    incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceDeployer.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/src/test/java/org/apache/openejb/persistence/OpenJpaProviderTest.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/src/test/java/org/apache/openejb/persistence/PersistenceTest.java
    incubator/openejb/trunk/openejb3/container/pom.xml
    incubator/openejb/trunk/openejb3/examples/ejb-injection/   (props changed)
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/pom.xml
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/persistence.xml
    incubator/openejb/trunk/openejb3/server/openejb-admin/src/main/java/org/apache/openejb/App.java
    incubator/openejb/trunk/openejb3/server/openejb-ejbd/pom.xml
    incubator/openejb/trunk/openejb3/server/openejb-http/pom.xml
    incubator/openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpServer.java
    incubator/openejb/trunk/openejb3/server/openejb-server/src/main/java/org/apache/openejb/server/Server.java

Modified: incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb (original)
+++ incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb Fri Dec 29 17:40:06 2006
@@ -77,28 +77,29 @@
 OPTIONS="-Dopenejb.home=$OPENEJB_HOME"
 
 OPENEJB_CORE_JAR="$OPENEJB_HOME/lib/openejb-core-${pom.version}.jar"
+OPENEJB_JAVAAGENT_JAR="$OPENEJB_HOME/lib/openejb-javaagent-${pom.version}.jar"
 
 #============================================================
 _command_help()
 {
     case $2 in
         "validate")
-            java -jar $OPENEJB_CORE_JAR validate --help
+            java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR validate --help
         ;;
         "deploy")
-            java -jar $OPENEJB_CORE_JAR deploy --help
+            java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR deploy --help
         ;;
         "start")
-            java -jar $OPENEJB_CORE_JAR start --help
+            java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR start --help
         ;;
         "stop")
-            java -jar $OPENEJB_CORE_JAR stop --help
+            java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR stop --help
         ;;
         "test")
-            java -jar $OPENEJB_CORE_JAR test --help
+            java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR test --help
         ;;
         *)
-            java -jar $OPENEJB_CORE_JAR
+            java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR
         ;;
     esac
 }
@@ -106,33 +107,33 @@
 _command_deploy()
 {
    shift
-   java -jar $OPENEJB_CORE_JAR deploy $@
+   java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR deploy $@
 }
 #============================================================
 _command_validate()
 {
    shift
-   java -jar $OPENEJB_CORE_JAR validate $@
+   java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR validate $@
 }
 #============================================================
 _command_start()
 {
-   java -jar $OPENEJB_CORE_JAR start $@
+   java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR start $@
 }
 #============================================================
 _command_stop()
 {
-   java -jar $OPENEJB_CORE_JAR stop $@
+   java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR stop $@
 }
 #============================================================
 _test_intravm()
 {
-   java -jar $OPENEJB_CORE_JAR test local
+   java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR test local
 }
 #============================================================
 _test_server()
 {
-   java -jar $OPENEJB_CORE_JAR test remote
+   java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR test remote
 }
 #============================================================
 _command_test()
@@ -155,7 +156,7 @@
 #============================================================
 _test_help()
 {
-   java -jar $OPENEJB_CORE_JAR test --help
+   java -javaagent:$OPENEJB_JAVAAGENT_JAR -jar $OPENEJB_CORE_JAR test --help
 }
 #============================================================
 _test_noargs()

Modified: incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.bat
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.bat?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.bat (original)
+++ incubator/openejb/trunk/openejb3/assembly/openejb-standalone/src/main/resources/openejb.bat Fri Dec 29 17:40:06 2006
@@ -33,6 +33,7 @@
 SETLOCAL
 
 set OPENEJB_CORE_JAR=%OPENEJB_HOME%/lib/openejb-core-${pom.version}.jar
+set OPENEJB_JAVAAGENT_JAR=%OPENEJB_HOME%/lib/openejb-javaagent-${pom.version}.jar
 
 rem find OPENEJB_HOME if it does not exist due to either an invalid value passed
 rem by the user or the %0 problem on Windows 9x
@@ -78,25 +79,25 @@
 REM================================================
 :VALIDATE 
    shift
-   java -jar %OPENEJB_CORE_JAR% validate %1 %2 %3 %4 %5 %6 %7 %8 %9
+   java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% validate %1 %2 %3 %4 %5 %6 %7 %8 %9
 
 goto EOF
 REM================================================
 :DEPLOY 
    shift
-   java -jar %OPENEJB_CORE_JAR% deploy %1 %2 %3 %4 %5 %6 %7 %8 %9
+   java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% deploy %1 %2 %3 %4 %5 %6 %7 %8 %9
 
 goto EOF
 REM================================================
 :START_SERVER
    shift
-   java -jar %OPENEJB_CORE_JAR% start %1 %2 %3 %4 %5 %6 %7 %8 %9
+   java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% start %1 %2 %3 %4 %5 %6 %7 %8 %9
 
 goto EOF
 REM================================================
 :STOP_SERVER
    shift
-   java -jar %OPENEJB_CORE_JAR% stop %1 %2 %3 %4 %5 %6 %7 %8 %9
+   java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% stop %1 %2 %3 %4 %5 %6 %7 %8 %9
 
 goto EOF
 REM================================================
@@ -106,44 +107,44 @@
 REM================================================
 :TEST_INTRAVM
 
-   java -jar %OPENEJB_CORE_JAR% test local
+   java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% test local
          
 if /I %P2% EQU _ goto TEST_SERVER
 goto EOF
 REM================================================
 :TEST_SERVER
 
-   java -jar %OPENEJB_CORE_JAR% test remote
+   java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% test remote
    
 goto EOF
 REM================================================
 :HELP_TEST
    
-	java -jar %OPENEJB_CORE_JAR% test --help
+	java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% test --help
 
 goto EOF
 REM================================================
 :HELP_DEPLOY
    
-	java -jar %OPENEJB_CORE_JAR% deploy --help
+	java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% deploy --help
 	
 goto EOF
 REM================================================
 :HELP_VALIDATE
    
-	java -jar %OPENEJB_CORE_JAR% validate --help
+	java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% validate --help
 
 goto EOF
 REM================================================
 :HELP_START
    
-	java -jar %OPENEJB_CORE_JAR% start --help
+	java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% start --help
 
 goto EOF
 REM================================================
 :HELP_STOP
    
-	java -jar %OPENEJB_CORE_JAR% stop --help
+	java -javaagent:%OPENEJB_JAVAAGENT_JAR% -jar %OPENEJB_CORE_JAR% stop --help
 
 goto EOF
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/pom.xml Fri Dec 29 17:40:06 2006
@@ -40,11 +40,43 @@
     </resources>
     <plugins>
       <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>dependency-maven-plugin</artifactId>
+
+        <!-- TODO switch to maven version of plugin when it is released -->
+        <!--groupId>org.apache.maven.plugins</groupId-->
+        <!--artifactId>maven-dependency-plugin</artifactId-->
+
+        <executions>
+          <execution>
+            <id>copy-dependencies</id>
+            <phase>process-resources</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.openejb</groupId>
+                  <artifactId>openejb-javaagent</artifactId>
+                  <version>${pom.version}</version>
+                  <outputDirectory>${project.build.directory}</outputDirectory>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
+          <!-- Launch a new vm for each test -->
           <forkMode>pertest</forkMode>
-          <!-- argLine>-agentlib:jdwp=transport=dt_socket,server=y,address=5005</argLine -->
+
+          <!-- DEBUG: Uncomment this line and comment out the next -->
+          <!--<argLine>-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 -javaagent:${basedir}/target/openejb-javaagent-${pom.version}.jar</argLine>-->
+          <argLine>-javaagent:${basedir}/target/openejb-javaagent-${pom.version}.jar</argLine>
           <systemProperties>
             <property>
               <name>openejb.home</name>
@@ -113,7 +145,7 @@
         <configuration>
           <namespace>http://openejb.apache.org/schemas/core</namespace>
           <excludedClasses>org.apache.openejb.alt.config.ejb,org.apache.openejb.util.io,org.apache.openejb.InterfaceType,org.apache.openejb.BeanType</excludedClasses>
-        </configuration>
+        </configuration>
       </plugin>
     </plugins>
   </build>
@@ -129,6 +161,11 @@
     <dependency>
       <groupId>org.apache.openejb</groupId>
       <artifactId>openejb-loader</artifactId>
+      <version>${pom.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-javaagent</artifactId>
       <version>${pom.version}</version>
     </dependency>
     <dependency>

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java Fri Dec 29 17:40:06 2006
@@ -19,6 +19,7 @@
 
 import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.core.TemporaryClassLoader;
 import org.apache.openejb.alt.config.ejb.OpenejbJar;
 import org.apache.openejb.alt.config.sys.Deployments;
 import org.apache.openejb.jee.Application;
@@ -43,7 +44,6 @@
 import java.net.JarURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.net.URLClassLoader;
 import java.nio.channels.FileChannel;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -280,7 +280,7 @@
 
         URL appUrl = getFileUrl(appDir);
 
-        ClassLoader tmpClassLoader = new URLClassLoader(new URL[]{appUrl}, OpenEJB.class.getClassLoader());
+        ClassLoader tmpClassLoader = new TemporaryClassLoader(new URL[]{appUrl}, OpenEJB.class.getClassLoader());
 
         ResourceFinder finder = new ResourceFinder("", tmpClassLoader, appUrl);
 
@@ -364,7 +364,7 @@
             classPath.addAll(ejbModules.values());
             classPath.addAll(clientModules.values());
             classPath.addAll(extraLibs);
-            ClassLoader appClassLoader = new URLClassLoader(classPath.toArray(new URL[]{}), OpenEJB.class.getClassLoader());
+            ClassLoader appClassLoader = new TemporaryClassLoader(classPath.toArray(new URL[]{}), OpenEJB.class.getClassLoader());
 
 
             AppModule appModule = new AppModule(appClassLoader, appDir.getAbsolutePath());
@@ -474,7 +474,7 @@
             }
         }
 
-        ClassFinder classFinder = new ClassFinder(new URLClassLoader(new URL[]{baseUrl},classLoader), baseUrl);
+        ClassFinder classFinder = new ClassFinder(new TemporaryClassLoader(new URL[]{baseUrl},classLoader), baseUrl);
         List<Class> beans = classFinder.findAnnotatedClasses(Stateless.class);
         beans.addAll(classFinder.findAnnotatedClasses(Stateful.class));
         beans.addAll(classFinder.findAnnotatedClasses(javax.ejb.MessageDriven.class));
@@ -528,7 +528,7 @@
     private ClassLoader getClassLoader(File jarFile) throws OpenEJBException {
         try {
             URL[] urls = new URL[]{jarFile.toURL()};
-            return new URLClassLoader(urls, OpenEJB.class.getClassLoader());
+            return new TemporaryClassLoader(urls, OpenEJB.class.getClassLoader());
         } catch (MalformedURLException e) {
             throw new OpenEJBException(ConfigurationFactory.messages.format("cl0001", jarFile.getAbsolutePath(), e.getMessage()));
         }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Fri Dec 29 17:40:06 2006
@@ -21,6 +21,7 @@
 import org.apache.openejb.EnvProps;
 import org.apache.openejb.Injection;
 import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.javaagent.Agent;
 import org.apache.openejb.core.ConnectorReference;
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.TransactionManagerWrapper;
@@ -28,6 +29,8 @@
 import org.apache.openejb.persistence.GlobalJndiDataSourceResolver;
 import org.apache.openejb.persistence.PersistenceDeployer;
 import org.apache.openejb.persistence.PersistenceDeployerException;
+import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
+import org.apache.openejb.core.TemporaryClassLoader;
 import org.apache.openejb.spi.SecurityService;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.OpenEJBErrorHandler;
@@ -51,6 +54,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.lang.instrument.ClassFileTransformer;
 
 public class Assembler extends AssemblerTool implements org.apache.openejb.spi.Assembler {
 
@@ -92,7 +96,9 @@
 
         /* Get Configuration ////////////////////////////*/
         String className = props.getProperty(EnvProps.CONFIGURATION_FACTORY);
-        if (className == null) className = props.getProperty("openejb.configurator", "org.apache.openejb.alt.config.ConfigurationFactory");
+        if (className == null) {
+            className = props.getProperty("openejb.configurator", "org.apache.openejb.alt.config.ConfigurationFactory");
+        }
 
         OpenEjbConfigurationFactory configFactory = (OpenEjbConfigurationFactory) toolkit.newInstance(className);
         configFactory.init(props);
@@ -114,23 +120,23 @@
         /*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
     }
 
-    private static ThreadLocal context = new ThreadLocal();
+    private static ThreadLocal<Map<String, Object>> context = new ThreadLocal<Map<String, Object>>();
 
-    public static void setContext(HashMap map) {
+    public static void setContext(Map<String, Object> map) {
         context.set(map);
     }
 
-    public static HashMap getContext() {
-        HashMap map = (HashMap) context.get();
+    public static Map<String, Object> getContext() {
+        Map<String, Object> map = context.get();
         if (map == null){
-            map = new HashMap();
+            map = new HashMap<String, Object>();
             context.set(map);
         }
         return map;
     }
 
     public void build() throws OpenEJBException {
-        setContext(new HashMap());
+        setContext(new HashMap<String, Object>());
         try {
             containerSystem = buildContainerSystem(config);
         } catch (OpenEJBException ae) {
@@ -210,7 +216,7 @@
         createSecurityService(configInfo);
 
         /*[6] Assemble Connector(s) //////////////////////////////////////////*/
-        HashMap connectionManagerMap = new HashMap();
+        Map<String, ConnectionManager> connectionManagerMap = new HashMap<String, ConnectionManager>();
         // connectors are optional in the openejb_config.dtd
         for (ConnectionManagerInfo cmInfo : configInfo.facilities.connectionManagers) {
             ConnectionManager connectionManager = assembleConnectionManager(cmInfo);
@@ -219,9 +225,10 @@
 
         // connectors are optional in the openejb_config.dtd
         for (ConnectorInfo conInfo : configInfo.facilities.connectors) {
-            ConnectionManager connectionManager = (ConnectionManager) connectionManagerMap.get(conInfo.connectionManagerId);
-            if (connectionManager == null)
+            ConnectionManager connectionManager = connectionManagerMap.get(conInfo.connectionManagerId);
+            if (connectionManager == null) {
                 throw new RuntimeException(INVALID_CONNECTION_MANAGER_ERROR + conInfo.connectorId);
+            }
 
             ManagedConnectionFactory managedConnectionFactory = assembleManagedConnectionFactory(conInfo.managedConnectionFactory);
 
@@ -232,37 +239,58 @@
 
         JndiBuilder jndiBuilder = new JndiBuilder(containerSystem.getJNDIContext());
 
+        PersistenceClassLoaderHandler persistenceClassLoaderHandler = new PersistenceClassLoaderHandler() {
+            public void addTransformer(ClassLoader classLoader, ClassFileTransformer classFileTransformer) {
+                Agent.getInstrumentation().addTransformer(classFileTransformer);
+            }
+
+            public ClassLoader getNewTempClassLoader(ClassLoader classLoader) {
+                return new TemporaryClassLoader(classLoader);
+            }
+        };
+
+
         HashMap<String, DeploymentInfo> deployments2 = new HashMap<String, DeploymentInfo>();
         for (AppInfo appInfo : containerSystemInfo.applications) {
             List<URL> jars = new ArrayList<URL>();
-            for (EjbJarInfo info : appInfo.ejbJars) jars.add(toUrl(info.jarPath));
-            for (ClientInfo info : appInfo.clients) jars.add(toUrl(info.codebase));
-            for (String jarPath : appInfo.libs) jars.add(toUrl(jarPath));
+            for (EjbJarInfo info : appInfo.ejbJars) {
+                jars.add(toUrl(info.jarPath));
+            }
+            for (ClientInfo info : appInfo.clients) {
+                jars.add(toUrl(info.codebase));
+            }
+            for (String jarPath : appInfo.libs) {
+                jars.add(toUrl(jarPath));
+            }
 
+            // Create the class loader
             ClassLoader classLoader = new URLClassLoader(jars.toArray(new URL[]{}), org.apache.openejb.OpenEJB.class.getClassLoader());
 
-            EjbJarBuilder ejbJarBuilder = new EjbJarBuilder(classLoader);
-            HashMap<String, Map> allFactories = new HashMap();
+            // JPA - Persistence Units MUST be processed first since they will add ClassFileTransformers
+            // to the class loader which must be added before any classes are loaded
+            HashMap<String, Map<String, EntityManagerFactory>> allFactories = new HashMap<String, Map<String, EntityManagerFactory>>();
             for (EjbJarInfo ejbJar : appInfo.ejbJars) {
-            	PersistenceDeployer pm = null;        
-                Map<String, EntityManagerFactory> factories = null;
                 try {
-                	pm = new PersistenceDeployer(new GlobalJndiDataSourceResolver(null));
-                	URL url = new File(ejbJar.jarPath).toURL();
-                	ClassLoader tmpClassLoader = new URLClassLoader(new URL[]{url}, classLoader);
-                	ResourceFinder resourceFinder = new ResourceFinder("",tmpClassLoader,url);        	
-                	factories = pm.deploy(resourceFinder.findAll("META-INF/persistence.xml"),classLoader);
-        		} catch (PersistenceDeployerException e1) {
-        			throw new OpenEJBException(e1);			
-        		} catch (IOException e) {
-        			throw new OpenEJBException(e);
-        		}
-        		allFactories.put(ejbJar.jarPath,factories);                
-            }            
-            for (EjbJarInfo ejbJar : appInfo.ejbJars) {            	
+                    URL url = new File(ejbJar.jarPath).toURL();
+                    ResourceFinder resourceFinder = new ResourceFinder("", classLoader, url);
+
+                    PersistenceDeployer persistenceDeployer = new PersistenceDeployer(new GlobalJndiDataSourceResolver(null), persistenceClassLoaderHandler);
+                    Map<String, EntityManagerFactory> factories = persistenceDeployer.deploy(resourceFinder.findAll("META-INF/persistence.xml"), classLoader);
+                    allFactories.put(ejbJar.jarPath, factories);
+                } catch (PersistenceDeployerException e1) {
+                    throw new OpenEJBException(e1);
+                } catch (IOException e) {
+                    throw new OpenEJBException(e);
+                }
+            }
+
+            // EJB
+            EjbJarBuilder ejbJarBuilder = new EjbJarBuilder(classLoader);
+            for (EjbJarInfo ejbJar : appInfo.ejbJars) {
                 deployments2.putAll(ejbJarBuilder.build(ejbJar,allFactories));
             }
 
+            // App Client
             for (ClientInfo clientInfo : appInfo.clients) {
                 JndiEncBuilder jndiEncBuilder = new JndiEncBuilder(clientInfo.jndiEnc);
                 Context context = (Context) jndiEncBuilder.build().lookup("env");
@@ -290,7 +318,7 @@
             }
         }
 
-
+        // Containers
         ContainersBuilder containersBuilder = new ContainersBuilder(containerSystemInfo, ((AssemblerTool)this).props);
         List containers = (List) containersBuilder.buildContainers(deployments2);
         for (int i1 = 0; i1 < containers.size(); i1++) {
@@ -304,7 +332,7 @@
             }
         }
 
-        // roleMapping used later in buildMethodPermissions
+        // Security  - roleMapping used later in buildMethodPermissions
         AssemblerTool.RoleMapping roleMapping = new AssemblerTool.RoleMapping(configInfo.facilities.securityService.roleMappings);
         org.apache.openejb.DeploymentInfo [] deployments = containerSystem.deployments();
         for (int i = 0; i < deployments.length; i++) {
@@ -312,19 +340,21 @@
             applyTransactionAttributes((org.apache.openejb.core.CoreDeploymentInfo) deployments[i], containerSystemInfo.methodTransactions);
         }
 
+        // Security - apply role mappings
         for (ContainerInfo container : containerSystemInfo.containers) {
             for (EnterpriseBeanInfo beanInfo : container.ejbeans) {
                 CoreDeploymentInfo deployment = (CoreDeploymentInfo) containerSystem.getDeploymentInfo(beanInfo.ejbDeploymentId);
                 applySecurityRoleReference(deployment, beanInfo, roleMapping);
             }
         }
+
         /*[4]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
         for (JndiContextInfo contextInfo : configInfo.facilities.remoteJndiContexts) {
             javax.naming.InitialContext cntx = assembleRemoteJndiContext(contextInfo);
             containerSystem.getJNDIContext().bind("java:openejb/remote_jndi_contexts/" + contextInfo.jndiContextId, cntx);
         }
 
-        return containerSystem;
+       return containerSystem;
     }
 
     private URL toUrl(String jarPath) throws OpenEJBException {
@@ -359,5 +389,4 @@
         SystemInstance.get().setComponent(TransactionManager.class, transactionManager);
         containerSystem.getJNDIContext().bind("java:openejb/TransactionManager", transactionManager);
     }
-        
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java Fri Dec 29 17:40:06 2006
@@ -22,6 +22,7 @@
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.util.Messages;
 
+import javax.persistence.EntityManagerFactory;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -37,7 +38,7 @@
         this.classLoader = classLoader;
     }
 
-    public HashMap<String, DeploymentInfo> build(EjbJarInfo ejbJar,HashMap<String, Map> allFactories) throws OpenEJBException {
+    public HashMap<String, DeploymentInfo> build(EjbJarInfo ejbJar, Map<String, Map<String, EntityManagerFactory>> allFactories) throws OpenEJBException {
         HashMap<String, DeploymentInfo> deployments = new HashMap<String, DeploymentInfo>();
         
         

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java Fri Dec 29 17:40:06 2006
@@ -27,11 +27,9 @@
 import org.apache.openejb.util.Messages;
 import org.apache.openejb.util.SafeToolkit;
 
+import javax.persistence.EntityManagerFactory;
 import java.io.File;
 import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -42,10 +40,10 @@
     private final List<InterceptorInfo> defaultInterceptors;
     private final BeanType ejbType;
     private final ClassLoader cl;
-    private final Map<String, Map> factories;
+    private final Map<String, Map<String, EntityManagerFactory>> factories;
     private List<Exception> warnings = new ArrayList<Exception>();
 
-    public EnterpriseBeanBuilder(ClassLoader cl, EnterpriseBeanInfo bean, List<InterceptorInfo> defaultInterceptors, Map<String, Map> factories) {
+    public EnterpriseBeanBuilder(ClassLoader cl, EnterpriseBeanInfo bean, List<InterceptorInfo> defaultInterceptors, Map<String, Map<String, EntityManagerFactory>> factories) {
         this.bean = bean;
         this.defaultInterceptors = defaultInterceptors;
 
@@ -63,29 +61,6 @@
         }
         this.cl = cl;
         this.factories = factories;
-    }
-
-    static class Loader {
-        protected static final Messages messages = new Messages("org.apache.openejb.util.resources");
-        private final ClassLoader classLoader;
-        private final String ejbDeploymentId;
-
-        public Loader(String codebase, String ejbDeploymentId) throws OpenEJBException {
-            try {
-                this.classLoader = new URLClassLoader(new URL[]{new File(codebase).toURL()});
-            } catch (MalformedURLException e) {
-                throw new OpenEJBException(messages.format("cl0001", codebase, e.getMessage()));
-            }
-            this.ejbDeploymentId = ejbDeploymentId;
-        }
-
-        public Class load(String className, String artifact) throws OpenEJBException {
-            try {
-                return classLoader.loadClass(className);
-            } catch (ClassNotFoundException e) {
-                throw new OpenEJBException(messages.format("classNotFound." + artifact, className, ejbDeploymentId, e.getMessage()));
-            }
-        }
     }
 
     public Object build() throws OpenEJBException {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java Fri Dec 29 17:40:06 2006
@@ -16,19 +16,6 @@
  */
 package org.apache.openejb.assembler.classic;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.persistence.EntityManagerFactory;
-import javax.transaction.TransactionManager;
-import javax.transaction.UserTransaction;
-
 import org.apache.openejb.BeanType;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.core.CoreUserTransaction;
@@ -40,6 +27,16 @@
 import org.apache.openejb.core.ivm.naming.PersistenceUnitReference;
 import org.apache.openejb.core.ivm.naming.Reference;
 
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.persistence.EntityManagerFactory;
+import javax.transaction.TransactionManager;
+import javax.transaction.UserTransaction;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
 /**
  * TODO: This class is essentially an over glorified sym-linker.  The names
  * we were linking to are no longer guaranteed to be what we assume them to
@@ -57,7 +54,7 @@
     private final ResourceReferenceInfo[] resourceRefs;
     private final PersistenceUnitInfo[] persistenceUnitRefs;
     private final Map<String, EntityManagerFactory> entityManagerFactories;
-    private final Map<String, Map> allFactories;
+    private final Map<String, Map<String, EntityManagerFactory>> allFactories;
     private final String jarPath;
     
 
@@ -65,7 +62,7 @@
         this(jndiEnc, null, null, null,null);
     }
 
-    public JndiEncBuilder(JndiEncInfo jndiEnc, String transactionType, BeanType ejbType, Map<String, Map> allFactories,String path) throws OpenEJBException {
+    public JndiEncBuilder(JndiEncInfo jndiEnc, String transactionType, BeanType ejbType, Map<String, Map<String, EntityManagerFactory>> allFactories,String path) throws OpenEJBException {
         if (ejbType == null){
             referenceWrapper = new DefaultReferenceWrapper();
         } else if (ejbType.isEntity()) {
@@ -115,7 +112,7 @@
         if(allFactories != null){
         	this.allFactories = allFactories;
         } else {
-        	this.allFactories = new HashMap();
+        	this.allFactories = new HashMap<String, Map<String, EntityManagerFactory>>();
         }    
         
         this.jarPath = path;    
@@ -123,7 +120,7 @@
         if(this.allFactories.get(jarPath) != null){
         	entityManagerFactories = this.allFactories.get(jarPath);
         } else {
-        	entityManagerFactories = new HashMap();
+        	entityManagerFactories = new HashMap<String, EntityManagerFactory>();
         }
     }
 
@@ -352,14 +349,8 @@
      * This method will currently support paths like ../../xyz/ejbmodule.jar#PuName, ././xyz/ejbmodule.jar#PuName
      * and ejbmodule.jar#PuName. For all other types of path it will throw an exception stating an invalid
      * path.The paths are calculated relative to the referencing component jar. See 16.10.2 in ejb core spec.
-     * 
-     * @param allFactories
-     * @param path
-     * @param relativePath
-     * @return
-     * @throws OpenEJBException
      */
-    private EntityManagerFactory findEntityManagerFactory(Map<String, Map> allFactories, String path, String puName) throws OpenEJBException{
+    private EntityManagerFactory findEntityManagerFactory(Map<String, Map<String, EntityManagerFactory>> allFactories, String path, String puName) throws OpenEJBException{
     	int index = puName.indexOf("#");
     	String relativePath = puName.substring(0,index);
     	String unitName = puName.substring(index+1,puName.length());

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/DeploymentsFactory.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/DeploymentsFactory.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/DeploymentsFactory.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/spring/DeploymentsFactory.java Fri Dec 29 17:40:06 2006
@@ -26,7 +26,6 @@
 import org.apache.openejb.alt.config.ejb.EjbDeployment;
 import org.apache.openejb.assembler.classic.EjbJarBuilder;
 import org.apache.openejb.assembler.classic.EjbJarInfo;
-import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.persistence.GlobalJndiDataSourceResolver;
 import org.apache.openejb.persistence.PersistenceDeployer;
 import org.apache.openejb.persistence.PersistenceDeployerException;
@@ -38,7 +37,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
-import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -104,7 +102,7 @@
         if (deployments != null){
             return deployments;
         }
-        HashMap context = new HashMap();
+        Map<String, Object> context = new HashMap<String, Object>();
         context.put(TransactionManager.class.getName(), transactionManager);
         org.apache.openejb.assembler.classic.Assembler.setContext(context);
 
@@ -116,28 +114,26 @@
         ClassLoader classLoader = (value instanceof ClassLoader) ? (ClassLoader) value : Thread.currentThread().getContextClassLoader();
         EjbJarBuilder builder = new EjbJarBuilder(classLoader);
 
-        deployments = new HashMap();
-        HashMap<String, Map> allFactories = new HashMap();
+        deployments = new HashMap<String, DeploymentInfo>();
+        Map<String, Map<String, EntityManagerFactory>> allFactories = new HashMap<String, Map<String, EntityManagerFactory>>();
         for (DeploymentModule module : deployedJars) {
             if (!(module instanceof EjbModule)) {
                 continue;
             }
-            EjbModule jar = (EjbModule) module;
-        	PersistenceDeployer pm = null;        
-            Map<String, EntityManagerFactory> factories = null;
             try {
-            	pm = new PersistenceDeployer(new GlobalJndiDataSourceResolver(null));
-            	URL url = new File(jar.getJarURI()).toURL();
-            	ClassLoader tmpClassLoader = new URLClassLoader(new URL[]{url}, classLoader);
-            	ResourceFinder resourceFinder = new ResourceFinder("",tmpClassLoader,url);        	
-            	factories = pm.deploy(resourceFinder.findAll("META-INF/persistence.xml"),classLoader);
-    		} catch (PersistenceDeployerException e1) {
-    			throw new OpenEJBException(e1);			
-    		} catch (IOException e) {
-    			throw new OpenEJBException(e);
-    		}
-    		allFactories.put(jar.getJarURI(),factories);                
-        }            
+                EjbModule jar = (EjbModule) module;
+                URL url = new File(jar.getJarURI()).toURL();
+                ResourceFinder resourceFinder = new ResourceFinder("", classLoader, url);
+
+                PersistenceDeployer persistenceDeployer = new PersistenceDeployer(new GlobalJndiDataSourceResolver(null), null);
+                Map<String, EntityManagerFactory> factories = persistenceDeployer.deploy(resourceFinder.findAll("META-INF/persistence.xml"), classLoader);
+                allFactories.put(jar.getJarURI(), factories);
+            } catch (PersistenceDeployerException e1) {
+                throw new OpenEJBException(e1);
+            } catch (IOException e) {
+                throw new OpenEJBException(e);
+            }
+        }
 
         for (DeploymentModule module : deployedJars) {
             if (!(module instanceof EjbModule)) {
@@ -158,7 +154,7 @@
             HashMap<String, DeploymentInfo> ejbs = builder.build(jarInfo,allFactories);
 
             for (EjbDeployment data : jar.getOpenejbJar().getEjbDeployment()) {
-                ((CoreDeploymentInfo)ejbs.get(data.getDeploymentId())).setContainer(new ContainerPointer(data.getContainerId()));
+                (ejbs.get(data.getDeploymentId())).setContainer(new ContainerPointer(data.getContainerId()));
             }
 
             deployments.putAll(ejbs);
@@ -168,7 +164,7 @@
     }
 
     private void transferMethodTransactionInfos(EjbJarInfoBuilder infoBuilder) {
-        List<MethodTransactionInfo> infos = new ArrayList();
+        List<MethodTransactionInfo> infos = new ArrayList<MethodTransactionInfo>();
         if (assembly.getMethodTransactions() != null){
             infos.addAll(Arrays.asList(assembly.getMethodTransactions()));
         }
@@ -179,7 +175,7 @@
     }
 
     private void transferMethodPermissionInfos(EjbJarInfoBuilder infoBuilder) {
-        List<MethodPermissionInfo> infos = new ArrayList();
+        List<MethodPermissionInfo> infos = new ArrayList<MethodPermissionInfo>();
         if (assembly.getMethodPermissions() != null){
             infos.addAll(Arrays.asList(assembly.getMethodPermissions()));
         }

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/TemporaryClassLoader.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/TemporaryClassLoader.java?view=auto&rev=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/TemporaryClassLoader.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/TemporaryClassLoader.java Fri Dec 29 17:40:06 2006
@@ -0,0 +1,145 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.core;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.URLStreamHandlerFactory;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.commons.EmptyVisitor;
+
+/**
+ * ClassLoader implementation that allows classes to be temporarily
+ * loaded and then thrown away. Useful for verifying and inspecting
+ * a class without first loading(and thus polluting) the parent
+ * ClassLoader.
+ * </p>
+ * This class is a proper subclass of URLClassLoader.  This class
+ * will locally load any class except for those defined in the
+ * java.*, javax.* and sun.* packages and annotations all of which
+ * are loaded by with
+ * <code>Class.forName(name, resolve, getClass().getClassLoader())</code>
+ * @author Marc Prud'hommeaux
+ */
+// Note: this class is a fork from OpenJPA
+public class TemporaryClassLoader extends URLClassLoader {
+    public TemporaryClassLoader(ClassLoader parent) {
+        super(new URL[0], parent);
+    }
+
+    public TemporaryClassLoader(URL[] urls, ClassLoader parent) {
+        super(urls, parent);
+    }
+
+    public TemporaryClassLoader(URL[] urls) {
+        super(urls);
+    }
+
+    public TemporaryClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) {
+        super(urls, parent, factory);
+    }
+
+    public Class loadClass(String name) throws ClassNotFoundException {
+        return loadClass(name, false);
+    }
+
+    protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+        // see if we've already loaded it
+        Class c = findLoadedClass(name);
+        if (c != null) {
+            return c;
+        }
+
+        // bug #283. defer to system if the name is a protected name.
+        // "sun." is required for JDK 1.4, which has an access check for
+        // sun.reflect.GeneratedSerializationConstructorAccessor1
+        if (name.startsWith("java.") ||
+                name.startsWith("javax.") ||
+                name.startsWith("sun.")) {
+            return Class.forName(name, resolve, getClass().getClassLoader());
+        }
+
+        String resourceName = name.replace('.', '/') + ".class";
+        InputStream in = getResourceAsStream(resourceName);
+        if (in == null) {
+            throw new ClassNotFoundException(name);
+        }
+
+        // 80% of class files are smaller then 6k
+        ByteArrayOutputStream bout = new ByteArrayOutputStream(8 * 1024);
+
+        // copy the input stream into a byte array
+        byte[] bytes = new byte[0];
+        try {
+            byte[] buf = new byte[4 * 1024];
+            for (int count = -1; (count = in.read(buf)) >= 0;) {
+                bout.write(buf, 0, count);
+            }
+            bytes = bout.toByteArray();
+        } catch (IOException e) {
+            throw new ClassNotFoundException(name, e);
+        }
+
+        // Annotation classes must be loaded by the normal classloader
+        if (isAnnotationClass(bytes)) {
+            return Class.forName(name, resolve, getClass().getClassLoader());
+        }
+
+        // define the package
+        int packageEndIndex = name.lastIndexOf('.');
+        if (packageEndIndex != -1) {
+            String packageName = name.substring(0, packageEndIndex);
+            if (getPackage(packageName) == null) {
+                definePackage(packageName, null, null, null, null, null, null, null);
+            }
+        }
+
+        // define the class
+        try {
+            return defineClass(name, bytes, 0, bytes.length);
+        } catch (SecurityException e) {
+            // possible prohibited package: defer to the parent
+            return super.loadClass(name, resolve);
+        }
+    }
+
+    /**
+     * Fast-parse the given class bytecode to determine if it is an
+     * annotation class.
+     */
+    private static boolean isAnnotationClass(byte[] bytes) {
+        IsAnnotationVisitor isAnnotationVisitor = new IsAnnotationVisitor();
+        ClassReader classReader = new ClassReader(bytes);
+        classReader.accept(isAnnotationVisitor, true);
+        return isAnnotationVisitor.isAnnotation;
+    }
+
+    public static class IsAnnotationVisitor extends EmptyVisitor {
+        public boolean isAnnotation = false;
+
+        public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+            isAnnotation = (access & Opcodes.ACC_ANNOTATION) != 0;
+        }
+
+    }
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java Fri Dec 29 17:40:06 2006
@@ -17,7 +17,21 @@
  */
 package org.apache.openejb.core.cmp.jpa;
 
-import org.apache.openejb.OpenEJBException;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import javax.ejb.CreateException;
+import javax.ejb.EJBObject;
+import javax.ejb.EntityBean;
+import javax.ejb.FinderException;
+import javax.ejb.RemoveException;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceException;
+import javax.persistence.Query;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
 import org.apache.openejb.SystemException;
 import org.apache.openejb.alt.containers.castor_cmp11.KeyGenerator;
 import org.apache.openejb.alt.containers.castor_cmp11.KeyGeneratorFactory;
@@ -25,120 +39,53 @@
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.core.cmp.CmpCallback;
 import org.apache.openejb.core.cmp.CmpEngine;
-import org.apache.openejb.persistence.PersistenceUnitInfoImpl;
-import org.apache.openejb.resource.jdbc.JdbcConnectionFactory;
 import org.apache.openejb.util.Logger;
 import org.apache.openjpa.event.AbstractLifecycleListener;
 import org.apache.openjpa.event.LifecycleEvent;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 
-import javax.ejb.CreateException;
-import javax.ejb.EntityBean;
-import javax.ejb.FinderException;
-import javax.ejb.RemoveException;
-import javax.ejb.EJBObject;
-import javax.naming.InitialContext;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.PersistenceException;
-import javax.persistence.Query;
-import javax.persistence.spi.PersistenceProvider;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.WeakHashMap;
-
 public class JpaCmpEngine implements CmpEngine {
     private static final Logger logger = Logger.getInstance("OpenEJB", "org.apache.openejb.core.cmp");
     private static final Object[] NO_ARGS = new Object[0];
 
     private final CmpCallback cmpCallback;
     private final TransactionManager transactionManager;
-//    private final EntityManager entityManager;
 
     private final Map<Transaction, EntityManager> transactionData = new WeakHashMap<Transaction, EntityManager>();
-    private EntityManagerFactory entityManagerFactory;
 
-    public JpaCmpEngine(CmpCallback cmpCallback, TransactionManager transactionManager, String connectorName, ClassLoader classLoader) throws OpenEJBException {
+    public JpaCmpEngine(CmpCallback cmpCallback, TransactionManager transactionManager, String connectorName, ClassLoader classLoader) {
         this.cmpCallback = cmpCallback;
         this.transactionManager = transactionManager;
-
-        try {
-            JdbcConnectionFactory dataSource;
-            String jdbcName = "java:openejb/connector/" + connectorName;
-            dataSource = (JdbcConnectionFactory) new InitialContext().lookup(jdbcName);
-            if (dataSource == null) {
-                throw new OpenEJBException(jdbcName + " does not exist");
-            }
-
-            PersistenceUnitInfoImpl unitInfo = new PersistenceUnitInfoImpl();
-            unitInfo.setPersistenceUnitName("CMP");
-            unitInfo.setPersistenceProviderClassName("org.apache.openjpa.persistence.PersistenceProviderImpl");
-            unitInfo.setClassLoader(classLoader);
-            unitInfo.setExcludeUnlistedClasses(false);
-//            unitInfo.setJarFileUrls(pu.getJarFile());
-
-            unitInfo.setJtaDataSource(dataSource);
-
-//        unitInfo.setManagedClassNames(pu.getClazz());
-            unitInfo.setMappingFileNames(Collections.singletonList("META-INF/jpa.mapping.xml"));
-
-            // Handle Properties
-            Properties properties = new Properties();
-            unitInfo.setProperties(properties);
-
-            unitInfo.setTransactionType(PersistenceUnitTransactionType.JTA);
-
-            // Non JTA Datasource
-//            DataSource nonJtaDataSource = dataSourceResolver.getDataSource(dataSource);
-//            unitInfo.setNonJtaDataSource(nonJtaDataSource);
-
-//            String rootUrlPath = url.toExternalForm().replaceFirst("!?META-INF/persistence.xml$","");
-//            unitInfo.setPersistenceUnitRootUrl(new URL(rootUrlPath));
-
-            // TODO - What do we do here?
-            // unitInfo.setNewTempClassLoader(???);
-
-            String persistenceProviderClassName = unitInfo.getPersistenceProviderClassName();
-            Class clazz = classLoader.loadClass(persistenceProviderClassName);
-            PersistenceProvider persistenceProvider = (PersistenceProvider) clazz.newInstance();
-            entityManagerFactory = persistenceProvider.createContainerEntityManagerFactory(unitInfo, new HashMap());
-        } catch (Exception e) {
-            throw new OpenEJBException(e);
-        }
     }
 
     public void deploy(CoreDeploymentInfo deploymentInfo) throws SystemException {
         configureKeyGenerator(deploymentInfo);
     }
 
-    private EntityManager getEntityManager() {
+    private EntityManager getEntityManager(CoreDeploymentInfo deploymentInfo) {
         try {
             Transaction transaction = transactionManager.getTransaction();
             EntityManager entityManager = transactionData.get(transaction);
             if (entityManager == null) {
+                EntityManagerFactory entityManagerFactory = (EntityManagerFactory) deploymentInfo.getJndiEnc().lookup("env/openejb/cmp");
+
                 // todo close entityManager when tx completes
                 entityManager = entityManagerFactory.createEntityManager();
                 if (entityManager instanceof OpenJPAEntityManager) {
                     OpenJPAEntityManager openjpaEM = (OpenJPAEntityManager) entityManager;
                     openjpaEM.addLifecycleListener(new OpenJPALifecycleListener(), (Class[])null);
                 }
-//                entityManager.joinTransaction();
                 transactionData.put(transaction, entityManager);
             }
             return entityManager;
-        } catch (javax.transaction.SystemException e) {
+        } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
 
     public Object createBean(EntityBean bean, ThreadContext callContext) throws CreateException {
-        EntityManager entityManager = getEntityManager();
+        CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+        EntityManager entityManager = getEntityManager(deploymentInfo);
 
         // TODO verify that extract primary key requires a flush followed by a merge
         entityManager.persist(bean);
@@ -146,7 +93,6 @@
         bean = entityManager.merge(bean);
 
         // extract the primary key from the bean
-        CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
         KeyGenerator kg = deploymentInfo.getKeyGenerator();
         Object primaryKey = kg.getPrimaryKey(bean);
 
@@ -154,23 +100,26 @@
     }
 
     public Object loadBean(ThreadContext callContext, Object primaryKey) {
-        Class<?> beanClass = callContext.getDeploymentInfo().getBeanClass();
-        EntityManager entityManager = getEntityManager();
+        CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+        Class<?> beanClass = deploymentInfo.getBeanClass();
+        EntityManager entityManager = getEntityManager(deploymentInfo);
         Object bean = entityManager.find(beanClass, primaryKey);
         return bean;
     }
 
     public void removeBean(ThreadContext callContext) {
-        Class<?> beanClass = callContext.getDeploymentInfo().getBeanClass();
+        CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+        Class<?> beanClass = deploymentInfo.getBeanClass();
 
-        EntityManager entityManager = getEntityManager();
+        EntityManager entityManager = getEntityManager(deploymentInfo);
         Object bean = entityManager.find(beanClass, callContext.getPrimaryKey());
         entityManager.remove(bean);
     }
 
     public List<Object> queryBeans(ThreadContext callContext, String queryString, Object[] args) throws FinderException {
         logger.error("Executing query " + queryString);
-        EntityManager entityManager = getEntityManager();
+        CoreDeploymentInfo deploymentInfo = callContext.getDeploymentInfo();
+        EntityManager entityManager = getEntityManager(deploymentInfo);
         Query query = entityManager.createQuery(queryString);
         // process args
         if (args == null) {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/IvmContext.java Fri Dec 29 17:40:06 2006
@@ -17,6 +17,12 @@
 package org.apache.openejb.core.ivm.naming;
 
 import java.io.ObjectStreamException;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.Serializable;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -24,6 +30,8 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.Vector;
+import java.util.Properties;
+import java.net.URL;
 
 import javax.naming.Binding;
 import javax.naming.CompositeName;
@@ -38,8 +46,6 @@
 
 import org.apache.openejb.ClassLoaderUtil;
 
-import com.sun.naming.internal.ResourceManager;
-
 /*
 * This class wrappers a specific NameNode which is the data model for the JNDI
 * name space. This class provides javax.naming.Context specific functionality
@@ -49,7 +55,8 @@
 /**
  * @org.apache.xbean.XBean element="ivmContext"
  */
-public class IvmContext implements Context, java.io.Serializable {
+public class IvmContext implements Context, Serializable {
+    private static final long serialVersionUID = -626353930051783641L;
     Hashtable myEnv;
     boolean readOnly = false;
     HashMap fastCache = new HashMap();
@@ -157,16 +164,14 @@
 
     public static ObjectFactory [] getFederatedFactories() throws NamingException {
         if (federatedFactories == null) {
-            Set factories = new HashSet();
-            Hashtable jndiProps = ResourceManager.getInitialEnvironment(null);
-            String pkgs = (String) jndiProps.get(Context.URL_PKG_PREFIXES);
-            if (pkgs == null) {
+            Set<ObjectFactory> factories = new HashSet<ObjectFactory>();
+            String urlPackagePrefixes = getUrlPackagePrefixes();
+            if (urlPackagePrefixes == null) {
                 return new ObjectFactory[0];
             }
-            StringTokenizer parser = new StringTokenizer(pkgs, ":");
-
-            while (parser.hasMoreTokens()) {
-                String className = parser.nextToken() + ".java.javaURLContextFactory";
+            for (StringTokenizer tokenizer = new StringTokenizer(urlPackagePrefixes, ":"); tokenizer.hasMoreTokens();) {
+                String urlPackagePrefix = tokenizer.nextToken();
+                String className = urlPackagePrefix + ".java.javaURLContextFactory";
                 if (className.equals("org.apache.openejb.core.ivm.naming.java.javaURLContextFactory"))
                     continue;
                 try {
@@ -189,6 +194,53 @@
         return federatedFactories;
     }
 
+    private static String getUrlPackagePrefixes() {
+        // 1. System.getProperty
+        String urlPackagePrefixes = System.getProperty(Context.URL_PKG_PREFIXES);
+
+        // 2. Thread.currentThread().getContextClassLoader().getResources("jndi.properties")
+        if (urlPackagePrefixes == null) {
+            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+            if (classLoader == null) classLoader = ClassLoader.getSystemClassLoader();
+
+            try {
+                Enumeration<URL> resources = classLoader.getResources("jndi.properties");
+                while (urlPackagePrefixes == null && resources.hasMoreElements()) {
+                    URL resource = resources.nextElement();
+                    InputStream in = resource.openStream();
+                    urlPackagePrefixes = getUrlPackagePrefixes(in);
+                }
+            } catch (IOException ignored) {
+            }
+        }
+
+        // 3. ${java.home}/lib/jndi.properties
+        if (urlPackagePrefixes == null) {
+            String javahome = System.getProperty("java.home");
+            if (javahome != null) {
+                try {
+                    File propertiesFile = new File(new File(javahome, "lib"), "jndi.properties");
+                    InputStream in = new FileInputStream(propertiesFile);
+                    urlPackagePrefixes = getUrlPackagePrefixes(in);
+                } catch (FileNotFoundException ignored) {
+                }
+            }
+
+        }
+        return urlPackagePrefixes;
+    }
+
+    private static String getUrlPackagePrefixes(InputStream in) {
+        try {
+            Properties properties = new Properties();
+            properties.load(in);
+            String urlPackagePrefixes = properties.getProperty(Context.URL_PKG_PREFIXES);
+            return urlPackagePrefixes;
+        } catch (IOException e) {
+            return null;
+        }
+    }
+
     public Object lookup(Name compositName) throws NamingException {
         return lookup(compositName.toString());
     }
@@ -239,7 +291,7 @@
         rename(oldname.toString(), newname.toString());
     }
 
-    public NamingEnumeration list(String name)
+    public NamingEnumeration<NameClassPair> list(String name)
             throws NamingException {
         Object obj = lookup(name);
         if (obj.getClass() == IvmContext.class)
@@ -249,12 +301,12 @@
         }
     }
 
-    public NamingEnumeration list(Name name)
+    public NamingEnumeration<NameClassPair> list(Name name)
             throws NamingException {
         return list(name.toString());
     }
 
-    public NamingEnumeration listBindings(String name)
+    public NamingEnumeration<Binding> listBindings(String name)
             throws NamingException {
         Object obj = lookup(name);
         if (obj.getClass() == IvmContext.class)
@@ -264,7 +316,7 @@
         }
     }
 
-    public NamingEnumeration listBindings(Name name)
+    public NamingEnumeration<Binding> listBindings(Name name)
             throws NamingException {
         return listBindings(name.toString());
     }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/PersistenceUnitReference.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/PersistenceUnitReference.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/PersistenceUnitReference.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/PersistenceUnitReference.java Fri Dec 29 17:40:06 2006
@@ -24,7 +24,7 @@
  */
 public class PersistenceUnitReference implements Reference{
 
-	private static EntityManagerFactory emf;
+	private EntityManagerFactory emf;
 	
 	public PersistenceUnitReference(EntityManagerFactory emf) {
 		this.emf = emf;		

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SafeToolkit.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SafeToolkit.java?view=diff&rev=491149&r1=491148&r2=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SafeToolkit.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/SafeToolkit.java Fri Dec 29 17:40:06 2006
@@ -22,48 +22,23 @@
 import java.util.Properties;
 
 public class SafeToolkit {
-
-    private String systemLocation;
     public static final Messages messages = new Messages("org.apache.openejb.util.resources");
     public static final HashMap codebases = new HashMap();
 
-    protected SafeToolkit(String systemLocation) {
-        this.systemLocation = systemLocation;
-    }
-
     public static SafeToolkit getToolkit(String systemLocation) {
         return new SafeToolkit(systemLocation);
     }
 
-    public Class forName(String className) throws OpenEJBException {
-        Class clazz = null;
-        try {
-            clazz = Class.forName(className);
-        } catch (ClassNotFoundException cnfe) {
-            OpenEJBErrorHandler.classNotFound(systemLocation, className);
-        }
-        return clazz;
-    }
-
-    public Class forName(String className, String codebase) throws OpenEJBException {
-
-        ClassLoader cl = getContextClassLoader();
+    private String systemLocation;
 
-        if (codebase != null) {
-            try {
-                java.net.URL[] urlCodebase = new java.net.URL[1];
-                urlCodebase[0] = new java.net.URL(codebase);
-                cl = new java.net.URLClassLoader(urlCodebase, cl);
-            } catch (java.net.MalformedURLException mue) {
-                OpenEJBErrorHandler.classCodebaseNotFound(systemLocation, className, codebase, mue);
-            } catch (SecurityException se) {
-                OpenEJBErrorHandler.classCodebaseNotFound(systemLocation, className, codebase, se);
-            }
-        }
+    private SafeToolkit(String systemLocation) {
+        this.systemLocation = systemLocation;
+    }
 
+    private Class forName(String className) throws OpenEJBException {
         Class clazz = null;
         try {
-            clazz = Class.forName(className, true, cl);
+            clazz = Class.forName(className);
         } catch (ClassNotFoundException cnfe) {
             OpenEJBErrorHandler.classNotFound(systemLocation, className);
         }
@@ -74,10 +49,6 @@
         return newInstance(forName(className));
     }
 
-    public Object newInstance(String className, String codebase) throws OpenEJBException {
-        return newInstance(forName(className, codebase));
-    }
-
     public Object newInstance(Class clazz) throws OpenEJBException {
         Object instance = null;
         try {
@@ -110,7 +81,7 @@
         return loadClass(className, codebase, true);
     }
 
-    public static Class loadClass(String className, String codebase, boolean cache) throws OpenEJBException {
+    private static Class loadClass(String className, String codebase, boolean cache) throws OpenEJBException {
 
         ClassLoader cl = (cache) ? getCodebaseClassLoader(codebase) : getClassLoader(codebase);
         Class clazz = null;
@@ -122,7 +93,7 @@
         return clazz;
     }
 
-    public static ClassLoader getCodebaseClassLoader(String codebase) throws OpenEJBException {
+    private static ClassLoader getCodebaseClassLoader(String codebase) throws OpenEJBException {
         if (codebase == null) codebase = "CLASSPATH";
 
         ClassLoader cl = (ClassLoader) codebases.get(codebase);
@@ -148,7 +119,7 @@
         return cl;
     }
 
-    public static ClassLoader getClassLoader(String codebase) throws OpenEJBException {
+    private static ClassLoader getClassLoader(String codebase) throws OpenEJBException {
         ClassLoader cl = null;
         try {
             java.net.URL[] urlCodebase = new java.net.URL[1];
@@ -173,13 +144,4 @@
         }
         return codebase.toString();
     }
-
-    public static ClassLoader getContextClassLoader() {
-        return (ClassLoader) java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
-            public Object run() {
-                return Thread.currentThread().getContextClassLoader();
-            }
-        });
-    }
-
 }

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/SampleAnnotation.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/SampleAnnotation.java?view=auto&rev=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/SampleAnnotation.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/SampleAnnotation.java Fri Dec 29 17:40:06 2006
@@ -0,0 +1,4 @@
+package org.apache.openejb.core;
+
+public @interface SampleAnnotation {
+}

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/TemporaryClassLoaderTest.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/TemporaryClassLoaderTest.java?view=auto&rev=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/TemporaryClassLoaderTest.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/TemporaryClassLoaderTest.java Fri Dec 29 17:40:06 2006
@@ -0,0 +1,43 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.core;
+
+import junit.framework.TestCase;
+
+public class TemporaryClassLoaderTest extends TestCase {
+    public void test() throws Exception {
+        ClassLoader tempCL = new TemporaryClassLoader(getClass().getClassLoader());
+        Class<?> clazz;
+
+        // normal classes should be loaded by the temp class loader
+        clazz = tempCL.loadClass(TemporaryClassLoaderTest.class.getName());
+        assertSame(tempCL, clazz.getClassLoader());
+
+        // classes in java.* should not be loaded by the temp class loader
+        clazz = tempCL.loadClass(javax.persistence.EntityManager.class.getName());
+        assertNotSame(tempCL, clazz.getClassLoader());
+
+        // classes in javax.* should not be loaded by the temp class loader
+        clazz = tempCL.loadClass(java.lang.String.class.getName());
+        assertNotSame(tempCL, clazz.getClassLoader());
+
+        // annotations should not be loaded by the temp class loader
+        clazz = tempCL.loadClass(SampleAnnotation.class.getName());
+        assertNotSame(tempCL, clazz.getClassLoader());
+    }
+}

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/Employee.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/Employee.java?view=auto&rev=491149
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/Employee.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/Employee.java Fri Dec 29 17:40:06 2006
@@ -0,0 +1,62 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.core.cmp.jpa;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Employee {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private int id;
+
+    @Column(name = "first_name")
+    private String firstName;
+
+    @Column(name = "last_name")
+    private String lastName;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+}