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

svn commit: r485813 - in /incubator/openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/alt/config/ container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/o...

Author: dblevins
Date: Mon Dec 11 10:57:01 2006
New Revision: 485813

URL: http://svn.apache.org/viewvc?view=rev&rev=485813
Log:
Patch from Manu George OPENEJB-383: ENC: persistence-unit-ref
Thanks Manu!

Added:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/PersistenceUnitReference.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/Customer.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/persistence.xml
Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.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/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessContainerTest.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/GlobalJndiDataSourceResolver.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceDeployer.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/stateless/EncStatelessBean.java
    incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java?view=diff&rev=485813&r1=485812&r2=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java Mon Dec 11 10:57:01 2006
@@ -31,6 +31,7 @@
 import org.apache.openejb.jee.EjbRef;
 import org.apache.openejb.jee.EnvEntry;
 import org.apache.openejb.jee.JndiConsumer;
+import org.apache.openejb.jee.PersistenceUnitRef;
 import org.apache.openejb.jee.ResourceRef;
 import org.apache.openejb.jee.Injectable;
 import org.apache.openejb.jee.InjectionTarget;
@@ -111,8 +112,13 @@
 
     private List<PersistenceUnitInfo> buildPersistenceUnitRefInfos(JndiConsumer jndiConsumer) {
         ArrayList<PersistenceUnitInfo> infos = new ArrayList<PersistenceUnitInfo>();
-        // TODO: Marshall the data over
-        return infos;
+        for (PersistenceUnitRef puRef : jndiConsumer.getPersistenceUnitRef()) {
+        	PersistenceUnitInfo info = new PersistenceUnitInfo();
+            info.referenceName = puRef.getPersistenceUnitRefName();
+            info.persistenceUnitName = puRef.getPersistenceUnitName();            
+            infos.add(info);
+        }
+        return infos;       
     }
 
     private void buildAmbiguousEjbRefInfos(JndiEncInfo jndi, JndiConsumer jndiConsumer, String referringComponent) throws OpenEJBException {

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=485813&r1=485812&r2=485813
==============================================================================
--- 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 Mon Dec 11 10:57:01 2006
@@ -16,34 +16,41 @@
  */
 package org.apache.openejb.assembler.classic;
 
-import org.apache.openejb.EnvProps;
-import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.Container;
 import org.apache.openejb.DeploymentInfo;
+import org.apache.openejb.EnvProps;
 import org.apache.openejb.Injection;
-import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.core.ConnectorReference;
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.TransactionManagerWrapper;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.persistence.GlobalJndiDataSourceResolver;
+import org.apache.openejb.persistence.PersistenceDeployer;
+import org.apache.openejb.persistence.PersistenceDeployerException;
 import org.apache.openejb.spi.SecurityService;
+import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.OpenEJBErrorHandler;
 import org.apache.openejb.util.SafeToolkit;
-import org.apache.openejb.util.Logger;
+import org.apache.xbean.finder.ResourceFinder;
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.StaticRecipe;
 
+import javax.naming.Context;
+import javax.persistence.EntityManagerFactory;
 import javax.resource.spi.ConnectionManager;
 import javax.resource.spi.ManagedConnectionFactory;
 import javax.transaction.TransactionManager;
-import javax.naming.Context;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Properties;
 import java.util.List;
-import java.net.URL;
-import java.net.MalformedURLException;
-import java.net.URLClassLoader;
-import java.io.File;
+import java.util.Map;
+import java.util.Properties;
 
 public class Assembler extends AssemblerTool implements org.apache.openejb.spi.Assembler {
 
@@ -235,9 +242,25 @@
             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();
             for (EjbJarInfo ejbJar : appInfo.ejbJars) {
-                deployments2.putAll(ejbJarBuilder.build(ejbJar));
+            	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) {            	
+                deployments2.putAll(ejbJarBuilder.build(ejbJar,allFactories));
             }
 
             for (ClientInfo clientInfo : appInfo.clients) {
@@ -336,4 +359,5 @@
         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=485813&r1=485812&r2=485813
==============================================================================
--- 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 Mon Dec 11 10:57:01 2006
@@ -17,12 +17,13 @@
  */
 package org.apache.openejb.assembler.classic;
 
-import java.util.HashMap;
-
 import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.util.Messages;
 import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.util.Messages;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @version $Revision$ $Date$
@@ -36,11 +37,13 @@
         this.classLoader = classLoader;
     }
 
-    public HashMap<String, DeploymentInfo> build(EjbJarInfo ejbJar) throws OpenEJBException {
+    public HashMap<String, DeploymentInfo> build(EjbJarInfo ejbJar,HashMap<String, Map> allFactories) throws OpenEJBException {
         HashMap<String, DeploymentInfo> deployments = new HashMap<String, DeploymentInfo>();
+        
+        
         for (EnterpriseBeanInfo ejbInfo: ejbJar.enterpriseBeans) {
-            try {
-                EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo, ejbJar.defaultInterceptors);
+            try {            	
+                EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo, ejbJar.defaultInterceptors,allFactories);
                 CoreDeploymentInfo deployment = (CoreDeploymentInfo) deploymentBuilder.build();
                 deployment.setJarPath(ejbJar.jarPath);
                 deployments.put(ejbInfo.ejbDeploymentId, deployment);

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=485813&r1=485812&r2=485813
==============================================================================
--- 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 Mon Dec 11 10:57:01 2006
@@ -16,12 +16,12 @@
  */
 package org.apache.openejb.assembler.classic;
 
-import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.SystemException;
 import org.apache.openejb.BeanType;
 import org.apache.openejb.Injection;
-import org.apache.openejb.core.DeploymentContext;
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.SystemException;
 import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.DeploymentContext;
 import org.apache.openejb.core.interceptor.InterceptorData;
 import org.apache.openejb.core.ivm.naming.IvmContext;
 import org.apache.openejb.util.Messages;
@@ -32,8 +32,9 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 class EnterpriseBeanBuilder {
     protected static final Messages messages = new Messages("org.apache.openejb.util.resources");
@@ -41,9 +42,10 @@
     private final List<InterceptorInfo> defaultInterceptors;
     private final BeanType ejbType;
     private final ClassLoader cl;
+    private final Map<String, Map> factories;
     private List<Exception> warnings = new ArrayList<Exception>();
 
-    public EnterpriseBeanBuilder(ClassLoader cl, EnterpriseBeanInfo bean, List<InterceptorInfo> defaultInterceptors) {
+    public EnterpriseBeanBuilder(ClassLoader cl, EnterpriseBeanInfo bean, List<InterceptorInfo> defaultInterceptors, Map<String, Map> factories) {
         this.bean = bean;
         this.defaultInterceptors = defaultInterceptors;
 
@@ -60,6 +62,7 @@
             throw new UnsupportedOperationException("No building support for bean type: " + bean);
         }
         this.cl = cl;
+        this.factories = factories;
     }
 
     static class Loader {
@@ -120,7 +123,7 @@
 
         final String transactionType = bean.transactionType;
 
-        JndiEncBuilder jndiEncBuilder = new JndiEncBuilder(bean.jndiEnc, transactionType, ejbType);
+        JndiEncBuilder jndiEncBuilder = new JndiEncBuilder(bean.jndiEnc, transactionType, ejbType, factories, new File(bean.codebase).getPath());
         IvmContext root = (IvmContext) jndiEncBuilder.build();
 
         DeploymentContext deploymentContext = new DeploymentContext(bean.ejbDeploymentId, ejbClass.getClassLoader(), root);

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=485813&r1=485812&r2=485813
==============================================================================
--- 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 Mon Dec 11 10:57:01 2006
@@ -16,24 +16,30 @@
  */
 package org.apache.openejb.assembler.classic;
 
-import org.apache.openejb.OpenEJBException;
+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;
 import org.apache.openejb.core.ivm.naming.IntraVmJndiReference;
 import org.apache.openejb.core.ivm.naming.IvmContext;
 import org.apache.openejb.core.ivm.naming.JndiReference;
 import org.apache.openejb.core.ivm.naming.NameNode;
 import org.apache.openejb.core.ivm.naming.ParsedName;
+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.transaction.UserTransaction;
-import javax.transaction.TransactionManager;
-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
@@ -49,12 +55,17 @@
     private final EjbLocalReferenceInfo[] ejbLocalReferences;
     private final EnvEntryInfo[] envEntries;
     private final ResourceReferenceInfo[] resourceRefs;
+    private final PersistenceUnitInfo[] persistenceUnitRefs;
+    private final Map<String, EntityManagerFactory> entityManagerFactories;
+    private final Map<String, Map> allFactories;
+    private final String jarPath;
+    
 
     public JndiEncBuilder(JndiEncInfo jndiEnc) throws OpenEJBException {
-        this(jndiEnc, null, null);
+        this(jndiEnc, null, null, null,null);
     }
 
-    public JndiEncBuilder(JndiEncInfo jndiEnc, String transactionType, BeanType ejbType) throws OpenEJBException {
+    public JndiEncBuilder(JndiEncInfo jndiEnc, String transactionType, BeanType ejbType, Map<String, Map> allFactories,String path) throws OpenEJBException {
         if (ejbType == null){
             referenceWrapper = new DefaultReferenceWrapper();
         } else if (ejbType.isEntity()) {
@@ -92,6 +103,26 @@
         } else {
             resourceRefs = new ResourceReferenceInfo[]{};
         }
+
+        if ((jndiEnc != null && jndiEnc.persistenceUnitRefs != null)) {
+        	persistenceUnitRefs = jndiEnc.persistenceUnitRefs.toArray(new PersistenceUnitInfo[0]);
+        } else {
+        	persistenceUnitRefs = new PersistenceUnitInfo[]{};
+        }      
+        
+        if(allFactories != null){
+        	this.allFactories = allFactories;
+        } else {
+        	this.allFactories = new HashMap();
+        }    
+        
+        this.jarPath = path;    
+        
+        if(this.allFactories.get(jarPath) != null){
+        	entityManagerFactories = this.allFactories.get(jarPath);
+        } else {
+        	entityManagerFactories = new HashMap();
+        }
     }
 
     public Context build() throws OpenEJBException {
@@ -200,6 +231,26 @@
             }
             bindings.put(normalize(referenceInfo.referenceName), wrapReference(reference));
         }
+        
+        for (int i = 0; i < persistenceUnitRefs.length; i++){
+        	PersistenceUnitInfo puRefInfo = persistenceUnitRefs[i];
+            Reference reference = null;
+            EntityManagerFactory factory = null;
+            if (puRefInfo.persistenceUnitName != null) {    
+            	if(puRefInfo.persistenceUnitName.indexOf("#") == -1){
+            		factory = entityManagerFactories.get(puRefInfo.persistenceUnitName);
+            	}else{
+            		factory = findEntityManagerFactory(allFactories,jarPath,puRefInfo.persistenceUnitName);
+            	}
+            }else if(entityManagerFactories.size() == 1){
+            	factory = entityManagerFactories.values().toArray(new EntityManagerFactory[1])[0];
+            }else{
+            	throw new OpenEJBException("Deployment failed as the Persistence Unit could not be located. Try adding the 'persistence-unit-name' tag in ejb-jar.xml ");
+            }
+            
+            reference = new PersistenceUnitReference(factory);
+            bindings.put(normalize(puRefInfo.referenceName), wrapReference(reference));
+        }
 
         IvmContext enc = new IvmContext(new NameNode(null, new ParsedName("comp"), null));
         try {
@@ -282,5 +333,43 @@
         Object wrap(UserTransaction reference) {
             return reference;
         }
+    }
+    
+    /**
+     * 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{
+    	int index = puName.indexOf("#");
+    	String relativePath = puName.substring(0,index);
+    	String unitName = puName.substring(index+1,puName.length());
+    	if(new File(path).isFile()){
+    		path=path.substring(0,path.lastIndexOf(File.separator));
+    	}    	
+    	while(relativePath.startsWith("../")){
+    		relativePath = relativePath.substring(3,relativePath.length());
+    		path = path.substring(0,path.lastIndexOf(File.separator));
+    	}
+    	
+    	while(relativePath.startsWith("./")){
+    		relativePath = relativePath.substring(2,relativePath.length());    		
+    	}
+    	path = path + File.separator + relativePath;    	
+		path = new File(path).getPath();		
+    	Map factories = allFactories.get(path);
+    	if (factories != null){
+    		EntityManagerFactory factory = (EntityManagerFactory)factories.get(unitName);
+    		if(factory != null){
+    			return factory;     		 
+    		}
+    	}
+    	throw new OpenEJBException("The persistence unit referred by the persistence-unit-name tag "+puName+" could not be found");   	
     }
 }

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=485813&r1=485812&r2=485813
==============================================================================
--- 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 Mon Dec 11 10:57:01 2006
@@ -17,25 +17,33 @@
  */
 package org.apache.openejb.assembler.spring;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.transaction.TransactionManager;
-
 import org.apache.openejb.DeploymentInfo;
-import org.apache.openejb.alt.config.EjbModule;
+import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.alt.config.DeploymentLoader;
-import org.apache.openejb.alt.config.EjbJarInfoBuilder;
 import org.apache.openejb.alt.config.DeploymentModule;
+import org.apache.openejb.alt.config.EjbJarInfoBuilder;
+import org.apache.openejb.alt.config.EjbModule;
 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;
+import org.apache.xbean.finder.ResourceFinder;
 import org.springframework.beans.factory.FactoryBean;
-import sun.tools.jar.resources.jar;
+
+import javax.persistence.EntityManagerFactory;
+import javax.transaction.TransactionManager;
+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;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @org.apache.xbean.XBean element="deployments"
@@ -109,6 +117,28 @@
         EjbJarBuilder builder = new EjbJarBuilder(classLoader);
 
         deployments = new HashMap();
+        HashMap<String, Map> allFactories = new HashMap();
+        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);                
+        }            
+
         for (DeploymentModule module : deployedJars) {
             if (!(module instanceof EjbModule)) {
                 continue;
@@ -125,7 +155,7 @@
             transferMethodTransactionInfos(infoBuilder);
             transferMethodPermissionInfos(infoBuilder);
 
-            HashMap<String, DeploymentInfo> ejbs = builder.build(jarInfo);
+            HashMap<String, DeploymentInfo> ejbs = builder.build(jarInfo,allFactories);
 
             for (EjbDeployment data : jar.getOpenejbJar().getEjbDeployment()) {
                 ((CoreDeploymentInfo)ejbs.get(data.getDeploymentId())).setContainer(new ContainerPointer(data.getContainerId()));

Added: 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=auto&rev=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/PersistenceUnitReference.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/PersistenceUnitReference.java Mon Dec 11 10:57:01 2006
@@ -0,0 +1,37 @@
+/**
+ * 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.ivm.naming;
+
+import javax.naming.NamingException;
+import javax.persistence.EntityManagerFactory;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class PersistenceUnitReference implements Reference{
+
+	private static EntityManagerFactory emf;
+	
+	public PersistenceUnitReference(EntityManagerFactory emf) {
+		this.emf = emf;		
+	}
+
+	public Object getObject() throws NamingException {
+	    return emf;		
+	}
+
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java?view=diff&rev=485813&r1=485812&r2=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java Mon Dec 11 10:57:01 2006
@@ -191,7 +191,7 @@
         EjbJarInfoBuilder infoBuilder = new EjbJarInfoBuilder();
         EjbJarBuilder builder = new EjbJarBuilder(this.getClass().getClassLoader());
         EjbJarInfo jarInfo = infoBuilder.buildInfo(jar);
-        HashMap<String, DeploymentInfo> ejbs = builder.build(jarInfo);
+        HashMap<String, DeploymentInfo> ejbs = builder.build(jarInfo,null);
         return ejbs;
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessContainerTest.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessContainerTest.java?view=diff&rev=485813&r1=485812&r2=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessContainerTest.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessContainerTest.java Mon Dec 11 10:57:01 2006
@@ -151,7 +151,7 @@
         EjbJarInfoBuilder infoBuilder = new EjbJarInfoBuilder();
         EjbJarBuilder builder = new EjbJarBuilder(this.getClass().getClassLoader());
         EjbJarInfo jarInfo = infoBuilder.buildInfo(jar);
-        HashMap<String, DeploymentInfo> ejbs = builder.build(jarInfo);
+        HashMap<String, DeploymentInfo> ejbs = builder.build(jarInfo,null);
         return ejbs;
     }
 

Modified: incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/GlobalJndiDataSourceResolver.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/GlobalJndiDataSourceResolver.java?view=diff&rev=485813&r1=485812&r2=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/GlobalJndiDataSourceResolver.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/GlobalJndiDataSourceResolver.java Mon Dec 11 10:57:01 2006
@@ -26,17 +26,19 @@
  * @version $Revision$ $Date$
  */
 public class GlobalJndiDataSourceResolver implements DataSourceResolver {
-    private final InitialContext initialContext;
+    private InitialContext initialContext;
+    private final Properties jndiProperties;
 
     public GlobalJndiDataSourceResolver(Properties jndiProperties) {
-        try {
+        this.jndiProperties = jndiProperties;
+    }
+
+    public DataSource getDataSource(String name) throws Exception {
+    	try {
             initialContext = new InitialContext(jndiProperties);
         } catch (NamingException ne) {
             throw new RuntimeException(ne);
         }
-    }
-
-    public DataSource getDataSource(String name) throws Exception {
         return (DataSource) initialContext.lookup(name);
     }
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceDeployer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceDeployer.java?view=diff&rev=485813&r1=485812&r2=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceDeployer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-persistence/src/main/java/org/apache/openejb/persistence/PersistenceDeployer.java Mon Dec 11 10:57:01 2006
@@ -28,6 +28,7 @@
 import java.net.URL;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -182,5 +183,19 @@
 
         return factoryList;
     }
+    
+    public Map<String, EntityManagerFactory> deploy(List<URL> urls,ClassLoader cl) throws PersistenceDeployerException {
+
+        Map<String, EntityManagerFactory> factoryList = new HashMap<String, EntityManagerFactory>();
+        // Read the persistence.xml files      
+        
+        Iterator<URL> iter = urls.iterator();
+        while (iter.hasNext()) {
+            URL url = iter.next();            
+            factoryList.putAll(loadPersistence(cl, url));               
+        }        
+        return factoryList;
+    }
+
 
 }

Added: incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/Customer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/Customer.java?view=auto&rev=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/Customer.java (added)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/Customer.java Mon Dec 11 10:57:01 2006
@@ -0,0 +1,47 @@
+/**
+ *
+ * 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.test.entity;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Customer {
+
+	private String customerName;
+	private int customerAge;
+	private int id;
+	
+	public int getId() {
+		return id;
+	}
+	public void setId(int id) {
+		this.id = id;
+	}
+	public int getCustomerAge() {
+		return customerAge;
+	}
+	public void setCustomerAge(int customerAge) {
+		this.customerAge = customerAge;
+	}
+	public String getCustomerName() {
+		return customerName;
+	}
+	public void setCustomerName(String customerName) {
+		this.customerName = customerName;
+	}
+}

Modified: incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/stateless/EncStatelessBean.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/stateless/EncStatelessBean.java?view=diff&rev=485813&r1=485812&r2=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/stateless/EncStatelessBean.java (original)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/stateless/EncStatelessBean.java Mon Dec 11 10:57:01 2006
@@ -17,10 +17,12 @@
 package org.apache.openejb.test.stateless;
 
 import java.rmi.RemoteException;
+import java.sql.Connection;
 
 import javax.ejb.EJBException;
 import javax.ejb.SessionContext;
 import javax.naming.InitialContext;
+import javax.persistence.EntityManagerFactory;
 import javax.sql.DataSource;
 
 import junit.framework.Assert;
@@ -33,33 +35,33 @@
 import org.apache.openejb.test.stateful.BasicStatefulObject;
 
 /**
- * 
+ *
  * @author <a href="mailto:david.blevins@visi.com">David Blevins</a>
  * @author <a href="mailto:Richard@Monson-Haefel.com">Richard Monson-Haefel</a>
  */
 public class EncStatelessBean implements javax.ejb.SessionBean{
-    
+
     private String name;
     private SessionContext ejbContext;
-    
-    
+
+
     //=============================
     // Home interface methods
-    //    
-    //    
+    //
+    //
     // Home interface methods
     //=============================
-    
+
 
     //=============================
     // Remote interface methods
-    //    
+    //
     public void lookupEntityBean() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             BasicBmpHome home = (BasicBmpHome) javax.rmi.PortableRemoteObject.narrow( ctx.lookup("java:comp/env/stateless/beanReferences/bmp_entity"), BasicBmpHome.class );
             Assert.assertNotNull("The EJBHome looked up is null",home);
 
@@ -72,13 +74,13 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupStatefulBean() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             BasicStatefulHome home = (BasicStatefulHome) javax.rmi.PortableRemoteObject.narrow( ctx.lookup("java:comp/env/stateless/beanReferences/stateful"), BasicStatefulHome.class );
             Assert.assertNotNull("The EJBHome looked up is null",home);
 
@@ -91,13 +93,13 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupStatelessBean() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             BasicStatelessHome home = (BasicStatelessHome) javax.rmi.PortableRemoteObject.narrow( ctx.lookup("java:comp/env/stateless/beanReferences/stateless"), BasicStatelessHome.class );
             Assert.assertNotNull("The EJBHome looked up is null",home);
 
@@ -119,7 +121,7 @@
 
             String expected = new String("1");
             String actual   = (String)ctx.lookup("java:comp/env/stateless/references/String");
-            
+
             Assert.assertNotNull("The String looked up is null", actual );
             Assert.assertEquals(expected, actual );
 
@@ -130,16 +132,16 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupDoubleEntry() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             Double expected = new Double(1.0D);
             Double actual   = (Double)ctx.lookup("java:comp/env/stateless/references/Double");
-            
+
             Assert.assertNotNull("The Double looked up is null", actual );
             Assert.assertEquals(expected, actual );
 
@@ -150,16 +152,16 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupLongEntry() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             Long expected = new Long(1L);
             Long actual   = (Long)ctx.lookup("java:comp/env/stateless/references/Long");
-            
+
             Assert.assertNotNull("The Long looked up is null", actual );
             Assert.assertEquals(expected, actual );
 
@@ -170,16 +172,16 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupFloatEntry() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             Float expected = new Float(1.0F);
             Float actual   = (Float)ctx.lookup("java:comp/env/stateless/references/Float");
-            
+
             Assert.assertNotNull("The Float looked up is null", actual );
             Assert.assertEquals(expected, actual );
 
@@ -190,16 +192,16 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupIntegerEntry() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             Integer expected = new Integer(1);
             Integer actual   = (Integer)ctx.lookup("java:comp/env/stateless/references/Integer");
-            
+
             Assert.assertNotNull("The Integer looked up is null", actual );
             Assert.assertEquals(expected, actual );
 
@@ -210,16 +212,16 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupShortEntry() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             Short expected = new Short((short)1);
             Short actual   = (Short)ctx.lookup("java:comp/env/stateless/references/Short");
-            
+
             Assert.assertNotNull("The Short looked up is null", actual );
             Assert.assertEquals(expected, actual );
 
@@ -230,16 +232,16 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupBooleanEntry() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             Boolean expected = new Boolean(true);
             Boolean actual = (Boolean)ctx.lookup("java:comp/env/stateless/references/Boolean");
-            
+
             Assert.assertNotNull("The Boolean looked up is null", actual );
             Assert.assertEquals(expected, actual );
 
@@ -250,16 +252,16 @@
             throw new TestFailureException(afe);
         }
     }
-    
+
     public void lookupByteEntry() throws TestFailureException{
         try{
             try{
             InitialContext ctx = new InitialContext();
             Assert.assertNotNull("The InitialContext is null", ctx );
-            
+
             Byte expected = new Byte((byte)1);
             Byte actual   = (Byte)ctx.lookup("java:comp/env/stateless/references/Byte");
-            
+
             Assert.assertNotNull("The Byte looked up is null", actual );
             Assert.assertEquals(expected, actual );
 
@@ -299,6 +301,11 @@
                 Object obj = ctx.lookup("java:comp/env/datasource");
                 Assert.assertNotNull("The DataSource is null", obj);
                 Assert.assertTrue("Not an instance of DataSource", obj instanceof DataSource);
+
+                obj = ctx.lookup("java:comp/env/persistence/TestUnit");
+                EntityManagerFactory emf = (EntityManagerFactory)obj;
+                Assert.assertNotNull("The EntityManagerFactory is null", emf );
+
             } catch (Exception e){
                 Assert.fail("Received Exception "+e.getClass()+ " : "+e.getMessage());
             }

Modified: incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml?view=diff&rev=485813&r1=485812&r2=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml (original)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml Mon Dec 11 10:57:01 2006
@@ -1276,6 +1276,13 @@
                 <res-type>javax.sql.DataSource</res-type>
                 <res-auth>Container</res-auth>
             </resource-ref>
+            <persistence-unit-ref>
+		<description>
+		    Persistence unit for testing the functionality.
+		</description>
+		<persistence-unit-ref-name>persistence/TestUnit</persistence-unit-ref-name>
+		<persistence-unit-name>openjpa-test-unit</persistence-unit-name>
+	    </persistence-unit-ref>
         </session>
 
         <!--

Added: incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/persistence.xml?view=auto&rev=485813
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/persistence.xml (added)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/persistence.xml Mon Dec 11 10:57:01 2006
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+-->
+<persistence>
+  <persistence-unit name="openjpa-test-unit">
+    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
+    <class>org.apache.openejb.test.entity.Customer</class>
+    <jta-data-source>java:openejb/connector/Default JDBC Database</jta-data-source>
+    <properties>
+     <!--  <property name="openjpa.jdbc.SynchronizeMappings"
+                value="buildSchema(ForeignKeys=true)"/> --> 
+     <property name="openjpa.ConnectionFactoryMode"
+                value="managed"/>
+     <property name="openjpa.ManagedRuntime" value="org.apache.openjpa.ee.OpenEJBManagedRuntime"/>
+    </properties>
+  </persistence-unit>
+</persistence>
\ No newline at end of file