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 2012/01/12 00:42:21 UTC
svn commit: r1230327 - in /openejb/trunk/openejb:
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/java/org/apache/open...
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;