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());