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"