Author: rmannibucau
Date: Mon Jan  7 15:30:18 2013
New Revision: 1429845

URL: http://svn.apache.org/viewvc?rev=1429845&view=rev
Log:
TOMEE-710 basic rar deployment from war

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1429845&r1=1429844&r2=1429845&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 Mon Jan  7 15:30:18 2013
@@ -99,6 +99,8 @@ public class DeploymentLoader implements
 
     private static final String ddDir = "META-INF/";
     public static final String EAR_WEBAPP_PERSISTENCE_XML_JARS = 
"ear-webapp-persistence-xml-jars";
+    public static final String RAR_URLS_KEY = "rar-urls";
+    public static final String URLS_KEY = "urls";
     private boolean scanManagedBeans = true;
     private static final Collection<String> KNOWN_DESCRIPTORS = 
Arrays.asList("app-ctx.xml", "module.properties", "application.properties", 
"web.xml", "ejb-jar.xml", "openejb-jar.xml", "env-entries.properties", 
"beans.xml", "ra.xml", "application.xml", "application-client.xml", 
"persistence-fragment.xml", "persistence.xml", "validation.xml", 
NewLoaderLogic.EXCLUSION_FILE);
     private static String ALTDD = 
SystemInstance.get().getOptions().get(OPENEJB_ALTDD_PREFIX, (String) null);
@@ -208,6 +210,8 @@ public class DeploymentLoader implements
                     // ignored
                 }
 
+                addConnectorModules(appModule, webModule);
+
                 addWebPersistenceDD("persistence.xml", otherDD, appModule);
                 addWebPersistenceDD("persistence-fragment.xml", otherDD, 
appModule);
                 addPersistenceUnits(appModule, baseUrl);
@@ -243,6 +247,30 @@ public class DeploymentLoader implements
         }
     }
 
+    private void addConnectorModules(final AppModule appModule, final 
WebModule webModule) throws OpenEJBException {
+        // WEB-INF
+        if (webModule.getAltDDs().containsKey("ra.xml")) {
+            final String jarLocation = new File(webModule.getJarLocation(), 
"/WEB-INF/classes").getAbsolutePath();
+            final ConnectorModule connectorModule = 
createConnectorModule(jarLocation, jarLocation, webModule.getClassLoader(), 
webModule.getModuleId() + "RA");
+            connectorModule.getAltDDs().put("ra.xml", 
webModule.getAltDDs().get("ra.xml"));
+            appModule.getConnectorModules().add(connectorModule);
+        }
+
+        // .rar
+        for (URL url : webModule.getRarUrls()) {
+            try {
+                final File file = URLs.toFile(url);
+                if (file.getName().endsWith(".rar")) {
+                    final String jarLocation = file.getAbsolutePath();
+                    final ConnectorModule connectorModule = 
createConnectorModule(jarLocation, jarLocation, webModule.getClassLoader(), 
null);
+                    appModule.getConnectorModules().add(connectorModule);
+                }
+            } catch (Exception e) {
+                logger.error("error processing url " + url.toExternalForm(), 
e);
+            }
+        }
+    }
+
     protected ClassLoader getOpenEJBClassLoader() {
         return ParentClassLoaderFinder.Helper.get();
     }
@@ -771,21 +799,45 @@ public class DeploymentLoader implements
         }
 
         // determine war class path
-        final URL[] webUrls = getWebappUrls(warFile);
+        final Map<String, URL[]> urls = getWebappUrlsAndRars(warFile);
+
+        final List<URL> webUrls = new ArrayList<URL>();
+        webUrls.addAll(Arrays.asList(urls.get(URLS_KEY)));
+
+        final List<URL> addedUrls = new ArrayList<URL>();
+        for (URL url : urls.get(RAR_URLS_KEY)) { // eager unpack to be able to 
use it in classloader
+            final File[] files = unpack(URLs.toFile(url)).listFiles();
+            if (files != null) {
+                for (File f : files) {
+                    if (f.getName().endsWith(".jar")) {
+                        try {
+                            addedUrls.add(f.toURI().toURL());
+                        } catch (MalformedURLException e) {
+                            logger.warning("War path bad: " + 
f.getAbsolutePath(), e);
+                        }
+                    }
+                }
+            }
+        }
+        webUrls.addAll(addedUrls);
+
+        final URL[] webUrlsArray = webUrls.toArray(new URL[webUrls.size()]);
 
         // in TomEE this is done in init hook since we don't manage tomee 
webapp classloader
         // so here is not the best idea for tomee
         // if we want to manage it in a generic way
         // simply add a boolean shared between tomcat and openejb world
         // to know if we should fire it or not
-        SystemInstance.get().fireEvent(new BeforeDeploymentEvent(webUrls, 
parentClassLoader));
+        SystemInstance.get().fireEvent(new BeforeDeploymentEvent(webUrlsArray, 
parentClassLoader));
 
-        final ClassLoader warClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, webUrls, parentClassLoader);
+        final ClassLoader warClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, webUrlsArray, parentClassLoader);
 
         // create web module
         final WebModule webModule = new WebModule(webApp, contextRoot, 
warClassLoader, warFile.getAbsolutePath(), moduleName);
-        webModule.setUrls(Arrays.asList(webUrls));
-        webModule.setScannableUrls(filterWebappUrls(webUrls, 
descriptors.get(NewLoaderLogic.EXCLUSION_FILE)));
+        webModule.setUrls(webUrls);
+        webModule.setAddedUrls(addedUrls);
+        webModule.setRarUrls(Arrays.asList(urls.get(RAR_URLS_KEY)));
+        webModule.setScannableUrls(filterWebappUrls(webUrlsArray, 
descriptors.get(NewLoaderLogic.EXCLUSION_FILE)));
         webModule.getAltDDs().putAll(descriptors);
         webModule.getWatchedResources().add(warPath);
         webModule.getWatchedResources().add(warFile.getAbsolutePath());
@@ -911,8 +963,9 @@ public class DeploymentLoader implements
         return null;
     }
 
-    public static URL[] getWebappUrls(final File warFile) {
+    public static Map<String, URL[]> getWebappUrlsAndRars(final File warFile) {
         final Set<URL> webClassPath = new HashSet<URL>();
+        final Set<URL> webRars = new HashSet<URL>();
         final File webInfDir = new File(warFile, "WEB-INF");
         try {
             webClassPath.add(new File(webInfDir, "classes").toURI().toURL());
@@ -925,12 +978,19 @@ public class DeploymentLoader implements
             final File[] list = libDir.listFiles();
             if (list != null) {
                 for (final File file : list) {
-                    if (file.getName().endsWith(".jar") || 
file.getName().endsWith(".zip")) {
+                    final String name = file.getName();
+                    if (name.endsWith(".jar") || name.endsWith(".zip")) {
                         try {
                             webClassPath.add(file.toURI().toURL());
                         } catch (MalformedURLException e) {
                             logger.warning("War path bad: " + file, e);
                         }
+                    } else if (name.endsWith(".rar")) {
+                        try {
+                            webRars.add(file.toURI().toURL());
+                        } catch (MalformedURLException e) {
+                            logger.warning("War path bad: " + file, e);
+                        }
                     }
                 }
             }
@@ -942,7 +1002,14 @@ public class DeploymentLoader implements
         }
 
         // create the class loader
-        return webClassPath.toArray(new URL[webClassPath.size()]);
+        final Map<String, URL[]> urls = new HashMap<String, URL[]>();
+        urls.put(URLS_KEY,  webClassPath.toArray(new 
URL[webClassPath.size()]));
+        urls.put(RAR_URLS_KEY,  webRars.toArray(new URL[webRars.size()]));
+        return urls;
+    }
+
+    public static URL[] getWebappUrls(final File warFile) {
+        return getWebappUrlsAndRars(warFile).get("urls");
     }
 
     private static void addWebservices(final WsModule wsModule) throws 
OpenEJBException {

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java?rev=1429845&r1=1429844&r2=1429845&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
 Mon Jan  7 15:30:18 2013
@@ -62,6 +62,8 @@ public class WebModule extends Module im
 
     // keep the list of filtered URL we got after applying include/exclude 
pattern (@See DeploymentsResolver.loadFromClasspath)
     private List<URL> urls;
+    private List<URL> rarUrls;
+    private List<URL> addedUrls;
     private List<URL> scannableUrls;
 
     public WebModule(final WebApp webApp, String contextRoot, final 
ClassLoader classLoader, final String jarLocation, final String moduleId) {
@@ -241,6 +243,25 @@ public class WebModule extends Module im
         return jaxrsProviders;
     }
 
+    public List<URL> getRarUrls() {
+        if (rarUrls == null) {
+            return Collections.emptyList();
+        }
+        return rarUrls;
+    }
+
+    public void setRarUrls(final List<URL> rarUrls) {
+        this.rarUrls = rarUrls;
+    }
+
+    public List<URL> getAddedUrls() {
+        return addedUrls;
+    }
+
+    public void setAddedUrls(final List<URL> addedUrls) {
+        this.addedUrls = addedUrls;
+    }
+
     @Override
     public AppModule appModule() {
         return super.getAppModule();

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java?rev=1429845&r1=1429844&r2=1429845&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/Resources.java
 Mon Jan  7 15:30:18 2013
@@ -45,7 +45,7 @@ import java.util.List;
  * </pre>
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = {"container", "resource", "service"})
+@XmlType(name = "", propOrder = { "container", "resource", "service", 
"connector" })
 @XmlRootElement(name = "resources")
 public class Resources {
 
@@ -58,6 +58,9 @@ public class Resources {
     @XmlElement(name = "Service")
     protected List<Service> service;
 
+    @XmlElement(name = "Connector")
+    protected List<Connector> connector;
+
     public List<Resource> getResource() {
         if (resource == null) {
             resource = new ArrayList<Resource>();
@@ -81,11 +84,20 @@ public class Resources {
         return service;
     }
 
+    private List<Connector> getConnector() {
+        if (connector == null) {
+            connector = new ArrayList<Connector>();
+        }
+        return this.connector;
+    }
+
     public void add(Object service) {
         if (service instanceof Resource) {
             getResource().add((Resource) service);
         } else if (service instanceof Service) {
             getService().add((Service) service);
+        } else if (service instanceof Connector) {
+            getConnector().add((Connector) service);
         }
     }
 }

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=1429845&r1=1429844&r2=1429845&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
 Mon Jan  7 15:30:18 2013
@@ -132,6 +132,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -1033,7 +1034,16 @@ public class TomcatWebAppBuilder impleme
 
                     if (!appModule.isWebapp()) {
                        classLoader = appModule.getClassLoader();
+                    } else {
+                        final ClassLoader loader = 
standardContext.getLoader().getClassLoader();
+                        if (loader instanceof LazyStopWebappClassLoader) {
+                            final LazyStopWebappClassLoader 
lazyStopWebappClassLoader = (LazyStopWebappClassLoader) loader;
+                            for (URL url : 
appModule.getWebModules().iterator().next().getAddedUrls()) {
+                                lazyStopWebappClassLoader.addURL(url);
+                            }
+                        }
                     }
+
                     appContext = a.createApplication(contextInfo.appInfo, 
classLoader);
                     // todo add watched resources to context
                 } catch (Exception e) {


Reply via email to