Bug 405251 - [enterprise] Problems with deploying persistence applications - fix in the deployer for using custom classes for integrating persistence and OpenEJB in the case when the application brings own persistence provider
diff --git a/org.eclipse.virgo.web.enterprise.appdeployer/.classpath b/org.eclipse.virgo.web.enterprise.appdeployer/.classpath
index 0bc999d..b9cc93f 100755
--- a/org.eclipse.virgo.web.enterprise.appdeployer/.classpath
+++ b/org.eclipse.virgo.web.enterprise.appdeployer/.classpath
@@ -1,18 +1,20 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src/main/resources"/>
- <classpathentry kind="src" path="src/test/resources"/>
- <classpathentry kind="src" path="src/test/java"/>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.openejb.core/4.0.0.beta-2_v201205260545-virgo-2/org.apache.openejb.core-4.0.0.beta-2_v201205260545-virgo-2.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.openejb.core/4.0.0.beta-2_v201205260545-virgo-2/org.apache.openejb.core.source-4.0.0.beta-2_v201205260545-virgo-2.jar"/>
- <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.openejb.loader/4.0.0.beta-2_v201205041336/org.apache.openejb.loader-4.0.0.beta-2_v201205041336.jar"/>
- <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/javax.ejb/3.1.1.v201204261316/javax.ejb-3.1.1.v201204261316.jar"/>
- <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.catalina/7.0.35.v201302131125/org.apache.catalina-7.0.35.v201302131125.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.catalina/7.0.35.v201302131125/org.apache.catalina.source-7.0.35.v201302131125.jar"/>
- <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.medic/org.eclipse.virgo.medic/3.7.0.D-20130226164418/org.eclipse.virgo.medic-3.7.0.D-20130226164418.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.medic/org.eclipse.virgo.medic/3.1.0.M01/org.eclipse.virgo.medic-sources-3.1.0.M01.jar"/>
- <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.slf4j.api/1.7.2.v20121108-1250/org.slf4j.api-1.7.2.v20121108-1250.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.mirrored/org.slf4j.api/1.7.2.v20121108-1250/org.slf4j.api.source-1.7.2.v20121108-1250.jar"/>
- <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.openejb.jee/4.0.0.beta-2_v201205041336/org.apache.openejb.jee-4.0.0.beta-2_v201205041336.jar"/>
- <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/javax.validation/1.0.0.GA_v201205091237/javax.validation-1.0.0.GA_v201205091237.jar"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/resources"/>
+ <classpathentry kind="src" path="src/test/resources"/>
+ <classpathentry kind="src" path="src/test/java"/>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.openejb.core/4.0.0.beta-2_v201205260545-virgo-2/org.apache.openejb.core-4.0.0.beta-2_v201205260545-virgo-2.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.openejb.core/4.0.0.beta-2_v201205260545-virgo-2/org.apache.openejb.core.source-4.0.0.beta-2_v201205260545-virgo-2.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.openejb.loader/4.0.0.beta-2_v201205041336/org.apache.openejb.loader-4.0.0.beta-2_v201205041336.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/javax.ejb/3.1.1.v201204261316/javax.ejb-3.1.1.v201204261316.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.catalina/7.0.35.v201302131125/org.apache.catalina-7.0.35.v201302131125.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.catalina/7.0.35.v201302131125/org.apache.catalina.source-7.0.35.v201302131125.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.medic/org.eclipse.virgo.medic/3.7.0.D-20130226164418/org.eclipse.virgo.medic-3.7.0.D-20130226164418.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.medic/org.eclipse.virgo.medic/3.1.0.M01/org.eclipse.virgo.medic-sources-3.1.0.M01.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.slf4j.api/1.7.2.v20121108-1250/org.slf4j.api-1.7.2.v20121108-1250.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.mirrored/org.slf4j.api/1.7.2.v20121108-1250/org.slf4j.api.source-1.7.2.v20121108-1250.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.apache.openejb.jee/4.0.0.beta-2_v201205041336/org.apache.openejb.jee-4.0.0.beta-2_v201205041336.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/javax.validation/1.0.0.GA_v201205091237/javax.validation-1.0.0.GA_v201205091237.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/javax.servlet/javax.servlet/3.0.0.v201103241009/javax.servlet-3.0.0.v201103241009.jar" sourcepath="/IVY_CACHE/javax.servlet/javax.servlet/3.0.0.v201103241009/javax.servlet-sources-3.0.0.v201103241009.jar"/>
+ <classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.eclipse.osgi/3.8.1.v20120830-144521/org.eclipse.osgi-3.8.1.v20120830-144521.jar" sourcepath="/IVY_CACHE/org.eclipse.osgi/org.eclipse.osgi/3.7.1.R37x_v20110808-1106/org.eclipse.osgi-sources-3.7.1.R37x_v20110808-1106.jar"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.virgo.web.enterprise.appdeployer/ivy.xml b/org.eclipse.virgo.web.enterprise.appdeployer/ivy.xml
index 1855826..7754f01 100644
--- a/org.eclipse.virgo.web.enterprise.appdeployer/ivy.xml
+++ b/org.eclipse.virgo.web.enterprise.appdeployer/ivy.xml
@@ -14,11 +14,13 @@
<dependencies>
<dependency org="org.eclipse.virgo.mirrored" name="javax.ejb" rev="${javax.ejb}" conf="compile->runtime"/>
+ <dependency org="org.eclipse.virgo.mirrored" name="javax.servlet" rev="${javax.servlet}" conf="compile->runtime"/>
<dependency org="org.eclipse.virgo.mirrored" name="javax.validation" rev="${javax.validation}" conf="compile->runtime"/>
<dependency org="org.eclipse.virgo.mirrored" name="org.apache.catalina" rev="${org.apache.catalina}" conf="compile->runtime"/>
<dependency org="org.eclipse.virgo.mirrored" name="org.apache.openejb.core" rev="${org.apache.openejb.core}" conf="compile->runtime"/>
<dependency org="org.eclipse.virgo.mirrored" name="org.apache.openejb.loader" rev="${org.apache.openejb.loader}" conf="compile->runtime"/>
<dependency org="org.eclipse.virgo.mirrored" name="org.apache.openejb.jee" rev="${org.apache.openejb.jee}" conf="compile->runtime"/>
+ <dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="compile->runtime"/>
<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.api" rev="${org.slf4j.api}" conf="compile->runtime"/>
<dependency org="org.eclipse.virgo.medic" name="org.eclipse.virgo.medic" rev="${org.eclipse.virgo.medic}" conf="compile->runtime"/>
diff --git a/org.eclipse.virgo.web.enterprise.appdeployer/src/main/java/org/eclipse/virgo/web/enterprise/openejb/deployer/VirgoDeployerEjb.java b/org.eclipse.virgo.web.enterprise.appdeployer/src/main/java/org/eclipse/virgo/web/enterprise/openejb/deployer/VirgoDeployerEjb.java
index 33aadc4..1add160 100755
--- a/org.eclipse.virgo.web.enterprise.appdeployer/src/main/java/org/eclipse/virgo/web/enterprise/openejb/deployer/VirgoDeployerEjb.java
+++ b/org.eclipse.virgo.web.enterprise.appdeployer/src/main/java/org/eclipse/virgo/web/enterprise/openejb/deployer/VirgoDeployerEjb.java
@@ -36,6 +36,7 @@
import javax.naming.NameAlreadyBoundException;
import javax.naming.NamingException;
import javax.naming.RefAddr;
+import javax.servlet.ServletContext;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.deploy.ContextResource;
@@ -52,6 +53,7 @@
import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.Assembler;
import org.apache.openejb.assembler.classic.JndiEncBuilder;
+import org.apache.openejb.assembler.classic.PersistenceUnitInfo;
import org.apache.openejb.assembler.classic.WebAppInfo;
import org.apache.openejb.config.AppModule;
import org.apache.openejb.config.AutoConfig;
@@ -66,6 +68,8 @@
import org.apache.openejb.util.ContextUtil;
import org.eclipse.virgo.medic.eventlog.LogEvent;
import org.eclipse.virgo.web.enterprise.openejb.deployer.log.OpenEjbDeployerLogEvents;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -74,6 +78,18 @@
@TransactionManagement(BEAN)
public class VirgoDeployerEjb extends DeployerEjb {
+ private static final String HIBERNATE_FACTORY_CLASS = "org/hibernate/transaction/TransactionManagerLookup.class";
+ private static final String ECLIPSELINK_FACTORY_CLASS = "org/eclipse/persistence/transaction/JTATransactionController.class";
+ private static final String OSGI_BUNDLECONTEXT = "osgi-bundlecontext";
+ private static final String VIRGO_ECLIPSELINK_FACTORY = "org.eclipse.virgo.web.enterprise.openejb.eclipselink.JTATransactionController";
+ private static final String OPENEJB_ECLIPSELINK_FACTORY = "org.apache.openejb.eclipselink.JTATransactionController";
+ private static final String ECLIPSELINK_TARGET_SERVER = "eclipselink.target-server";
+ private static final String VIRGO_HIBERNATE_TRANSACTION_MANAGER_LOOKUP = "org.eclipse.virgo.web.enterprise.openejb.hibernate.TransactionManagerLookup";
+ private static final String HIBERNATE_TRANSACTION_MANAGER_LOOKUP = "org.apache.openejb.hibernate.TransactionManagerLookup";
+ private static final String HIBERNATE_TRANSACTION_MANAGER_LOOKUP_CLASS = "hibernate.transaction.manager_lookup_class";
+ private static final String HIBERNATE_VIRGO_JTA_PLATFORM = "org.eclipse.virgo.web.enterprise.openejb.hibernate.OpenEJBJtaPlatform";
+ private static final String HIBERNATE_OPEN_EJB_JTA_PLATFORM = "org.apache.openejb.hibernate.OpenEJBJtaPlatform";
+ private static final String HIBERNATE_JTA_PLATFORM = "hibernate.transaction.jta.platform";
private static final String OPENEJB_SCHEME = "openejb:";
private static final String JAVA_SCHEME = "java:";
private static final String TRANSACTION_TYPE_BEAN = "Bean";
@@ -153,6 +169,11 @@
if (p != null && p.containsKey(OPENEJB_DEPLOYER_FORCED_APP_ID_PROP)) {
appInfo.appId = p.getProperty(OPENEJB_DEPLOYER_FORCED_APP_ID_PROP);
}
+
+ if (isAppBringingOwnPersistence(standardContext)) {
+ overwritePersistenceIntegrationClassNames(appInfo);
+ }
+
AppContext appContext = assembler.createApplication(appInfo);
bindOpenEjbRefsInTomcat(appInfo, appContext, standardContext);
@@ -183,6 +204,40 @@
}
+ private boolean isAppBringingOwnPersistence(StandardContext standardContext) {
+ ServletContext servletContext = standardContext.getServletContext();
+ BundleContext bundleContext = (BundleContext) servletContext
+ .getAttribute(OSGI_BUNDLECONTEXT);
+ Bundle appBundle = bundleContext.getBundle();
+ URL resourceURL = appBundle.getResource(ECLIPSELINK_FACTORY_CLASS);
+ if (resourceURL == null) {
+ resourceURL = appBundle.getResource(HIBERNATE_FACTORY_CLASS);
+ }
+
+ if (resourceURL != null) {
+ return true;
+ }
+
+ return false;
+ }
+
+ private void overwritePersistenceIntegrationClassNames(final AppInfo appInfo) {
+ for (PersistenceUnitInfo persistenceUnit : appInfo.persistenceUnits) {
+ Properties props = persistenceUnit.properties;
+ if (OPENEJB_ECLIPSELINK_FACTORY.equals(props
+ .get(ECLIPSELINK_TARGET_SERVER))) {
+ props.put(ECLIPSELINK_TARGET_SERVER, VIRGO_ECLIPSELINK_FACTORY);
+ } else if (HIBERNATE_OPEN_EJB_JTA_PLATFORM.equals(props
+ .get(HIBERNATE_JTA_PLATFORM))) {
+ props.put(HIBERNATE_JTA_PLATFORM, HIBERNATE_VIRGO_JTA_PLATFORM);
+ } else if (HIBERNATE_TRANSACTION_MANAGER_LOOKUP.equals(props
+ .get(HIBERNATE_TRANSACTION_MANAGER_LOOKUP_CLASS))) {
+ props.put(HIBERNATE_TRANSACTION_MANAGER_LOOKUP_CLASS,
+ VIRGO_HIBERNATE_TRANSACTION_MANAGER_LOOKUP);
+ }
+ }
+ }
+
private String normalize(String rootContext) {
String result = rootContext.replace("\\", "/");
if (!result.startsWith("/")) {
diff --git a/org.eclipse.virgo.web.enterprise.appdeployer/template.mf b/org.eclipse.virgo.web.enterprise.appdeployer/template.mf
index 48d78c1..6b54d1c 100644
--- a/org.eclipse.virgo.web.enterprise.appdeployer/template.mf
+++ b/org.eclipse.virgo.web.enterprise.appdeployer/template.mf
@@ -6,10 +6,12 @@
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Service-Component: OSGI-INF/virgo.web.enterprise.appdeployer.deployer.xml
Import-Template: javax.ejb;version="0",
+ javax.servlet;version="0",
javax.validation;version="0",
org.apache.catalina.*;version="${org.apache.catalina:[=.=.=, +1)}",
org.apache.naming.*;version="${org.apache.catalina:[=.=.=, +1)}",
org.apache.openejb.*;version="0",
+ org.osgi.framework;version="0",
org.eclipse.virgo.medic.*;version="${org.eclipse.virgo.medic:[=.=.=, +1)}",
org.slf4j;version="0",
javax.naming;version="0"