You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2011/04/18 10:46:50 UTC

svn commit: r1094359 - in /geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment: EjbModule.java EjbModuleBuilder.java

Author: xuhaihong
Date: Mon Apr 18 08:46:49 2011
New Revision: 1094359

URL: http://svn.apache.org/viewvc?rev=1094359&view=rev
Log:
Release the temp classloader created by OpenEJB module builder.

Modified:
    geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModule.java
    geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java

Modified: geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModule.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModule.java?rev=1094359&r1=1094358&r2=1094359&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModule.java (original)
+++ geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModule.java Mon Apr 18 08:46:49 2011
@@ -28,6 +28,7 @@ import org.apache.geronimo.kernel.config
 import org.apache.geronimo.kernel.repository.Environment;
 import org.apache.geronimo.openejb.GeronimoEjbInfo;
 import org.apache.geronimo.openejb.xbeans.ejbjar.OpenejbGeronimoEjbJarType;
+import org.apache.openejb.ClassLoaderUtil;
 import org.apache.openejb.config.ConfigurationFactory;
 import org.apache.openejb.jee.EjbJar;
 import org.apache.openejb.jee.EnterpriseBean;
@@ -122,6 +123,12 @@ public class EjbModule extends EJBModule
         }
     }
 
+    @Override
+    public void close() {
+        ClassLoaderUtil.destroyClassLoader(ejbModule.getClassLoader());
+        super.close();
+    }
+
     Module newEJb(ClassFinder finder, EnterpriseBean bean) throws DeploymentException {
         Ejb ejb = new Ejb(isStandAlone(), getModuleName(), getName(), getEnvironment(), getModuleFile(), getTargetPath(),
                 bean, getVendorDD(), getOriginalSpecDD(), getNamespace(),

Modified: geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java?rev=1094359&r1=1094358&r2=1094359&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java (original)
+++ geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java Mon Apr 18 08:46:49 2011
@@ -306,149 +306,159 @@ public class EjbModuleBuilder implements
         if (targetPath.endsWith("/"))
             throw new IllegalArgumentException("targetPath must not end with a '/'");
 
-        // verify we have a valid file
-        String jarPath = moduleFile.getName();
-
-        URL baseUrl = null;
         ClassLoader classLoader = null;
-        Map<String, URL> descriptors = null;
         try {
-            File jarFile = new File(moduleFile.getName());
+            // verify we have a valid file
+            String jarPath = moduleFile.getName();
 
-            baseUrl = jarFile.toURI().toURL();
+            URL baseUrl = null;
 
-            classLoader = ClassLoaderUtil.createTempClassLoader(ClassLoaderUtil.createClassLoader(jarPath, new URL[] { baseUrl }, OpenEJB.class.getClassLoader()));
+            Map<String, URL> descriptors = null;
+            try {
+                File jarFile = new File(moduleFile.getName());
 
-            ResourceFinder finder = new ResourceFinder("", classLoader, baseUrl);
+                baseUrl = jarFile.toURI().toURL();
 
-            descriptors = finder.getResourcesMap(ddDir);
-        } catch (IOException e) {
-            throw new DeploymentException(e);
-        }
+                classLoader = ClassLoaderUtil.createTempClassLoader(ClassLoaderUtil.createClassLoader(jarPath, new URL[] { baseUrl }, OpenEJB.class.getClassLoader()));
 
-        if (!isEjbModule(baseUrl, classLoader, descriptors)) {
-            return null;
-        }
+                ResourceFinder finder = new ResourceFinder("", classLoader, baseUrl);
+
+                descriptors = finder.getResourcesMap(ddDir);
+            } catch (IOException e) {
+                throw new DeploymentException(e);
+            }
 
-        // create the EJB Module
-        org.apache.openejb.config.EjbModule ejbModule = new org.apache.openejb.config.EjbModule(classLoader, null, jarPath, null, null);
-        ejbModule.getAltDDs().putAll(descriptors);
+            if (!isEjbModule(baseUrl, classLoader, descriptors)) {
+                releaseTempClassLoader(classLoader);
+                return null;
+            }
 
-        if (specDDUrl != null) {
-            ejbModule.getAltDDs().put("ejb-jar.xml", specDDUrl);
-        }
+            // create the EJB Module
+            org.apache.openejb.config.EjbModule ejbModule = new org.apache.openejb.config.EjbModule(classLoader, null, jarPath, null, null);
+            ejbModule.getAltDDs().putAll(descriptors);
+
+            if (specDDUrl != null) {
+                ejbModule.getAltDDs().put("ejb-jar.xml", specDDUrl);
+            }
+
+            // convert the vendor plan object to the ejbModule altDD map
+            XmlObject unknownXmlObject = null;
+            if (plan instanceof XmlObject) {
+                unknownXmlObject = (XmlObject) plan;
+            } else if (plan != null) {
+                try {
+                    unknownXmlObject = XmlBeansUtil.parse(((File) plan).toURI().toURL(), XmlUtil.class.getClassLoader());
+                } catch (Exception e) {
+                    throw new DeploymentException(e);
+                }
+            }
+
+            if (unknownXmlObject != null) {
+                XmlCursor xmlCursor = unknownXmlObject.newCursor();
+                //
+                QName qname = xmlCursor.getName();
+                if (qname == null) {
+                    xmlCursor.toFirstChild();
+                    qname = xmlCursor.getName();
+                }
+                if (qname.getLocalPart().equals("openejb-jar")) {
+                    ejbModule.getAltDDs().put("openejb-jar.xml", xmlCursor.xmlText());
+                } else if (qname.getLocalPart().equals("ejb-jar") && qname.getNamespaceURI().equals("http://geronimo.apache.org/xml/ns/j2ee/ejb/openejb-2.0")) {
+                    ejbModule.getAltDDs().put("geronimo-openejb.xml", xmlCursor.xmlText());
+                }
+            }
 
-        // convert the vendor plan object to the ejbModule altDD map
-        XmlObject unknownXmlObject = null;
-        if (plan instanceof XmlObject) {
-            unknownXmlObject = (XmlObject) plan;
-        } else if (plan != null) {
+            // Read in the deploument desiptor files
+            ReadDescriptors readDescriptors = new ReadDescriptors();
             try {
-                unknownXmlObject = XmlBeansUtil.parse(((File) plan).toURI().toURL(), XmlUtil.class.getClassLoader());
-            } catch (Exception e) {
-                throw new DeploymentException(e);
+                readDescriptors.deploy(new AppModule(ejbModule));
+            } catch (OpenEJBException e) {
+                throw new DeploymentException("Failed parsing descriptors for module: " + moduleFile.getName(), e);
             }
-        }
 
-        if (unknownXmlObject != null) {
-            XmlCursor xmlCursor = unknownXmlObject.newCursor();
-            //
-            QName qname = xmlCursor.getName();
-            if (qname == null) {
-                xmlCursor.toFirstChild();
-                qname = xmlCursor.getName();
-            }
-            if (qname.getLocalPart().equals("openejb-jar")) {
-                ejbModule.getAltDDs().put("openejb-jar.xml", xmlCursor.xmlText());
-            } else if (qname.getLocalPart().equals("ejb-jar") && qname.getNamespaceURI().equals("http://geronimo.apache.org/xml/ns/j2ee/ejb/openejb-2.0")) {
-                ejbModule.getAltDDs().put("geronimo-openejb.xml", xmlCursor.xmlText());
+            // Get the geronimo-openejb.xml tree
+            boolean standAlone = earEnvironment == null;
+            GeronimoEjbJarType geronimoEjbJarType = (GeronimoEjbJarType) ejbModule.getAltDDs().get("geronimo-openejb.xml");
+            if (geronimoEjbJarType == null) {
+                // create default plan
+                String path = (standAlone) ? new File(moduleFile.getName()).getName() : targetPath;
+                geronimoEjbJarType = XmlUtil.createDefaultPlan(path, ejbModule.getEjbJar());
+                ejbModule.getAltDDs().put("geronimo-openejb.xml", geronimoEjbJarType);
             }
-        }
+            OpenejbGeronimoEjbJarType geronimoOpenejb = XmlUtil.convertToXmlbeans(geronimoEjbJarType);
 
-        // Read in the deploument desiptor files
-        ReadDescriptors readDescriptors = new ReadDescriptors();
-        try {
-            readDescriptors.deploy(new AppModule(ejbModule));
-        } catch (OpenEJBException e) {
-            throw new DeploymentException("Failed parsing descriptors for module: " + moduleFile.getName(), e);
-        }
-
-        // Get the geronimo-openejb.xml tree
-        boolean standAlone = earEnvironment == null;
-        GeronimoEjbJarType geronimoEjbJarType = (GeronimoEjbJarType) ejbModule.getAltDDs().get("geronimo-openejb.xml");
-        if (geronimoEjbJarType == null) {
-            // create default plan
-            String path = (standAlone) ? new File(moduleFile.getName()).getName() : targetPath;
-            geronimoEjbJarType = XmlUtil.createDefaultPlan(path, ejbModule.getEjbJar());
-            ejbModule.getAltDDs().put("geronimo-openejb.xml", geronimoEjbJarType);
-        }
-        OpenejbGeronimoEjbJarType geronimoOpenejb = XmlUtil.convertToXmlbeans(geronimoEjbJarType);
-
-        // create the geronimo environment object
-        Environment environment = XmlUtil.buildEnvironment(geronimoEjbJarType.getEnvironment(), defaultEnvironment);
-        if (earEnvironment != null) {
-            EnvironmentBuilder.mergeEnvironments(earEnvironment, environment);
-            environment = earEnvironment;
-            if (!environment.getConfigId().isResolved()) {
-                throw new IllegalStateException("EJB module ID should be fully resolved (not " + environment.getConfigId() + ")");
+            // create the geronimo environment object
+            Environment environment = XmlUtil.buildEnvironment(geronimoEjbJarType.getEnvironment(), defaultEnvironment);
+            if (earEnvironment != null) {
+                EnvironmentBuilder.mergeEnvironments(earEnvironment, environment);
+                environment = earEnvironment;
+                if (!environment.getConfigId().isResolved()) {
+                    throw new IllegalStateException("EJB module ID should be fully resolved (not " + environment.getConfigId() + ")");
+                }
+            } else {
+                idBuilder.resolve(environment, new File(moduleFile.getName()).getName(), "car");
             }
-        } else {
-            idBuilder.resolve(environment, new File(moduleFile.getName()).getName(), "car");
-        }
 
-        AbstractName moduleName;
-        if (parentModule == null || ".".equals(targetPath)) {
-            AbstractName earName = naming.createRootName(environment.getConfigId(), NameFactory.NULL, NameFactory.J2EE_APPLICATION);
-            moduleName = naming.createChildName(earName, environment.getConfigId().toString(), NameFactory.EJB_MODULE);
-        } else {
-            moduleName = naming.createChildName(parentModule.getModuleName(), targetPath, NameFactory.EJB_MODULE);
-        }
+            AbstractName moduleName;
+            if (parentModule == null || ".".equals(targetPath)) {
+                AbstractName earName = naming.createRootName(environment.getConfigId(), NameFactory.NULL, NameFactory.J2EE_APPLICATION);
+                moduleName = naming.createChildName(earName, environment.getConfigId().toString(), NameFactory.EJB_MODULE);
+            } else {
+                moduleName = naming.createChildName(parentModule.getModuleName(), targetPath, NameFactory.EJB_MODULE);
+            }
 
-        // Create XMLBeans version of EjbJarType for the AnnotatedApp interface
-        EjbJar ejbJar = ejbModule.getEjbJar();
+            // Create XMLBeans version of EjbJarType for the AnnotatedApp interface
+            EjbJar ejbJar = ejbModule.getEjbJar();
 
-        File file = new File(moduleFile.getName());
-        String packageName = file.getName();
+            File file = new File(moduleFile.getName());
+            String packageName = file.getName();
 
-        String name;
+            String name;
 
-        if (subModule) {
-            name = parentModule.getName();
-        } else if (ejbJar.getModuleName() != null) {
-            name = ejbJar.getModuleName().trim();
-        } else if (standAlone || ".".equals(targetPath)) {
-            name = FileUtils.removeExtension(packageName, ".jar");
-        } else {
-            name = FileUtils.removeExtension(targetPath, ".jar");
-        }
+            if (subModule) {
+                name = parentModule.getName();
+            } else if (ejbJar.getModuleName() != null) {
+                name = ejbJar.getModuleName().trim();
+            } else if (standAlone || ".".equals(targetPath)) {
+                name = FileUtils.removeExtension(packageName, ".jar");
+            } else {
+                name = FileUtils.removeExtension(targetPath, ".jar");
+            }
 
-        ejbModule.setModuleId(name);
+            ejbModule.setModuleId(name);
 
-        if (standAlone || ".".equals(targetPath)) {
-            ejbModule.setModuleUri(URI.create(packageName));
-        } else {
-            ejbModule.setModuleUri(URI.create(targetPath));
-        }
+            if (standAlone || ".".equals(targetPath)) {
+                ejbModule.setModuleUri(URI.create(packageName));
+            } else {
+                ejbModule.setModuleUri(URI.create(targetPath));
+            }
 
-        Map<JndiKey, Map<String, Object>> context = null;
-        if (subModule) {
-            context = parentModule.getJndiContext();
-        } else if (parentModule != null) {
-            context = Module.share(Module.APP, parentModule.getJndiContext());
-        }
-        EjbModule module = new EjbModule(ejbModule, standAlone, moduleName, name, environment, moduleFile, targetPath, "", ejbJar, geronimoOpenejb, context, parentModule, subModule);
+            Map<JndiKey, Map<String, Object>> context = null;
+            if (subModule) {
+                context = parentModule.getJndiContext();
+            } else if (parentModule != null) {
+                context = Module.share(Module.APP, parentModule.getJndiContext());
+            }
+            EjbModule module = new EjbModule(ejbModule, standAlone, moduleName, name, environment, moduleFile, targetPath, "", ejbJar, geronimoOpenejb, context, parentModule, subModule);
 
-        for (ModuleBuilderExtension builder : moduleBuilderExtensions) {
-            try {
-                builder.createModule(module, plan, moduleFile, targetPath, specDDUrl, environment, null, parentModule == null ? null : parentModule.getModuleName(), naming, idBuilder);
+            for (ModuleBuilderExtension builder : moduleBuilderExtensions) {
+                try {
+                    builder.createModule(module, plan, moduleFile, targetPath, specDDUrl, environment, null, parentModule == null ? null : parentModule.getModuleName(), naming, idBuilder);
 
-            } catch (Throwable t) {
-                String builderName = builder.getClass().getSimpleName();
-                log.error(builderName + ".createModule() failed: " + t.getMessage(), t);
+                } catch (Throwable t) {
+                    String builderName = builder.getClass().getSimpleName();
+                    log.error(builderName + ".createModule() failed: " + t.getMessage(), t);
 
+                }
             }
+            return module;
+        } catch (DeploymentException e) {
+            releaseTempClassLoader(classLoader);
+            throw e;
+        } catch (Exception e) {
+            releaseTempClassLoader(classLoader);
+            throw new DeploymentException(e);
         }
-        return module;
     }
 
     protected static void unmapReferences(EjbJar ejbJar, GeronimoEjbJarType geronimoEjbJarType) {
@@ -1224,6 +1234,14 @@ public class EjbModuleBuilder implements
         }
     }
 
+    private void releaseTempClassLoader(ClassLoader classLoader) {
+        if (classLoader != null)
+            try {
+                ClassLoaderUtil.destroyClassLoader(classLoader);
+            } catch (Exception e) {
+            }
+    }
+
     public static class EarData {
         public static final EARContext.Key<EarData> KEY = new EARContext.Key<EarData>() {