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);