Author: rmannibucau
Date: Tue Dec 18 20:13:34 2012
New Revision: 1423614

URL: http://svn.apache.org/viewvc?rev=1423614&view=rev
Log:
TOMEE-664 adding persistence.xml of webapp for ears

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityManagerFactoryCallable.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceBuilder.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitInfo.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityManagerFactoryCallable.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityManagerFactoryCallable.java?rev=1423614&r1=1423613&r2=1423614&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityManagerFactoryCallable.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityManagerFactoryCallable.java
 Tue Dec 18 20:13:34 2012
@@ -31,7 +31,7 @@ public class EntityManagerFactoryCallabl
 
     private final String persistenceProviderClassName;
     private final PersistenceUnitInfoImpl unitInfo;
-    private final ClassLoader appClassLoader;
+    private ClassLoader appClassLoader;
 
     public EntityManagerFactoryCallable(String persistenceProviderClassName, 
PersistenceUnitInfoImpl unitInfo, ClassLoader cl) {
         this.persistenceProviderClassName = persistenceProviderClassName;
@@ -77,4 +77,8 @@ public class EntityManagerFactoryCallabl
     public PersistenceUnitInfoImpl getUnitInfo() {
         return unitInfo;
     }
+
+    public void overrideClassLoader(final ClassLoader loader) {
+        appClassLoader = loader;
+    }
 }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceBuilder.java?rev=1423614&r1=1423613&r2=1423614&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceBuilder.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceBuilder.java
 Tue Dec 18 20:13:34 2012
@@ -65,6 +65,8 @@ public class PersistenceBuilder {
         // Exclude Unlisted Classes
         unitInfo.setExcludeUnlistedClasses(info.excludeUnlistedClasses);
 
+        unitInfo.setLazilyInitialized(info.webappName != null);
+
         Context context = 
SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext();
 
         // JTA Datasource
@@ -144,19 +146,8 @@ public class PersistenceBuilder {
         String persistenceProviderClassName = 
unitInfo.getPersistenceProviderClassName();
         unitInfo.setPersistenceProviderClassName(persistenceProviderClassName);
 
-        final long start = System.nanoTime();
-        try {
-            final EntityManagerFactoryCallable callable = new 
EntityManagerFactoryCallable(persistenceProviderClassName, unitInfo, 
classLoader);
-            return new ReloadableEntityManagerFactory(classLoader, callable, 
unitInfo.getProperties());
-        } finally {
-            final long time = TimeUnit.MILLISECONDS.convert(System.nanoTime() 
- start, TimeUnit.NANOSECONDS);
-            logger.info("assembler.buildingPersistenceUnit", 
unitInfo.getPersistenceUnitName(), unitInfo.getPersistenceProviderClassName(), 
time+"");
-            if (logger.isDebugEnabled()) {
-                for (Map.Entry<Object, Object> entry : 
unitInfo.getProperties().entrySet()) {
-                    logger.debug(entry.getKey() + "=" + entry.getValue());
-                }
-            }
-        }
+        final EntityManagerFactoryCallable callable = new 
EntityManagerFactoryCallable(persistenceProviderClassName, unitInfo, 
classLoader);
+        return new ReloadableEntityManagerFactory(classLoader, callable, 
unitInfo);
     }
 
     public static String getOpenEJBJndiName(String unit) {

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitInfo.java?rev=1423614&r1=1423613&r2=1423614&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitInfo.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/PersistenceUnitInfo.java
 Tue Dec 18 20:13:34 2012
@@ -39,4 +39,5 @@ public class PersistenceUnitInfo extends
     public String persistenceXMLSchemaVersion;
     public String sharedCacheMode;
     public String validationMode;
+    public String webappName = null; // used in ear to start webapp emf
 }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java?rev=1423614&r1=1423613&r2=1423614&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
 Tue Dec 18 20:13:34 2012
@@ -68,6 +68,7 @@ import java.net.URL;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 public class ReloadableEntityManagerFactory implements EntityManagerFactory {
     private static final Logger LOGGER = 
Logger.getInstance(LogCategory.OPENEJB, ReloadableEntityManagerFactory.class);
@@ -79,6 +80,7 @@ public class ReloadableEntityManagerFact
     public static final String OPENEJB_JPA_CRITERIA_LOG_JPQL = 
"openejb.jpa.criteria.log.jpql";
     public static final String OPENEJB_JPA_CRITERIA_LOG_JPQL_LEVEL = 
"openejb.jpa.criteria.log.jpql.level";
 
+    private final PersistenceUnitInfoImpl unitInfoImpl;
     private ClassLoader classLoader;
     private EntityManagerFactory delegate;
     private EntityManagerFactoryCallable entityManagerFactoryCallable;
@@ -87,22 +89,41 @@ public class ReloadableEntityManagerFact
     private boolean logCriteriaJpql;
     private String logCriteriaJpqlLevel;
 
-    public ReloadableEntityManagerFactory(final ClassLoader cl, final 
EntityManagerFactoryCallable callable, final Properties props) {
+    public ReloadableEntityManagerFactory(final ClassLoader cl, final 
EntityManagerFactoryCallable callable, final PersistenceUnitInfoImpl unitInfo) {
         classLoader = cl;
         entityManagerFactoryCallable = callable;
-        createDelegate();
+        unitInfoImpl = unitInfo;
+        final Properties properties = unitInfo.getProperties();
+        logCriteriaJpql = logCriteriaQueryJpql(properties);
+        logCriteriaJpqlLevel = logCriteriaQueryJpqlLevel(properties);
 
-        logCriteriaJpql = logCriteriaQueryJpql(props);
-        logCriteriaJpqlLevel = logCriteriaQueryJpqlLevel(props);
+        if (!callable.getUnitInfo().isLazilyInitialized()) {
+            createDelegate();
+        }
+    }
+
+    public void overrideClassLoader(final ClassLoader loader) {
+        classLoader = loader;
+        entityManagerFactoryCallable.overrideClassLoader(loader);
+        unitInfoImpl.setClassLoader(loader);
     }
 
-    private void createDelegate() {
+    public void createDelegate() {
         JPAThreadContext.infos.put("properties", 
entityManagerFactoryCallable.getUnitInfo().getProperties());
+        final long start = System.nanoTime();
         try {
             delegate = entityManagerFactoryCallable.call();
         } catch (Exception e) {
             throw new OpenEJBRuntimeException(e);
         } finally {
+            final long time = TimeUnit.MILLISECONDS.convert(System.nanoTime() 
- start, TimeUnit.NANOSECONDS);
+            LOGGER.info("assembler.buildingPersistenceUnit", 
unitInfoImpl.getPersistenceUnitName(), 
unitInfoImpl.getPersistenceProviderClassName(), time + "");
+            if (LOGGER.isDebugEnabled()) {
+                for (Map.Entry<Object, Object> entry : 
unitInfoImpl.getProperties().entrySet()) {
+                    LOGGER.debug(entry.getKey() + "=" + entry.getValue());
+                }
+            }
+
             JPAThreadContext.infos.clear();
         }
     }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1423614&r1=1423613&r2=1423614&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
 Tue Dec 18 20:13:34 2012
@@ -626,6 +626,7 @@ class AppInfoBuilder {
                 info.persistenceUnitRootUrl = rootUrl;
                 info.provider = persistenceUnit.getProvider();
                 info.transactionType = 
persistenceUnit.getTransactionType().toString();
+                info.webappName = findRelatedWebApp(appModule, rootUrl);
 
                 final Boolean excludeUnlistedClasses = 
persistenceUnit.isExcludeUnlistedClasses();
                 info.excludeUnlistedClasses = persistenceUnit.isScanned() || 
(excludeUnlistedClasses != null && excludeUnlistedClasses);
@@ -653,6 +654,20 @@ class AppInfoBuilder {
         }
     }
 
+    private String findRelatedWebApp(final AppModule appModule, final String 
rootUrl) {
+        for (WebModule webModule : appModule.getWebModules()) {
+            final List<URL> pXmls = (List<URL>) 
webModule.getAltDDs().get("ear-webapp-persistence-xml-jars");
+            if (pXmls != null) {
+                for (URL url : pXmls) {
+                    if (url.toExternalForm().contains(rootUrl)) {
+                        return webModule.getModuleId();
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
     public static class PersistenceProviderProperties {
         public static final String OPENJPA_RUNTIME_UNENHANCED_CLASSES = 
"openjpa.RuntimeUnenhancedClasses";
         public static final String DEFAULT_RUNTIME_UNENHANCED_CLASSES = 
"supported";

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1423614&r1=1423613&r2=1423614&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 Tue Dec 18 20:13:34 2012
@@ -24,8 +24,21 @@ import org.apache.openejb.classloader.We
 import org.apache.openejb.config.event.BeforeDeploymentEvent;
 import org.apache.openejb.core.EmptyResourcesClassLoader;
 import org.apache.openejb.core.ParentClassLoaderFinder;
-import org.apache.openejb.jee.*;
+import org.apache.openejb.jee.Application;
+import org.apache.openejb.jee.ApplicationClient;
+import org.apache.openejb.jee.Beans;
+import org.apache.openejb.jee.Connector;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.FacesConfig;
+import org.apache.openejb.jee.JavaWsdlMapping;
+import org.apache.openejb.jee.JaxbJavaee;
+import org.apache.openejb.jee.JspConfig;
 import org.apache.openejb.jee.Module;
+import org.apache.openejb.jee.Taglib;
+import org.apache.openejb.jee.TldTaglib;
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.jee.WebserviceDescription;
+import org.apache.openejb.jee.Webservices;
 import org.apache.openejb.jee.oejb3.OpenejbJar;
 import org.apache.openejb.loader.FileUtils;
 import org.apache.openejb.loader.IO;
@@ -516,6 +529,17 @@ public class DeploymentLoader implements
             DeploymentsResolver.loadFromClasspath(base, filteredUrls, 
appModule.getClassLoader());
             addPersistenceUnits(appModule, filteredUrls.toArray(new 
URL[filteredUrls.size()]));
 
+            for (WebModule webModule : appModule.getWebModules()) {
+                final List<URL> scannableUrls = webModule.getScannableUrls();
+                final List<URL> foundRootUrls = new ArrayList<URL>();
+                for (URL url : scannableUrls) {
+                    if (!addPersistenceUnits(appModule, url).isEmpty()) {
+                        foundRootUrls.add(url);
+                    }
+                }
+                webModule.getAltDDs().put("ear-webapp-persistence-xml-jars", 
foundRootUrls);
+            }
+
             for (final DeploymentModule module : 
appModule.getDeploymentModule()) {
                 module.setStandaloneModule(false);
             }
@@ -1140,7 +1164,8 @@ public class DeploymentLoader implements
     }
 
     @SuppressWarnings({"unchecked"})
-    protected static void addPersistenceUnits(final AppModule appModule, final 
URL... urls) throws OpenEJBException {
+    protected static Collection<URL> addPersistenceUnits(final AppModule 
appModule, final URL... urls) throws OpenEJBException {
+        final Collection<URL> added = new ArrayList<URL>();
 
         // OPENEJB-1059: Anything in the appModule.getAltDDs() map has already 
been
         // processed by the altdd code, so anything in here should not cause 
OPENEJB-1059
@@ -1154,6 +1179,7 @@ public class DeploymentLoader implements
 
             persistenceUrls = new ArrayList<URL>();
             persistenceUrls.add(URL.class.cast(value));
+            added.add(persistenceUrls.iterator().next());
 
             appModule.getAltDDs().put("persistence.xml", persistenceUrls);
         }
@@ -1189,6 +1215,7 @@ public class DeploymentLoader implements
                 }
 
                 persistenceUrls.add(descriptor);
+                added.add(descriptor);
             }
         }
 
@@ -1214,8 +1241,11 @@ public class DeploymentLoader implements
                 }
 
                 persistenceFragmentsUrls.add(descriptor);
+                added.add(descriptor);
             }
         }
+
+        return added;
     }
 
     public static Map<String, URL> getDescriptors(final URL moduleUrl) throws 
OpenEJBException {

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java?rev=1423614&r1=1423613&r2=1423614&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
 Tue Dec 18 20:13:34 2012
@@ -22,7 +22,6 @@ import java.lang.instrument.IllegalClass
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
-import java.net.URISyntaxException;
 import java.security.ProtectionDomain;
 import java.util.ArrayList;
 import java.util.List;
@@ -126,6 +125,9 @@ public class PersistenceUnitInfoImpl imp
     /** just to be able to dump this PU at runtime */
     private String nonJtaDataSourceName;
 
+    /** does it need to be created lazily (not in constructor) */
+    private boolean lazilyInitialized;
+
     public PersistenceUnitInfoImpl() {
         this.persistenceClassLoaderHandler = null;
     }
@@ -290,6 +292,15 @@ public class PersistenceUnitInfoImpl imp
         }
     }
 
+    // for emf in webapp of ears
+    public boolean isLazilyInitialized() {
+        return lazilyInitialized;
+    }
+
+    public void setLazilyInitialized(final boolean lazilyInitialized) {
+        this.lazilyInitialized = lazilyInitialized;
+    }
+
     public static class PersistenceClassFileTransformer implements 
ClassFileTransformer {
         private final ClassTransformer classTransformer;
 

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1423614&r1=1423613&r2=1423614&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Tue Dec 18 20:13:34 2012
@@ -74,6 +74,8 @@ import org.apache.openejb.assembler.clas
 import org.apache.openejb.assembler.classic.InjectionBuilder;
 import org.apache.openejb.assembler.classic.JndiEncBuilder;
 import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
+import org.apache.openejb.assembler.classic.PersistenceUnitInfo;
+import org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory;
 import org.apache.openejb.assembler.classic.ResourceInfo;
 import org.apache.openejb.assembler.classic.ServletInfo;
 import org.apache.openejb.assembler.classic.WebAppBuilder;
@@ -93,6 +95,7 @@ import org.apache.openejb.jee.EnvEntry;
 import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.tomcat.InstanceManager;
@@ -114,6 +117,7 @@ import javax.ejb.spi.HandleDelegate;
 import javax.el.ELResolver;
 import javax.naming.Context;
 import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
 import javax.naming.NamingException;
 import javax.naming.Reference;
 import javax.naming.StringRefAddr;
@@ -1069,6 +1073,21 @@ public class TomcatWebAppBuilder impleme
                     NamingUtil.setCurrentContext(null);
                 }
 
+                // create EMF included in this webapp when nested in an ear
+                for (PersistenceUnitInfo unitInfo : 
contextInfo.appInfo.persistenceUnits) {
+                    if (unitInfo.webappName != null && 
unitInfo.webappName.equals(webAppInfo.moduleId)) {
+                        try {
+                            final ReloadableEntityManagerFactory remf =
+                                (ReloadableEntityManagerFactory) 
SystemInstance.get().getComponent(ContainerSystem.class)
+                                        
.getJNDIContext().lookup(Assembler.PERSISTENCE_UNIT_NAMING_CONTEXT + 
unitInfo.id);
+                            
remf.overrideClassLoader(standardContext.getLoader().getClassLoader());
+                            remf.createDelegate();
+                        } catch (NameNotFoundException nnfe) {
+                            logger.warning("Can't find " + unitInfo.id + " 
persistence unit");
+                        }
+                    }
+                }
+
                 // add WebDeploymentInfo to ContainerSystem
                 final WebContext webContext = new WebContext(appContext);
                 webContext.setJndiEnc(new InitialContext());


Reply via email to