You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2012/01/15 02:42:25 UTC

svn commit: r1231609 - in /openejb/branches/openejb-4.0.0-beta-2: ./ arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/ container/openejb-core/src/main/java/org/apache/openejb/ container/openejb-core/src/main/j...

Author: dblevins
Date: Sun Jan 15 01:42:24 2012
New Revision: 1231609

URL: http://svn.apache.org/viewvc?rev=1231609&view=rev
Log:
svn merge -r 1230326:1230327 https://svn.apache.org/repos/asf/openejb/trunk/openejb

http://svn.apache.org/viewvc?view=revision&revision=1230327
------------------------------------------------------------------------
r1230327 | rmannibucau | 2012-01-11 15:42:20 -0800 (Wed, 11 Jan 2012) | 1 line

trying to remove duplicated urls taking into account antijarlocking
------------------------------------------------------------------------

Modified:
    openejb/branches/openejb-4.0.0-beta-2/   (props changed)
    openejb/branches/openejb-4.0.0-beta-2/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
    openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
    openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java
    openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java   (props changed)
    openejb/branches/openejb-4.0.0-beta-2/container/openejb-jee/src/test/resources/jsf/   (props changed)
    openejb/branches/openejb-4.0.0-beta-2/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml   (props changed)
    openejb/branches/openejb-4.0.0-beta-2/examples/application-composer/   (props changed)
    openejb/branches/openejb-4.0.0-beta-2/src/   (props changed)
    openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
    openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Propchange: openejb/branches/openejb-4.0.0-beta-2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jan 15 01:42:24 2012
@@ -1,3 +1,4 @@
 /openejb/branches/openejb-3.1.1:779593
 /openejb/branches/openejb-3.1.x:945409,945448,1004381,1005322,1021880,1021903,1021955,1021961,1021965,1021975,1021979,1021990,1022375,1022393,1023096,1023116,1023125,1026527,1027696,1027724,1027739,1027754,1032856,1032866,1034030,1040222,1040250
 /openejb/branches/openejb-jcdi:984659-985270
+/openejb/trunk/openejb:1230327

Modified: openejb/branches/openejb-4.0.0-beta-2/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0-beta-2/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1231609&r1=1231608&r2=1231609&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0-beta-2/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java (original)
+++ openejb/branches/openejb-4.0.0-beta-2/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java Sun Jan 15 01:42:24 2012
@@ -100,7 +100,7 @@ public abstract class TomEEContainer imp
             do { // be sure we don't override something existing
                 file = new File(tmpDir + File.separator + i++ + File.separator + archive.getName());
             } while (file.exists());
-            if (!file.getParentFile().mkdirs()) {
+            if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) {
                 LOGGER.warning("can't create " + file.getParent());
             }
 

Modified: openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java?rev=1231609&r1=1231608&r2=1231609&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java (original)
+++ openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java Sun Jan 15 01:42:24 2012
@@ -63,6 +63,10 @@ public class ClassLoaderUtil {
         return localUrlCache.isUrlCached(appId, url);
     }
 
+    public static URL getUrlKeyCached(String appId, File file) {
+    	return localUrlCache.getUrlKeyCached(appId, file);
+    }
+
     public static URLClassLoader createClassLoader(String appId, URL[] urls, ClassLoader parent) {
         urls = localUrlCache.cacheUrls(appId, urls);
         URLClassLoader classLoader = new URLClassLoader(urls, parent);

Modified: openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java?rev=1231609&r1=1231608&r2=1231609&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java (original)
+++ openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java Sun Jan 15 01:42:24 2012
@@ -150,6 +150,29 @@ public class UrlCache {
         return appCache.containsKey(url);
     }
 
+    public URL getUrlKeyCached(String appId, File file) {
+    	if (file == null) {
+    		return null;
+    	}
+        final Map<URL, File> appCache = getAppCache(appId);
+        for (Map.Entry<URL, File> entry : appCache.entrySet()) {
+        	if (entry.getValue().equals(file)) {
+        		return entry.getKey();
+        	}
+        }
+
+        final URL keyUrl;
+		try {
+			keyUrl = file.toURI().toURL();
+		} catch (MalformedURLException e) {
+			return null;
+		}
+        if (appCache.containsKey(keyUrl)) {
+        	return keyUrl;
+        }
+        return null;
+    }
+
     private synchronized File cacheUrl(String appId, URL url) {
         File sourceFile;
         if (!"file".equals(url.getProtocol())) {

Propchange: openejb/branches/openejb-4.0.0-beta-2/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jan 15 01:42:24 2012
@@ -1,3 +1,4 @@
 /openejb/branches/openejb-3.1.1/container/openejb-core/src/test/java/org/apache/openejb/config/UberInterfaceTest.java:779593
 /openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java:945409,945448,1005322,1021880,1021903,1021955,1021961,1021965,1021975,1021979,1021990,1022375,1022393,1023096,1023116,1023125,1026527,1027696,1027724,1027739,1027754,1032856,1032866,1034030,1040222,1040250
 /openejb/branches/openejb-jcdi/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java:984659-985270
+/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java:1230327

Propchange: openejb/branches/openejb-4.0.0-beta-2/container/openejb-jee/src/test/resources/jsf/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jan 15 01:42:24 2012
@@ -2,3 +2,4 @@
 /geronimo/server/branches/3.0-M1/plugins/myfaces/geronimo-myfaces-builder/src/test/resources:948864,951792
 /geronimo/server/trunk/plugins/j2ee/myfaces/geronimo-myfaces-builder/src/test/resources:887507
 /openejb/branches/openejb-jcdi/container/openejb-jee/src/test/resources/jsf:984659-985270
+/openejb/trunk/openejb/container/openejb-jee/src/test/resources/jsf:1230327

Propchange: openejb/branches/openejb-4.0.0-beta-2/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jan 15 01:42:24 2012
@@ -1,3 +1,4 @@
 /openejb/branches/openejb-3.1.1/examples/alternate-descriptors/src/main/resources/META-INF/ejb-jar.xml:779593
 /openejb/branches/openejb-3.1.x/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml:945409,945448,1005322,1021880,1021903,1021955,1021961,1021965,1021975,1021979,1021990,1022375,1022393,1023096,1023116,1023125,1026527,1027696,1027724,1027739,1027754,1032856,1032866,1034030,1040222,1040250
 /openejb/branches/openejb-jcdi/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml:984659-985270
+/openejb/trunk/openejb/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml:1230327

Propchange: openejb/branches/openejb-4.0.0-beta-2/examples/application-composer/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jan 15 01:42:24 2012
@@ -1,2 +1,3 @@
 /openejb/branches/openejb-3.1.1/examples/application-composer:779593
+/openejb/trunk/openejb/examples/application-composer:1230327
 /openejb/trunk/openejb3/examples/application-composer:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946805,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801,951611,953191,953196,953556,955104,955496,957463,962382,962750,987030,1004172,1029528

Propchange: openejb/branches/openejb-4.0.0-beta-2/src/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jan 15 01:42:24 2012
@@ -1,2 +1,3 @@
 /openejb/branches/openejb-3.1.1/src:779593
+/openejb/trunk/openejb/src:1230327
 /openejb/trunk/openejb3/src:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946805,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801,951611,953191,953196,953556,955104,955496,957463,962382,962750,987030,1004172,1029528

Modified: openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java?rev=1231609&r1=1231608&r2=1231609&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java (original)
+++ openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java Sun Jan 15 01:42:24 2012
@@ -21,10 +21,13 @@ import org.apache.catalina.LifecycleExce
 import org.apache.catalina.loader.WebappClassLoader;
 import org.apache.catalina.loader.WebappLoader;
 import org.apache.naming.resources.DirContextURLStreamHandler;
+import org.apache.openejb.ClassLoaderUtil;
 import org.apache.openejb.util.ArrayEnumeration;
 import org.apache.tomcat.util.ExceptionUtils;
 
+import java.io.File;
 import java.io.IOException;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -34,8 +37,10 @@ import java.util.List;
 public class TomEEWebappLoader extends WebappLoader {
     private ClassLoader appClassLoader;
     private ClassLoader tomEEClassLoader;
+    private String appPath;
 
-    public TomEEWebappLoader(final ClassLoader classLoader) {
+    public TomEEWebappLoader(final String appId, final ClassLoader classLoader) {
+    	this.appPath = appId;
         appClassLoader = classLoader;
     }
 
@@ -46,7 +51,7 @@ public class TomEEWebappLoader extends W
     @Override protected void startInternal() throws LifecycleException {
         super.startInternal();
         final ClassLoader webappCl = super.getClassLoader();
-        tomEEClassLoader = new TomEEClassLoader(appClassLoader, webappCl);
+        tomEEClassLoader = new TomEEClassLoader(appPath, appClassLoader, webappCl);
         try {
              DirContextURLStreamHandler.bind(tomEEClassLoader, getContainer().getResources());
         } catch (Throwable t) {
@@ -58,11 +63,13 @@ public class TomEEWebappLoader extends W
     public static class TomEEClassLoader extends ClassLoader {
         private ClassLoader app;
         private ClassLoader webapp;
+        private String appPath;
 
-        public TomEEClassLoader(final ClassLoader appCl, final ClassLoader webappCl) {
+        public TomEEClassLoader(final String appId, final ClassLoader appCl, final ClassLoader webappCl) {
             super(webappCl); // in fact this classloader = webappclassloader since we add nothing to this
-            app = appCl; // only used to manage resources since webapp.getParent() should be app
-            webapp = webappCl;
+            this.appPath = appId;
+            this.app = appCl; // only used to manage resources since webapp.getParent() should be app
+            this.webapp = webappCl;
         }
 
         /**
@@ -73,27 +80,72 @@ public class TomEEWebappLoader extends W
          * @throws IOException
          */
         @Override public Enumeration<URL> getResources(final String name) throws IOException {
-            List<URL> urls = new ArrayList<URL>();
+            final List<URL> urls = new ArrayList<URL>();
 
             if (webapp instanceof WebappClassLoader && ((WebappClassLoader) webapp).isStarted() || webapp.getParent() == null) { // we set a parent so if it is null webapp was detroyed
-                addIfNotExist(urls, app.getResources(name), true);
-                addIfNotExist(urls, webapp.getResources(name), false);
-                return new ArrayEnumeration(urls);
+                add(urls, app.getResources(name));
+                add(urls, webapp.getResources(name));
+                return new ArrayEnumeration(clear(urls));
             }
             return app.getResources(name);
         }
 
-        private static void addIfNotExist(Collection<URL> urls, Enumeration<URL> enumUrls, boolean force) {
+        private List<URL> clear(List<URL> urls) { // take care of antiJarLocking
+        	final List<URL> clean = new ArrayList<URL>();
+        	for (URL url : urls) {
+	            final String urlStr = url.toExternalForm();
+	            URL jarUrl = null;
+	            if (urlStr.contains("!")) {
+	            	try {
+						jarUrl = new URL(urlStr.substring(0, urlStr.lastIndexOf('!'))  + "!/");
+					} catch (MalformedURLException e) {
+						// ignored
+					}
+	            }
+	
+	            if (jarUrl != null) {
+	            	final URL cachedFile = ClassLoaderUtil.getUrlKeyCached(appPath, file(jarUrl));
+	            	if (cachedFile != null) {
+	                	URL resource = null;
+						try {
+							resource = new URL("jar:file:" + cachedFile.getFile() + urlStr.substring(urlStr.lastIndexOf('!')));
+						} catch (MalformedURLException e) {
+							// ignored
+						}
+	                	if (resource != null && !clean.contains(resource)) {
+							clean.add(resource);
+	                	}
+	            	}
+	            } else if (clean.contains(url)) {
+	                clean.add(url);
+	            }
+        	}
+			return clean;
+		}
+
+		private void add(Collection<URL> urls, Enumeration<URL> enumUrls) {
             try {
                 while (enumUrls.hasMoreElements()) {
-                    URL url = enumUrls.nextElement();
-                    if (force || !urls.contains(url)) {
-                        urls.add(url);
-                    }
+                    final URL url = enumUrls.nextElement();
+                    urls.add(url);
                 }
             } catch (IllegalStateException ese) {
                 // ignored: if jars are already closed...shutdown for instance
             }
         }
+
+		private static File file(URL jarUrl) {
+			String urlAsString = jarUrl.getFile();
+			if (urlAsString.startsWith("jar:")) {
+				urlAsString = urlAsString.substring(4);
+			}
+			if (urlAsString.startsWith("file:/")) {
+				urlAsString = urlAsString.substring(6);
+			}
+			if (urlAsString.endsWith("!/")) {
+				urlAsString = urlAsString.substring(0, urlAsString.length() - 2);
+			}
+			return new File(urlAsString);
+		}
     }
 }

Modified: openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1231609&r1=1231608&r2=1231609&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original)
+++ openejb/branches/openejb-4.0.0-beta-2/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Sun Jan 15 01:42:24 2012
@@ -333,7 +333,7 @@ public class TomcatWebAppBuilder impleme
                 // but here we have all the classloading logic
                 standardContext.setParentClassLoader(classLoader);
                 standardContext.setDelegate(true);
-                standardContext.setLoader(new TomEEWebappLoader(classLoader));
+                standardContext.setLoader(new TomEEWebappLoader(appInfo.path, classLoader));
                 standardContext.getLoader().setDelegate(true);
 
                 String host = webApp.host;