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"