Author: rmannibucau
Date: Tue Aug 14 10:13:14 2012
New Revision: 1372822
URL: http://svn.apache.org/viewvc?rev=1372822&view=rev
Log:
TOMEE-372 TOMEE-371 arquillian test using hibernate + use system classloader
first in classloader first only if not an enrichment class
Added:
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/hibernate/
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/hibernate/HibernateTest.java
Modified:
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/pom.xml
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/resources/hibernate-pom.xml
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/util/classloader/URLClassLoaderFirst.java
Modified: openejb/trunk/openejb/arquillian/arquillian-tomee-tests/pom.xml
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-tests/pom.xml?rev=1372822&r1=1372821&r2=1372822&view=diff
==============================================================================
--- openejb/trunk/openejb/arquillian/arquillian-tomee-tests/pom.xml (original)
+++ openejb/trunk/openejb/arquillian/arquillian-tomee-tests/pom.xml Tue Aug 14
10:13:14 2012
@@ -25,11 +25,24 @@
<dependencies>
<dependency>
<groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-core-hibernate</artifactId>
+ <version>4.1.0-SNAPSHOT</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
<artifactId>javaee-api</artifactId>
<version>${javaee-api.version}</version>
</dependency>
<dependency>
+ <groupId>org.jboss.shrinkwrap.resolver</groupId>
+ <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
+ <version>2.0.0-alpha-1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.myfaces.extensions.cdi.bundles</groupId>
<artifactId>myfaces-extcdi-bundle-jsf20</artifactId>
<version>1.0.5</version>
Added:
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/hibernate/HibernateTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/hibernate/HibernateTest.java?rev=1372822&view=auto
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/hibernate/HibernateTest.java
(added)
+++
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/java/org/apache/openejb/arquillian/tests/hibernate/HibernateTest.java
Tue Aug 14 10:13:14 2012
@@ -0,0 +1,93 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.arquillian.tests.hibernate;
+
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.jboss.shrinkwrap.resolver.api.DependencyResolvers;
+import org.jboss.shrinkwrap.resolver.api.ResolutionException;
+import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver;
+import org.jboss.shrinkwrap.resolver.api.maven.filter.ScopeFilter;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ejb.EJB;
+import javax.ejb.Singleton;
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceContext;
+
+import java.io.File;
+import java.util.Properties;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(Arquillian.class)
+public class HibernateTest {
+ @Deployment
+ public static WebArchive war() {
+ File[] hibernate;
+ try { // try offline first since it is generally faster
+ hibernate = DependencyResolvers.use(MavenDependencyResolver.class)
+ .goOffline()
+ .loadEffectivePom("src/test/resources/hibernate-pom.xml")
+ .importAnyDependencies(new ScopeFilter("compile"))
+ .resolveAsFiles();
+ } catch (ResolutionException re) { // try on central
+ hibernate = DependencyResolvers.use(MavenDependencyResolver.class)
+ .loadEffectivePom("src/test/resources/hibernate-pom.xml")
+ .importAnyDependencies(new ScopeFilter("compile"))
+ .resolveAsFiles();
+ }
+
+ return ShrinkWrap.create(WebArchive.class, "hibernate-app.war")
+ .addAsWebInfResource(new StringAsset("<?xml
version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<persistence version=\"2.0\"\n" +
+ "
xmlns=\"http://java.sun.com/xml/ns/persistence\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+ "
xsi:schemaLocation=\"http://java.sun.com/xml/ns/persistence" +
+ "
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd\">\n" +
+ " <persistence-unit name=\"hibernate\">\n" +
+ "
<provider>org.hibernate.ejb.HibernatePersistence</provider>\n" +
+ "
<exclude-unlisted-classes>true</exclude-unlisted-classes>\n" +
+ " <properties>\n" +
+ " <property name=\"hibernate.hbm2ddl.auto\"
value=\"create-drop\" />\n" +
+ " </properties>\n" +
+ " </persistence-unit>\n" +
+ "</persistence>"),
ArchivePaths.create("persistence.xml"))
+ .addAsLibraries(hibernate);
+ }
+
+ @Test // using an internal lookup because in tomee embedded new
InitialContext() is not guaranteed
+ public void checkEmIsHibernateOne() throws Exception {
+ final EntityManagerFactory emf = (EntityManagerFactory)
+ SystemInstance.get().getComponent(ContainerSystem.class)
+
.getJNDIContext().lookup(Assembler.PERSISTENCE_UNIT_NAMING_CONTEXT
+ +
SystemInstance.get().getComponent(Assembler.class).getDeployedApplications()
+
.iterator().next().persistenceUnits.iterator().next().id);
+ assertTrue(((ReloadableEntityManagerFactory)
emf).getDelegate().getClass().getName().startsWith("org.hibernate."));
+ }
+}
Modified:
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/resources/hibernate-pom.xml
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/resources/hibernate-pom.xml?rev=1372822&r1=1372821&r2=1372822&view=diff
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/resources/hibernate-pom.xml
(original)
+++
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/src/test/resources/hibernate-pom.xml
Tue Aug 14 10:13:14 2012
@@ -37,6 +37,10 @@
<groupId>org.jboss.spec.javax.transaction</groupId>
<artifactId>jboss-transaction-api_1.1_spec</artifactId>
</exclusion>
+ <exclusion>
+ <groupId>org.javassist</groupId>
+ <artifactId>javassist</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
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=1372822&r1=1372821&r2=1372822&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 Aug 14 10:13:14 2012
@@ -43,11 +43,11 @@ public class EntityManagerFactoryCallabl
final ClassLoader old = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(appClassLoader);
try {
- Class clazz =
appClassLoader.loadClass(persistenceProviderClassName);
+ final Class<?> clazz =
appClassLoader.loadClass(persistenceProviderClassName);
PersistenceProvider persistenceProvider = (PersistenceProvider)
clazz.newInstance();
// Create entity manager factories with the validator factory
- Map<String, Object> properties = new HashMap<String, Object>();
+ final Map<String, Object> properties = new HashMap<String,
Object>();
properties.put("javax.persistence.validator.ValidatorFactory", new
ValidatorFactoryWrapper());
EntityManagerFactory emf =
persistenceProvider.createContainerEntityManagerFactory(unitInfo, properties);
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java?rev=1372822&r1=1372821&r2=1372822&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
Tue Aug 14 10:13:14 2012
@@ -82,16 +82,18 @@ public class URLClassLoaderFirst extends
}
// JSE classes?
- try {
- clazz = system.loadClass(name);
- if (clazz != null) {
- if (resolve) {
- resolveClass(clazz);
+ if (canBeLoadedFromSystem(name)) {
+ try {
+ clazz = system.loadClass(name);
+ if (clazz != null) {
+ if (resolve) {
+ resolveClass(clazz);
+ }
+ return clazz;
}
- return clazz;
+ } catch (ClassNotFoundException ignored) {
+ // no-op
}
- } catch (ClassNotFoundException ignored) {
- // no-op
}
// look for it in this classloader
@@ -153,7 +155,17 @@ public class URLClassLoaderFirst extends
return null;
}
- public static boolean shouldSkip(final String name) { // TODO: enhance it
+ // we skip webapp enrichment jars since we want to load them from the
webapp or lib
+ // Note: this is not a real limitation since it is first fail it will be
done later
+ private static boolean canBeLoadedFromSystem(final String name) {
+ if (name.startsWith("org.apache.openejb.")) {
+ return
!isWebAppEnrichment(name.substring("org.apache.openejb.".length()));
+ }
+ return true;
+ }
+
+ // making all these call inline if far more costly than factorizing
packages
+ public static boolean shouldSkip(final String name) {
if (FORCED_SKIP != null) {
for (String prefix : FORCED_SKIP) {
if (name.startsWith(prefix)) {
@@ -206,17 +218,8 @@ public class URLClassLoaderFirst extends
if (apache.startsWith("naming")) return true;
if (apache.startsWith("taglibs.")) return true;
- if (apache.startsWith("openejb.")) {
- final String openejb =
apache.substring("openejb.".length());
-
- // webapp enrichment classes
- if (openejb.startsWith("hibernate.")) return false;
- if (openejb.startsWith("jpa.integration.")) return false;
- if (openejb.startsWith("toplink.")) return false;
- if (openejb.startsWith("eclipselink.")) return false;
-
- // else skip
- return true;
+ if (apache.startsWith("openejb.")) { // skip all excepted
webapp enrichment artifacts
+ return
!isWebAppEnrichment(apache.substring("openejb.".length()));
}
if (apache.startsWith("commons.")) {
@@ -234,6 +237,8 @@ public class URLClassLoaderFirst extends
if (commons.startsWith("logging")) return true;
if (commons.startsWith("pool")) return true;
if (commons.startsWith("net") && SKIP_COMMONS_NET) return
true;
+
+ return false;
}
if (SKIP_MYFACES && apache.startsWith("myfaces.")) {
@@ -265,12 +270,14 @@ public class URLClassLoaderFirst extends
if (renderkit.startsWith("html.Html")) return true;
char firstNextletter = renderkit.charAt(0);
if (Character.isUpperCase(firstNextletter)) return
true;
+ return false;
}
if (myfaces.startsWith("taglib.")) {
final String taglib =
myfaces.substring("taglib.".length());
if (taglib.startsWith("html.Html")) return true;
if (taglib.startsWith("core.")) return true;
+ return false;
}
if (myfaces.startsWith("webapp.")) {
@@ -282,8 +289,13 @@ public class URLClassLoaderFirst extends
if (webapp.equals("MyFacesServlet")) return true;
if (webapp.equals("ManagedBeanDestroyerListener"))
return true;
if (webapp.equals("WebConfigParamsLogger")) return
true;
+ return false;
}
+
+ return false;
}
+
+ return false;
}
// other org packages
@@ -292,6 +304,8 @@ public class URLClassLoaderFirst extends
if (org.startsWith("quartz")) return true;
if (org.startsWith("eclipse.jdt.")) return true;
if (org.startsWith("slf4j")) return true;
+
+ return false;
}
// other packages
@@ -301,4 +315,10 @@ public class URLClassLoaderFirst extends
return false;
}
+
+ // in org.apache.openejb.
+ private static boolean isWebAppEnrichment(final String openejb) {
+ return openejb.startsWith("hibernate.") ||
openejb.startsWith("jpa.integration.")
+ || openejb.startsWith("toplink.") ||
openejb.startsWith("eclipselink.");
+ }
}