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 2008/03/20 04:46:34 UTC

svn commit: r639144 - in /openejb/branches/openejb-3.0: ./ container/openejb-core/ container/openejb-core/src/main/java/org/apache/openejb/ container/openejb-core/src/main/java/org/apache/openejb/assembler/ container/openejb-core/src/main/java/org/apac...

Author: dblevins
Date: Wed Mar 19 20:46:29 2008
New Revision: 639144

URL: http://svn.apache.org/viewvc?rev=639144&view=rev
Log:
Merging r637617 - http://svn.apache.org/viewvc?rev=637617&view=rev

svn merge -r 637616:637617 https://svn.apache.org/repos/asf/openejb/trunk/openejb3 .

------------------------------------------------------------------------
r637617 | dain | 2008-03-16 10:42:30 -0700 (Sun, 16 Mar 2008) | 5 lines

Fixed Windows file locking problems
Added UrlCache which copies URLs to a temp directory before adding them to a class loader
Removed usage of XBean class loader as UrlCache makes it unnecessary 
Temp class loader can no longer be created directly with URLs.  Instead an application class loader should be created and wrapped with a temp class loader.  The createTempClassLoader in ClassLoaderUtil does exactly this.
Added extensive debug logging to ClassLoaderUtil and UrlCache
------------------------------------------------------------------------

Added:
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/util/JarExtractor.java
      - copied unchanged from r637617, openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/JarExtractor.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java
      - copied unchanged from r637617, openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/UrlCache.java
Removed:
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/JarExtractor.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/core/AntiJarLockingClassLoader.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/core/TempAntiJarLockingClassLoader.java
Modified:
    openejb/branches/openejb-3.0/container/openejb-core/pom.xml
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Undeploy.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/WsDeployer.java
    openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
    openejb/branches/openejb-3.0/pom.xml

Modified: openejb/branches/openejb-3.0/container/openejb-core/pom.xml
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/container/openejb-core/pom.xml?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/container/openejb-core/pom.xml (original)
+++ openejb/branches/openejb-3.0/container/openejb-core/pom.xml Wed Mar 19 20:46:29 2008
@@ -286,10 +286,6 @@
     </dependency>
     <!-- End: JavaMail -->
     <dependency>
-      <groupId>org.apache.xbean</groupId>
-      <artifactId>xbean-classloader</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.openejb</groupId>
       <artifactId>xbean-reflect</artifactId>
     </dependency>

Modified: openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java (original)
+++ openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java Wed Mar 19 20:46:29 2008
@@ -38,43 +38,20 @@
 import java.util.jar.JarFile;
 
 import org.apache.openejb.core.TempClassLoader;
-import org.apache.openejb.core.AntiJarLockingClassLoader;
-import org.apache.openejb.core.TempAntiJarLockingClassLoader;
 import org.apache.openejb.util.URLs;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.LogCategory;
-import org.apache.xbean.classloader.JarFileClassLoader;
-import org.apache.xbean.classloader.NamedClassLoader;
+import org.apache.openejb.util.UrlCache;
 
 /**
  * @version $Revision$ $Date$
  */
 public class ClassLoaderUtil {
-    private static final Logger log = Logger.getInstance(LogCategory.OPENEJB, ClassLoaderUtil.class);
+    private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB, ClassLoaderUtil.class);
     private static final Map<String,List<ClassLoader>> classLoadersByApp = new HashMap<String,List<ClassLoader>>();
     private static final Map<ClassLoader, Set<String>> appsByClassLoader = new HashMap<ClassLoader,Set<String>>();
 
-    private static final boolean antiJarLocking;
-    static {
-        String value = null;
-        for (Map.Entry<Object, Object> entry : System.getProperties().entrySet()) {
-            if (entry.getKey() instanceof String && entry.getValue() instanceof String) {
-                if ("antiJarLocking".equalsIgnoreCase((String) entry.getKey())) {
-                    value = (String) entry.getValue();
-                    break;
-                }
-            }
-        }
-
-        if (value != null) {
-            antiJarLocking = Boolean.valueOf(value);
-        } else {
-            antiJarLocking = System.getProperty("os.name", "unknown").toLowerCase().startsWith("windows");
-        }
-        if (antiJarLocking) {
-            log.error("AntiJarLockingClassLoader enabled");
-        }
-    }
+    private static final UrlCache urlCache = new UrlCache();
 
     public static ClassLoader getContextClassLoader() {
         return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
@@ -85,12 +62,8 @@
     }
 
     public static URLClassLoader createClassLoader(String appId, URL[] urls, ClassLoader parent) {
-        URLClassLoader classLoader;
-        if (antiJarLocking) {
-            classLoader = new AntiJarLockingClassLoader(appId, urls, parent);
-        } else {
-            classLoader = new URLClassLoader(urls, parent);
-        }
+        urls = urlCache.cacheUrls(appId, urls);
+        URLClassLoader classLoader = new URLClassLoader(urls, parent);
 
         List<ClassLoader> classLoaders = classLoadersByApp.get(appId);
         if (classLoaders == null) {
@@ -110,34 +83,29 @@
     }
 
     public static void destroyClassLoader(ClassLoader classLoader) {
-        log.debug("Destroying classLoader " + toString(classLoader));
+        logger.debug("Destroying classLoader " + toString(classLoader));
 
         // remove from the indexes
         Set<String> apps = appsByClassLoader.remove(classLoader);
         if (apps != null) {
-            for (String app : apps) {
-                List<ClassLoader> classLoaders = classLoadersByApp.get(app);
+            for (String appId : apps) {
+                List<ClassLoader> classLoaders = classLoadersByApp.get(appId);
                 if (classLoaders != null) {
                     classLoaders.remove(classLoader);
+                    // if this is the last class loader in the app, clean up the app
+                    if (classLoaders.isEmpty()) {
+                        destroyClassLoader(appId);
+                    }
                 }
             }
         }
 
         // clear the lame openjpa caches
         cleanOpenJPACache(classLoader);
-
-        // destroy the class loader
-        if (classLoader instanceof JarFileClassLoader) {
-            JarFileClassLoader jarFileClassLoader = (JarFileClassLoader) classLoader;
-            jarFileClassLoader.destroy();
-        }
-
-        // clear the sun caches
-        clearClassLoaderCaches();
     }
 
     public static void destroyClassLoader(String appId) {
-        log.debug("Destroying classLoaders for application " + appId);
+        logger.debug("Destroying classLoaders for application " + appId);
 
         List<ClassLoader> classLoaders = classLoadersByApp.remove(appId);
         if (classLoaders != null) {
@@ -154,37 +122,22 @@
                     appsByClassLoader.remove(classLoader);
                     destroyClassLoader(classLoader);
                 } else {
-                    log.debug("ClassLoader " + toString(classLoader) + " held open by the applications" + apps);
+                    logger.debug("ClassLoader " + toString(classLoader) + " held open by the applications" + apps);
                 }
             }
-        } else {
-            log.debug("No class loaders found for application " + appId + ": Known applications are " + classLoadersByApp.keySet());
         }
-        ClassLoaderUtil.clearSunJarFileFactoryCache(appId);
+        urlCache.releaseUrls(appId);
+        clearSunJarFileFactoryCache(appId);
     }
 
     public static URLClassLoader createTempClassLoader(ClassLoader parent) {
-        if (antiJarLocking) {
-            return new TempAntiJarLockingClassLoader(parent);
-        } else {
-            return new TempClassLoader(parent);
-        }
+        return new TempClassLoader(parent);
     }
 
-    public static URLClassLoader createTempClassLoader(URL[] urls) {
-        if (antiJarLocking) {
-            return new TempAntiJarLockingClassLoader(urls);
-        } else {
-            return new TempClassLoader(urls);
-        }
-    }
-
-    public static URLClassLoader createTempClassLoader(URL[] urls, ClassLoader parent) {
-        if (antiJarLocking) {
-            return new TempAntiJarLockingClassLoader(urls, parent);
-        } else {
-            return new TempClassLoader(urls, parent);
-        }
+    public static URLClassLoader createTempClassLoader(String appId, URL[] urls, ClassLoader parent) {
+        URLClassLoader classLoader = createClassLoader(appId, urls, parent);
+        TempClassLoader tempClassLoader = new TempClassLoader(classLoader);
+        return tempClassLoader;
     }
 
     /**
@@ -201,7 +154,7 @@
     }
 
     public static void clearSunJarFileFactoryCache(String jarLocation) {
-        log.debug("Clearing Sun JarFileFactory cache for directory " + jarLocation);
+        logger.debug("Clearing Sun JarFileFactory cache for directory " + jarLocation);
 
         try {
             Class jarFileFactory = Class.forName("sun.net.www.protocol.jar.JarFileFactory");
@@ -235,7 +188,7 @@
         } catch (NoSuchFieldException e) {
             // different version of sun vm?
         } catch (Throwable e) {
-            log.error("Unable to clear Sun JarFileFactory cache", e);
+            logger.error("Unable to clear Sun JarFileFactory cache", e);
         }
     }
 
@@ -287,12 +240,8 @@
     private static String toString(ClassLoader classLoader) {
         if (classLoader == null) {
             return "null";
-        } else if (classLoader instanceof NamedClassLoader) {
-            NamedClassLoader namedClassLoader = (NamedClassLoader) classLoader;
-            return namedClassLoader.getName() + "@" + System.identityHashCode(classLoader);
         } else {
             return classLoader.getClass().getSimpleName() + "@" + System.identityHashCode(classLoader);
         }
     }
-
 }

Modified: openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java (original)
+++ openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java Wed Mar 19 20:46:29 2008
@@ -145,12 +145,9 @@
 
             return appInfo;
         } catch (Throwable e) {
-            // clean up the failed deployment
+            // destroy the class loader for the failed application
             if (appModule != null) {
-                // destroy the temp class loader
-                ClassLoaderUtil.destroyClassLoader(appModule.getClassLoader());
-                // temp class loaders don't have an associated directory, so we need to clear the directory url cache by hand
-                ClassLoaderUtil.clearSunJarFileFactoryCache(appModule.getJarLocation());
+                ClassLoaderUtil.destroyClassLoader(appModule.getJarLocation());
             }
 
             e.printStackTrace();

Modified: openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java (original)
+++ openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java Wed Mar 19 20:46:29 2008
@@ -16,7 +16,7 @@
  */
 package org.apache.openejb.config;
 
-import static org.apache.openejb.config.JarExtractor.delete;
+import static org.apache.openejb.util.JarExtractor.delete;
 
 import java.io.Closeable;
 import java.io.File;
@@ -55,6 +55,7 @@
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.Messages;
 import org.apache.openejb.util.OpenEjbVersion;
+import org.apache.openejb.util.JarExtractor;
 
 /**
  * Deploy EJB beans

Modified: openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original)
+++ openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Wed Mar 19 20:46:29 2008
@@ -17,78 +17,66 @@
  */
 package org.apache.openejb.config;
 
-import static org.apache.openejb.util.URLs.toFile;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import javax.ejb.MessageDriven;
+import javax.ejb.Stateful;
+import javax.ejb.Stateless;
+import javax.xml.bind.JAXBException;
+
+import org.apache.openejb.ClassLoaderUtil;
 import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.ClassLoaderUtil;
 import org.apache.openejb.jee.Application;
-import org.apache.openejb.jee.Module;
-import org.apache.openejb.jee.JaxbJavaee;
-import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.ApplicationClient;
 import org.apache.openejb.jee.Connector;
-import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.JavaWsdlMapping;
+import org.apache.openejb.jee.JaxbJavaee;
 import org.apache.openejb.jee.JspConfig;
+import org.apache.openejb.jee.Module;
 import org.apache.openejb.jee.Taglib;
 import org.apache.openejb.jee.TldTaglib;
-import org.apache.openejb.jee.Webservices;
+import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.jee.WebserviceDescription;
-import org.apache.openejb.jee.JavaWsdlMapping;
+import org.apache.openejb.jee.Webservices;
+import org.apache.openejb.util.JarExtractor;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
-import org.apache.openejb.util.Messages;
 import org.apache.openejb.util.URLs;
+import static org.apache.openejb.util.URLs.toFile;
 import org.apache.xbean.finder.ClassFinder;
 import org.apache.xbean.finder.ResourceFinder;
 import org.apache.xbean.finder.UrlSet;
 import org.xml.sax.SAXException;
 
-import javax.ejb.Stateful;
-import javax.ejb.Stateless;
-import javax.ejb.MessageDriven;
-import javax.xml.bind.JAXBException;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Iterator;
-import java.util.TreeMap;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Collections;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.jar.Attributes;
-import java.util.jar.Manifest;
-import java.util.jar.JarFile;
-import java.util.jar.JarEntry;
-
 /**
  * @version $Revision$ $Date$
  */
 public class DeploymentLoader {
     public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP_CONFIG, "org.apache.openejb.util.resources");
-    private static final Messages messages = new Messages("org.apache.openejb.util.resources");
-
 
     public AppModule load(File jarFile) throws OpenEJBException {
-        ClassLoader classLoader = getClassLoader(jarFile);
-
-        URL baseUrl = getFileUrl(jarFile);
-
-        Class moduleClass;
-        try {
-            moduleClass = discoverModuleType(baseUrl, classLoader, true);
-        } catch (Exception e) {
-            throw new UnknownModuleTypeException("Unable to determine module type for jar: " + baseUrl.toExternalForm(), e);
-        }
-
+        // verify we have a valid file
         String jarPath;
         try {
             jarPath = jarFile.getCanonicalPath();
@@ -96,42 +84,65 @@
             throw new OpenEJBException("Invalid application file path " + jarFile);
         }
 
-        if (AppModule.class.equals(moduleClass)) {
+        URL baseUrl = getFileUrl(jarFile);
 
-            return createAppModule(jarFile, jarPath, classLoader);
+        // create a class loader to use for detection of module type
+        // do not use this class loader for any other purposes... it is
+        // non-temp class loader and usage will mess up JPA
+        ClassLoader doNotUseClassLoader = ClassLoaderUtil.createClassLoader(jarPath, new URL[]{baseUrl}, OpenEJB.class.getClassLoader());
 
-        } else if (EjbModule.class.equals(moduleClass)) {
-            EjbModule ejbModule = createEjbModule(baseUrl, jarPath, classLoader, null);
+        try {
+            // determine the module type
+            Class moduleClass;
+            try {
+                moduleClass = discoverModuleType(baseUrl, ClassLoaderUtil.createTempClassLoader(doNotUseClassLoader), true);
+            } catch (Exception e) {
+                throw new UnknownModuleTypeException("Unable to determine module type for jar: " + baseUrl.toExternalForm(), e);
+            }
 
-            // wrap the EJB Module with an Application Module
-            AppModule appModule = new AppModule(classLoader, ejbModule.getJarLocation());
-            appModule.getEjbModules().add(ejbModule);
+            if (AppModule.class.equals(moduleClass)) {
 
-            // Persistence Units
-            addPersistenceUnits(appModule, classLoader, baseUrl);
+                return createAppModule(jarFile, jarPath);
 
-            return appModule;
-        } else if (ConnectorModule.class.equals(moduleClass)) {
-            ConnectorModule connectorModule = createConnectorModule(URLs.toFilePath(baseUrl), OpenEJB.class.getClassLoader(), null);
+            } else if (EjbModule.class.equals(moduleClass)) {
+                ClassLoader classLoader = ClassLoaderUtil.createTempClassLoader(jarPath, new URL[]{baseUrl}, OpenEJB.class.getClassLoader());
+                EjbModule ejbModule = createEjbModule(baseUrl, jarPath, classLoader, null);
 
-            // Wrap the resource module with an Application Module
-            AppModule appModule = new AppModule(classLoader, connectorModule.getJarLocation());
-            appModule.getResourceModules().add(connectorModule);
+                // wrap the EJB Module with an Application Module
+                AppModule appModule = new AppModule(ejbModule.getClassLoader(), ejbModule.getJarLocation());
+                appModule.getEjbModules().add(ejbModule);
 
-            return appModule;
-        } else if (WebModule.class.equals(moduleClass)) {
-            String moduleId = toFile(baseUrl).getName();
-            String warPath = URLs.toFilePath(baseUrl);
+                // Persistence Units
+                addPersistenceUnits(appModule, baseUrl);
 
-            AppModule appModule = new AppModule(classLoader, warPath);
-            addWebModule(appModule, warPath, OpenEJB.class.getClassLoader(), null, moduleId);
-            return appModule;
-        } else {
-            throw new UnsupportedModuleTypeException("Unsupported module type: "+moduleClass.getSimpleName());
+                return appModule;
+            } else if (ConnectorModule.class.equals(moduleClass)) {
+                String jarLocation = URLs.toFilePath(baseUrl);
+                ConnectorModule connectorModule = createConnectorModule(jarLocation, jarLocation, OpenEJB.class.getClassLoader(), null);
+
+                // Wrap the resource module with an Application Module
+                AppModule appModule = new AppModule(connectorModule.getClassLoader(), jarLocation);
+                appModule.getResourceModules().add(connectorModule);
+
+                return appModule;
+            } else if (WebModule.class.equals(moduleClass)) {
+                String moduleId = toFile(baseUrl).getName();
+                String warPath = URLs.toFilePath(baseUrl);
+
+                AppModule appModule = new AppModule(OpenEJB.class.getClassLoader(), warPath);
+                addWebModule(appModule, warPath, OpenEJB.class.getClassLoader(), null, moduleId);
+                return appModule;
+            } else {
+                throw new UnsupportedModuleTypeException("Unsupported module type: "+moduleClass.getSimpleName());
+            }
+        } finally {
+            // if the application was unpacked appId used to create this class loader will be wrong
+            // We can safely destroy this class loader in either case, as it was not use by any modules
+            ClassLoaderUtil.destroyClassLoader(doNotUseClassLoader);
         }
     }
 
-    protected static AppModule createAppModule(File jarFile, String jarPath, ClassLoader classLoader) throws OpenEJBException {
+    protected static AppModule createAppModule(File jarFile, String jarPath) throws OpenEJBException {
         File appDir = unpack(jarFile);
         try {
             appDir = appDir.getCanonicalFile();
@@ -141,7 +152,8 @@
 
         URL appUrl = getFileUrl(appDir);
 
-        ClassLoader tmpClassLoader = ClassLoaderUtil.createTempClassLoader(new URL[]{appUrl}, OpenEJB.class.getClassLoader());
+        String appId = appDir.getAbsolutePath();
+        ClassLoader tmpClassLoader = ClassLoaderUtil.createTempClassLoader(appId, new URL[]{appUrl}, OpenEJB.class.getClassLoader());
 
         ResourceFinder finder = new ResourceFinder("", tmpClassLoader, appUrl);
 
@@ -199,7 +211,7 @@
                     if (!entry.getKey().matches(".*\\.(jar|war|rar|ear)")) continue;
 
                     try {
-                        ClassLoader moduleClassLoader = ClassLoaderUtil.createTempClassLoader(new URL[]{entry.getValue()}, tmpClassLoader);
+                        ClassLoader moduleClassLoader = ClassLoaderUtil.createTempClassLoader(appId, new URL[]{entry.getValue()}, tmpClassLoader);
 
                         Class moduleType = discoverModuleType(entry.getValue(), moduleClassLoader, true);
                         if (EjbModule.class.equals(moduleType)) {
@@ -281,16 +293,16 @@
             classPath.addAll(rarLibs.values());
             classPath.addAll(extraLibs);
             URL[] urls = classPath.toArray(new URL[classPath.size()]);
-            ClassLoader appClassLoader = ClassLoaderUtil.createTempClassLoader(urls, OpenEJB.class.getClassLoader());
+            ClassLoader appClassLoader = ClassLoaderUtil.createTempClassLoader(appId, urls, OpenEJB.class.getClassLoader());
 
             //
             // Create the AppModule and all nested module objects
             //
 
-            AppModule appModule = new AppModule(appClassLoader, appDir.getAbsolutePath());
+            AppModule appModule = new AppModule(appClassLoader, appId);
             appModule.getAdditionalLibraries().addAll(extraLibs);
             appModule.getAltDDs().putAll(appDescriptors);
-            appModule.getWatchedResources().add(appDir.getAbsolutePath());
+            appModule.getWatchedResources().add(appId);
             if (applicationXmlUrl != null) {
                 appModule.getWatchedResources().add(URLs.toFilePath(applicationXmlUrl));
             }
@@ -306,7 +318,7 @@
 
                     appModule.getEjbModules().add(ejbModule);
                 } catch (OpenEJBException e) {
-                    logger.error("Unable to load EJBs from EAR: " + appDir.getAbsolutePath() + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
+                    logger.error("Unable to load EJBs from EAR: " + appId + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
                 }
             }
 
@@ -321,7 +333,7 @@
 
                     appModule.getClientModules().add(clientModule);
                 } catch (Exception e) {
-                    logger.error("Unable to load App Client from EAR: " + appDir.getAbsolutePath() + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
+                    logger.error("Unable to load App Client from EAR: " + appId + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
                 }
             }
 
@@ -329,11 +341,11 @@
             for (String moduleName : resouceModules.keySet()) {
                 try {
                     URL rarUrl = resouceModules.get(moduleName);
-                    ConnectorModule connectorModule = createConnectorModule(URLs.toFilePath(rarUrl), appClassLoader, moduleName);
+                    ConnectorModule connectorModule = createConnectorModule(appId, URLs.toFilePath(rarUrl), appClassLoader, moduleName);
 
                     appModule.getResourceModules().add(connectorModule);
                 } catch (OpenEJBException e) {
-                    logger.error("Unable to load RAR: " + appDir.getAbsolutePath() + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
+                    logger.error("Unable to load RAR: " + appId + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
                 }
             }
 
@@ -343,12 +355,12 @@
                     URL warUrl = webModules.get(moduleName);
                     addWebModule(appModule, URLs.toFilePath(warUrl), appClassLoader, webContextRoots.get(moduleName), moduleName);
                 } catch (OpenEJBException e) {
-                    logger.error("Unable to load WAR: " + appDir.getAbsolutePath() + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
+                    logger.error("Unable to load WAR: " + appId + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
                 }
             }
 
             // Persistence Units
-            addPersistenceUnits(appModule, classLoader, urls);
+            addPersistenceUnits(appModule, urls);
 
             return appModule;
 
@@ -409,7 +421,7 @@
     }
 
     protected static void addWebModule(AppModule appModule, String warPath, ClassLoader parentClassLoader, String contextRoot, String moduleName) throws OpenEJBException {
-        WebModule webModule = createWebModule(warPath, parentClassLoader, contextRoot, moduleName);
+        WebModule webModule = createWebModule(appModule.getJarLocation(), warPath, parentClassLoader, contextRoot, moduleName);
         appModule.getWebModules().add(webModule);
 
         ClassLoader webClassLoader = webModule.getClassLoader();
@@ -454,11 +466,11 @@
         }
 
         // Persistence Units
-        addPersistenceUnits(appModule, webClassLoader);
+        addPersistenceUnits(appModule);
 
     }
 
-    protected static WebModule createWebModule(String warPath, ClassLoader parentClassLoader, String contextRoot, String moduleName) throws OpenEJBException {
+    protected static WebModule createWebModule(String appId, String warPath, ClassLoader parentClassLoader, String contextRoot, String moduleName) throws OpenEJBException {
         File warFile = new File(warPath);
         warFile = unpack(warFile);
 
@@ -505,7 +517,7 @@
 
         // create the class loader
         URL[] webUrls = webClassPath.toArray(new URL[webClassPath.size()]);
-        ClassLoader warClassLoader = ClassLoaderUtil.createTempClassLoader(webUrls, parentClassLoader);
+        ClassLoader warClassLoader = ClassLoaderUtil.createTempClassLoader(appId, webUrls, parentClassLoader);
 
         // create web module
         WebModule webModule = new WebModule(webApp, contextRoot, warClassLoader, warFile.getAbsolutePath(), moduleName);
@@ -743,7 +755,7 @@
         return urls;
     }
 
-    protected static ConnectorModule createConnectorModule(String rarPath, ClassLoader parentClassLoader, String moduleId) throws OpenEJBException {
+    protected static ConnectorModule createConnectorModule(String appId, String rarPath, ClassLoader parentClassLoader, String moduleId) throws OpenEJBException {
         URL baseUrl;// unpack the rar file
         File rarFile = new File(rarPath);
         rarFile = unpack(rarFile);
@@ -772,7 +784,7 @@
         List<URL> classPath = new ArrayList<URL>();
         classPath.addAll(rarLibs.values());
         URL[] urls = classPath.toArray(new URL[classPath.size()]);
-        ClassLoader appClassLoader = ClassLoaderUtil.createTempClassLoader(urls, parentClassLoader);
+        ClassLoader appClassLoader = ClassLoaderUtil.createTempClassLoader(appId, urls, parentClassLoader);
 
         // create the Resource Module
         ConnectorModule connectorModule = new ConnectorModule(connector, appClassLoader, rarPath, moduleId);
@@ -788,9 +800,10 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    protected static void addPersistenceUnits(AppModule appModule, ClassLoader classLoader, URL... urls) {
+    protected static void addPersistenceUnits(AppModule appModule, URL... urls) {
         try {
-            ResourceFinder finder = new ResourceFinder("", classLoader, urls);
+            // any class loader will do here since we are not calling class loading methods of resource finder
+            ResourceFinder finder = new ResourceFinder("", ClassLoader.getSystemClassLoader(), urls);
             List<URL> persistenceUrls = (List<URL>) appModule.getAltDDs().get("persistence.xml");
             if (persistenceUrls == null) {
                 persistenceUrls = new ArrayList<URL>();
@@ -981,14 +994,5 @@
             throw new OpenEJBException("Malformed URL to app. " + e.getMessage(), e);
         }
         return baseUrl;
-    }
-
-    private ClassLoader getClassLoader(File jarFile) throws OpenEJBException {
-        try {
-            URL[] urls = new URL[]{jarFile.toURL()};
-            return ClassLoaderUtil.createTempClassLoader(urls, OpenEJB.class.getClassLoader());
-        } catch (MalformedURLException e) {
-            throw new OpenEJBException(messages.format("cl0001", jarFile.getAbsolutePath(), e.getMessage()), e);
-        }
     }
 }

Modified: openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Undeploy.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Undeploy.java?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Undeploy.java (original)
+++ openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/Undeploy.java Wed Mar 19 20:46:29 2008
@@ -16,7 +16,7 @@
  */
 package org.apache.openejb.config;
 
-import static org.apache.openejb.config.JarExtractor.delete;
+import static org.apache.openejb.util.JarExtractor.delete;
 
 import java.util.Properties;
 import java.io.File;

Modified: openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/WsDeployer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/WsDeployer.java?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/WsDeployer.java (original)
+++ openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/config/WsDeployer.java Wed Mar 19 20:46:29 2008
@@ -339,6 +339,8 @@
     }
 
     private Definition getWsdl(DeploymentModule module, String wsdlFile) {
+        if (wsdlFile == null) return null;
+
         Object object = module.getAltDDs().get(wsdlFile);
         if (object instanceof Definition) {
             Definition definition = (Definition) object;

Modified: openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java (original)
+++ openejb/branches/openejb-3.0/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java Wed Mar 19 20:46:29 2008
@@ -46,14 +46,6 @@
         super(new URL[0], parent);
     }
 
-    public TempClassLoader(URL[] urls, ClassLoader parent) {
-        super(urls, parent);
-    }
-
-    public TempClassLoader(URL[] urls) {
-        super(urls);
-    }
-
     public Class loadClass(String name) throws ClassNotFoundException {
         return loadClass(name, false);
     }

Modified: openejb/branches/openejb-3.0/pom.xml
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.0/pom.xml?rev=639144&r1=639143&r2=639144&view=diff
==============================================================================
--- openejb/branches/openejb-3.0/pom.xml (original)
+++ openejb/branches/openejb-3.0/pom.xml Wed Mar 19 20:46:29 2008
@@ -780,11 +780,6 @@
         <version>2.0.5</version>
       </dependency>
       <dependency>
-        <groupId>org.apache.xbean</groupId>
-        <artifactId>xbean-classloader</artifactId>
-        <version>3.3</version>
-      </dependency>
-      <dependency>
         <groupId>org.apache.openejb</groupId>
         <artifactId>xbean-finder</artifactId>
         <version>3.4-r636442</version>