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.");
+    }
 }


Reply via email to