Author: rmannibucau
Date: Wed Jun 25 19:54:39 2014
New Revision: 1605580

URL: http://svn.apache.org/r1605580
Log:
TOMEE-1258 TOMEE-1259 externalRepositories and webappDefaultConfig

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    
tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1605580&r1=1605579&r2=1605580&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 Wed Jun 25 19:54:39 2014
@@ -917,9 +917,28 @@ public class DeploymentLoader implements
         }
 
         // determine war class path
-        final Map<String, URL[]> urls = getWebappUrlsAndRars(warFile);
 
         final List<URL> webUrls = new ArrayList<URL>();
+
+        // add these urls first to ensure we load classes from here first
+        final String externalRepos = SystemInstance.get().getProperty("tomee." 
+ warFile.getName().replace(".war", "") + ".externalRepositories");
+        List<URL> externalUrls = null;
+        if (externalRepos != null) {
+            externalUrls = new ArrayList<URL>();
+            for (final String additional : externalRepos.split(",")) {
+                final String trim = additional.trim();
+                if (!trim.isEmpty()) {
+                    try {
+                        externalUrls.add(new File(trim).toURI().toURL());
+                    } catch (final MalformedURLException e) {
+                        logger.error(e.getMessage());
+                    }
+                }
+            }
+            webUrls.addAll(externalUrls);
+        }
+
+        final Map<String, URL[]> urls = getWebappUrlsAndRars(warFile);
         webUrls.addAll(Arrays.asList(urls.get(URLS_KEY)));
 
         final List<URL> addedUrls = new ArrayList<URL>();
@@ -963,11 +982,22 @@ public class DeploymentLoader implements
         final ClassLoader warClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, webUrlsArray, parentClassLoader);
 
         // create web module
+        final List<URL> scannableUrls = filterWebappUrls(webUrlsArray, 
descriptors.get(NewLoaderLogic.EXCLUSION_FILE));
+        if (externalUrls != null) {
+            for (final URL url : externalUrls) {
+                if (scannableUrls.contains(url)) {
+                    scannableUrls.remove(url);
+                    scannableUrls.add(0, url);
+                }
+            }
+        }
+
+
         final WebModule webModule = new WebModule(webApp, contextRoot, 
warClassLoader, warFile.getAbsolutePath(), moduleName);
         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.setScannableUrls(scannableUrls);
         webModule.getAltDDs().putAll(descriptors);
         webModule.getWatchedResources().add(warPath);
         webModule.getWatchedResources().add(warFile.getAbsolutePath());

Modified: 
tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java?rev=1605580&r1=1605579&r2=1605580&view=diff
==============================================================================
--- 
tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
 (original)
+++ 
tomee/tomee/trunk/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
 Wed Jun 25 19:54:39 2014
@@ -144,6 +144,12 @@ public abstract class AbstractTomEEMojo 
     @Parameter(property = "tomee-plugin.debugPort", defaultValue = "5005")
     protected int debugPort;
 
+    @Parameter(defaultValue = "${project.basedir}/src/main/webapp", property = 
"tomee-plugin.webappResources")
+    protected File webappResources;
+
+    @Parameter(defaultValue = "${project.build.outputDirectory}", property = 
"tomee-plugin.webappClasses")
+    protected File webappClasses;
+
     @Parameter(defaultValue = "${project.build.directory}/apache-tomee", 
property = "tomee-plugin.catalina-base")
     protected File catalinaBase;
 
@@ -192,9 +198,21 @@ public abstract class AbstractTomEEMojo 
     @Parameter
     private List<String> classpaths;
 
+    /**
+     * forcing nice default for war development (WEB-INF/classes and web 
resources)
+     */
+    @Parameter(property = "tomee-plugin.webappDefaultConfig", defaultValue = 
"false")
+    protected boolean webappDefaultConfig;
+
+    /**
+     * use a real random instead of secure random. saves few ms at startup.
+     */
     @Parameter(property = "tomee-plugin.quick-session", defaultValue = "true")
     protected boolean quickSession;
 
+    /**
+     * force webapp to be reloadable
+     */
     @Parameter(property = "tomee-plugin.force-reloadable", defaultValue = 
"false")
     protected boolean forceReloadable;
 
@@ -265,6 +283,12 @@ public abstract class AbstractTomEEMojo 
     protected List<File> docBases;
 
     /**
+     * for TomEE and wars only, add some external repositories to classloader.
+     */
+    @Parameter
+    protected List<File> externalRepositories;
+
+    /**
      * when you set docBases to src/main/webapp setting it to true will allow 
hot refresh.
      */
     @Parameter(property = "tomee-plugin.skipWarResources", defaultValue = 
"false")
@@ -808,6 +832,11 @@ public abstract class AbstractTomEEMojo 
                 }
             }
         }
+
+        if (webappDefaultConfig) {
+            forceDefaultForNiceWebAppDevelopment();
+        }
+
         if (deactivateStrictServletCompliance) {
             strings.add("-D" + servletCompliance + "=false");
         }
@@ -862,21 +891,26 @@ public abstract class AbstractTomEEMojo 
             strings.add("-Dtomee.noshutdownhook=true");
         }
 
+        String appName = null; // computed lazily
         if (docBases != null && !docBases.isEmpty()) {
             if ("war".equals(packaging)) {
-                final Collection<String> paths = new 
ArrayList<String>(docBases.size());
-                for (final File path : docBases) { // don't use relative paths 
(toString())
-                    paths.add(path.getAbsolutePath());
-                }
-
-                final String appName = destinationName().replace(".war", "");
-                strings.add("-Dtomee." + appName + ".docBases=" + 
Join.join(",", paths));
+                appName = destinationName().replace(".war", "");
+                strings.add("-Dtomee." + appName + ".docBases=" + 
filesToString(docBases));
                 strings.add("-Dtomee." + appName + ".docBases.cache=false"); 
// doesn't work for dev if activated
             } else {
                 getLog().warn("docBases parameter only valid for a war");
             }
         }
 
+        if (externalRepositories != null && !externalRepositories.isEmpty()) {
+            if ("war".equals(packaging)) {
+                appName = appName == null ? destinationName().replace(".war", 
"") : appName;
+                strings.add("-Dtomee." + appName + ".externalRepositories=" + 
filesToString(externalRepositories));
+            } else {
+                getLog().warn("externalRepositories parameter only valid for a 
war");
+            }
+        }
+
         if (skipWarResources) {
             strings.add("-Dtomee.skip-war-resources=" + skipWarResources);
         }
@@ -884,6 +918,43 @@ public abstract class AbstractTomEEMojo 
         return strings;
     }
 
+    private void forceDefaultForNiceWebAppDevelopment() {
+        if (!deployOpenEjbApplication) {
+            getLog().info("Forcing deployOpenEjbApplication=true to be able to 
type 'reload[ENTER]' when classes are updated");
+            deployOpenEjbApplication = true;
+        }
+        if (!forceReloadable) {
+            getLog().info("Forcing forceReloadable=true to be able to type 
'reload[ENTER]' when classes are updated");
+            forceReloadable = true;
+        }
+        if (!skipWarResources) {
+            getLog().info("Forcing skipWarResources=true to be able to refresh 
resources with F5");
+            skipWarResources = true;
+        }
+        if (docBases == null) {
+            docBases = new ArrayList<File>();
+        }
+        if (docBases.isEmpty() && webappResources.exists()) {
+            getLog().info("adding " + webappResources.toString() + " docBase");
+            docBases.add(webappResources);
+        }
+        if (externalRepositories == null) {
+            externalRepositories = new ArrayList<File>();
+        }
+        if (externalRepositories.isEmpty() && webappClasses.exists()) {
+            getLog().info("adding " + webappClasses.toString() + " 
externalRepository");
+            externalRepositories.add(webappClasses);
+        }
+    }
+
+    private static String filesToString(final Collection<File> files) {
+        final Collection<String> paths = new ArrayList<String>(files.size());
+        for (final File path : files) { // don't use relative paths 
(toString())
+            paths.add(path.getAbsolutePath());
+        }
+        return Join.join(",", paths);
+    }
+
     protected Collection<String> availableCommands() {
         return Arrays.asList(QUIT_CMD, EXIT_CMD);
     }

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java?rev=1605580&r1=1605579&r2=1605580&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
 Wed Jun 25 19:54:39 2014
@@ -16,6 +16,7 @@
  */
 package org.apache.tomee.catalina;
 
+import org.apache.catalina.Context;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.loader.WebappClassLoader;
 import org.apache.openejb.OpenEJB;
@@ -42,6 +43,7 @@ import java.util.Iterator;
 public class LazyStopWebappClassLoader extends WebappClassLoader {
     private static final Logger LOGGER = 
Logger.getInstance(LogCategory.OPENEJB, 
LazyStopWebappClassLoader.class.getName());
     private static final ThreadLocal<ClassLoaderConfigurer> INIT_CONFIGURER = 
new ThreadLocal<ClassLoaderConfigurer>();
+    private static final ThreadLocal<Context> CONTEXT = new 
ThreadLocal<Context>();
 
     public static final String TOMEE_WEBAPP_FIRST = "tomee.webapp-first";
 
@@ -165,6 +167,27 @@ public class LazyStopWebappClassLoader e
     public void start() throws LifecycleException {
         super.start(); // do it first otherwise we can't use this as 
classloader
 
+        // mainly for tomee-maven-plugin
+        if (CONTEXT.get() != null) {
+            final String root = 
CONTEXT.get().getServletContext().getRealPath("/");
+            if (root != null) {
+                final String externalRepositories = 
SystemInstance.get().getProperty("tomee." + new File(root).getName() + 
".externalRepositories");
+                if (externalRepositories != null) {
+                    setSearchExternalFirst(true);
+                    for (final String additional : 
externalRepositories.split(",")) {
+                        final String trim = additional.trim();
+                        if (!trim.isEmpty()) {
+                            try { // not addURL to look here first
+                                super.addRepository(new 
File(trim).toURI().toURL().toExternalForm());
+                            } catch (final MalformedURLException e) {
+                                LOGGER.error(e.getMessage());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
         // add configurer enrichments
         if (configurer != null) {
             // add now we removed all we wanted
@@ -259,8 +282,13 @@ public class LazyStopWebappClassLoader e
         INIT_CONFIGURER.set(configurer);
     }
 
-    public static void cleanInitContext() {
+    public static void initContext(final Context ctx) {
+        CONTEXT.set(ctx);
+    }
+
+    public static void cleanContext() {
         INIT_CONFIGURER.remove();
+        CONTEXT.remove();
     }
 
     private static class NoClassClassLoader extends ClassLoader {

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java?rev=1605580&r1=1605579&r2=1605580&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java
 Wed Jun 25 19:54:39 2014
@@ -104,10 +104,11 @@ public class ProvisioningWebappLoader ex
         Reflections.set(this, "virtualClasspath", cp);
 
         LazyStopWebappClassLoader.initContext(configurer);
+        
LazyStopWebappClassLoader.initContext(Context.class.cast(getContainer()));
         try {
             super.startInternal();
         } finally {
-            LazyStopWebappClassLoader.cleanInitContext();
+            LazyStopWebappClassLoader.cleanContext();
         }
     }
 

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1605580&r1=1605579&r2=1605580&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Wed Jun 25 19:54:39 2014
@@ -50,6 +50,7 @@ import org.apache.catalina.deploy.Resour
 import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.ha.tcp.SimpleTcpCluster;
 import org.apache.catalina.loader.VirtualWebappLoader;
+import org.apache.catalina.loader.WebappClassLoader;
 import org.apache.catalina.loader.WebappLoader;
 import org.apache.catalina.session.StandardManager;
 import org.apache.catalina.startup.Constants;
@@ -153,6 +154,7 @@ import java.io.InputStream;
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -1557,15 +1559,17 @@ public class TomcatWebAppBuilder impleme
         }
 
         final Realm realm = standardContext.getRealm();
+        final ClassLoader classLoader = 
standardContext.getLoader().getClassLoader();
+        final Thread thread = Thread.currentThread();
         if (realm != null && !(realm instanceof TomEERealm)
                 && (standardContext.getParent() == null
                 || (standardContext.getParent() != null && 
!realm.equals(standardContext.getParent().getRealm())))) {
-            final ClassLoader originalLoader = 
Thread.currentThread().getContextClassLoader();
-            
Thread.currentThread().setContextClassLoader(standardContext.getLoader().getClassLoader());
+            final ClassLoader originalLoader = thread.getContextClassLoader();
+            thread.setContextClassLoader(classLoader);
             try {
                 standardContext.setRealm(tomeeRealm(realm));
             } finally {
-                Thread.currentThread().setContextClassLoader(originalLoader);
+                thread.setContextClassLoader(originalLoader);
             }
         }
 
@@ -1589,8 +1593,8 @@ public class TomcatWebAppBuilder impleme
 
         // bind extra stuff at the java:comp level which can only be
         // bound after the context is created
-        final ClassLoader originalLoader = 
Thread.currentThread().getContextClassLoader();
-        
Thread.currentThread().setContextClassLoader(standardContext.getLoader().getClassLoader());
+        final ClassLoader originalLoader = thread.getContextClassLoader();
+        thread.setContextClassLoader(classLoader);
 
         final NamingContextListener ncl = 
getNamingContextListener(standardContext);
         final String listenerName = ncl.getName();
@@ -1636,7 +1640,7 @@ public class TomcatWebAppBuilder impleme
         } catch (final NamingException e) {
             // no-op
         } finally {
-            Thread.currentThread().setContextClassLoader(originalLoader);
+            thread.setContextClassLoader(originalLoader);
             ContextAccessController.setReadOnly(listenerName);
         }
 
@@ -1729,7 +1733,7 @@ public class TomcatWebAppBuilder impleme
                 continue;
             }
             try {
-                final Class<?> clazz = 
standardContext.getLoader().getClassLoader().loadClass(className);
+                final Class<?> clazz = classLoader.loadClass(className);
                 if (Valve.class.isAssignableFrom(clazz)) {
                     final Valve valve = (Valve) clazz.newInstance();
                     pipeline.addValve(valve);


Reply via email to