You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/08/14 14:12:39 UTC

svn commit: r1617912 - in /tomee/tomee/trunk: arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/ container/openejb-core/src/main/java/org/apache/openejb/core/ tomee/tomee-catalina/src/main/java/org/apache/tomee/c...

Author: rmannibucau
Date: Thu Aug 14 12:12:38 2014
New Revision: 1617912

URL: http://svn.apache.org/r1617912
Log:
ensuring in our info tree we use the right path for @WebXXX and not an inherited one cause we use a messed up classloading hierarchy

Added:
    tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/AnApp.java
Modified:
    tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainerTest.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
    tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java

Added: tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/AnApp.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/AnApp.java?rev=1617912&view=auto
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/AnApp.java (added)
+++ tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/AnApp.java Thu Aug 14 12:12:38 2014
@@ -0,0 +1,30 @@
+/**
+ * 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.embedded;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+import java.util.Collections;
+import java.util.Set;
+
+@ApplicationPath("api")
+public class AnApp extends Application {
+    public Set<Class<?>> getClasses() {
+        return Collections.<Class<?>>singleton(ARestService.class);
+    }
+}

Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainerTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainerTest.java?rev=1617912&r1=1617911&r2=1617912&view=diff
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainerTest.java (original)
+++ tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/test/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainerTest.java Thu Aug 14 12:12:38 2014
@@ -41,7 +41,7 @@ public class EmbeddedTomEEContainerTest 
     @Deployment
     public static WebArchive createDeployment() {
         return ShrinkWrap.create(WebArchive.class, "test.war")
-                .addClasses(AnEJB.class, AServlet.class, ARestService.class)
+                .addClasses(AnEJB.class, AServlet.class, ARestService.class, AnApp.class)
                 .setWebXML(new StringAsset(Descriptors.create(WebAppDescriptor.class).version("3.0").exportAsString()));
     }
 
@@ -64,7 +64,7 @@ public class EmbeddedTomEEContainerTest 
 
     @Test
     public void restServiceIsDeployed() throws Exception {
-        final String read = IOUtils.toString(new URL(url.toExternalForm() + "rest/foo").openStream());
+        final String read = IOUtils.toString(new URL(url.toExternalForm() + "api/rest/foo").openStream());
         assertEquals("foo", read);
     }
 }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java?rev=1617912&r1=1617911&r2=1617912&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java Thu Aug 14 12:12:38 2014
@@ -30,7 +30,10 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -76,6 +79,22 @@ public class TempClassLoader extends URL
     }
 
     @Override
+    public URL getResource(final String name) {
+        if (!name.startsWith("java/") && !name.startsWith("javax/") && name.endsWith(".class")) {
+            try {
+                final List<URL> urls = Collections.list(getResources(name));
+                if (urls.isEmpty()) {
+                    return null;
+                }
+                Collections.sort(urls, new ResourceComparator(getParent(), name));
+                return urls.iterator().next();
+            } catch (final IOException e) {
+                return super.getResource(name);
+            }
+        }
+        return super.getResource(name);
+    }
+
     public Enumeration<URL> getResources(final String name) throws IOException {
         return URLClassLoaderFirst.filterResources(name, super.getResources(name));
     }
@@ -236,4 +255,52 @@ public class TempClassLoader extends URL
         }
 
     }
+
+    // let maven resources go after other ones (arquillian tomee embedded and @WebXXX needs it absolutely)
+    private static class ResourceComparator implements Comparator<URL> {
+        private static final ClassLoader STOP_LOADER = getSystemClassLoader().getParent();
+
+        private final ClassLoader loader;
+        private final String name;
+
+        private ResourceComparator(final ClassLoader loader, final String name) {
+            this.loader = loader;
+            this.name = name;
+        }
+
+        @Override
+        public int compare(final URL o1, final URL o2) {
+            if (o1.equals(o2)) {
+                return 0;
+            }
+
+            final int weight1 = weight(o1);
+            final int weight2 = weight(o2);
+            if (weight1 == weight2) {
+                return o1.toExternalForm().compareTo(o2.toExternalForm());
+            }
+            return weight1 - weight2;
+        }
+
+        private int weight(final URL url) {
+            int w = 0;
+            ClassLoader c = loader;
+            while (c != null) {
+                try {
+                    if (Collections.list(c.getResources(name)).contains(url)) {
+                        w++;
+                    } else {
+                        break;
+                    }
+                } catch (final IOException e) {
+                    break;
+                }
+                c = c.getParent();
+                if (c == STOP_LOADER) {
+                    break;
+                }
+            }
+            return w;
+        }
+    }
 }

Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java?rev=1617912&r1=1617911&r2=1617912&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java (original)
+++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java Thu Aug 14 12:12:38 2014
@@ -137,7 +137,9 @@ public class TomEEWebappClassLoader exte
                 }
             }
         }
-        return super.loadClass(name);
+        synchronized (this) { // TODO: rework it to avoid it but not a big issue, see first if of this method
+            return super.loadClass(name);
+        }
     }
 
     @Override