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