Author: rmannibucau
Date: Wed Jan 11 23:42:20 2012
New Revision: 1230327

URL: http://svn.apache.org/viewvc?rev=1230327&view=rev
Log:
trying to remove duplicated urls taking into account antijarlocking

Modified:
    
openejb/trunk/openejb/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: 
openejb/trunk/openejb/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1230327&r1=1230326&r2=1230327&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
 (original)
+++ 
openejb/trunk/openejb/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
 Wed Jan 11 23:42:20 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/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java?rev=1230327&r1=1230326&r2=1230327&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
 Wed Jan 11 23:42:20 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/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java?rev=1230327&r1=1230326&r2=1230327&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java
 Wed Jan 11 23:42:20 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())) {

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java?rev=1230327&r1=1230326&r2=1230327&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappLoader.java
 Wed Jan 11 23:42:20 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/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1230327&r1=1230326&r2=1230327&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Wed Jan 11 23:42:20 2012
@@ -334,7 +334,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;


Reply via email to