[jboss-cvs] JBossAS SVN: r97128 - in projects/jboss-jca/trunk: deployers/src/main/java/org/jboss/jca/deployers/fungal and 4 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Sat Nov 28 11:10:42 EST 2009
Author: jesper.pedersen
Date: 2009-11-28 11:10:41 -0500 (Sat, 28 Nov 2009)
New Revision: 97128
Added:
projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/deployers/CloneableDeployer.java
Modified:
projects/jboss-jca/trunk/build.xml
projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/RADeployer.java
projects/jboss-jca/trunk/doc/developerguide/en/modules/fungal.xml
projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/DeploymentDeployer.java
projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/KernelImpl.java
projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/MainDeployer.java
projects/jboss-jca/trunk/web/src/main/java/org/jboss/jca/web/WARDeployer.java
Log:
[JBJCA-224] Support true parallel deployment
Modified: projects/jboss-jca/trunk/build.xml
===================================================================
--- projects/jboss-jca/trunk/build.xml 2009-11-28 13:47:17 UTC (rev 97127)
+++ projects/jboss-jca/trunk/build.xml 2009-11-28 16:10:41 UTC (rev 97128)
@@ -303,6 +303,7 @@
<include name="**/*"/>
</fileset>
</move>
+ <delete dir="${build.dir}/api"/>
<copy todir="${build.dir}/${name}-${major}.${minor}.${patch}.${type}">
<fileset dir="${target.dir}/sjc"/>
Modified: projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/RADeployer.java
===================================================================
--- projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/RADeployer.java 2009-11-28 13:47:17 UTC (rev 97127)
+++ projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/RADeployer.java 2009-11-28 16:10:41 UTC (rev 97128)
@@ -22,6 +22,7 @@
package org.jboss.jca.deployers.fungal;
+import org.jboss.jca.fungal.deployers.CloneableDeployer;
import org.jboss.jca.fungal.deployers.DeployException;
import org.jboss.jca.fungal.deployers.Deployer;
import org.jboss.jca.fungal.deployers.Deployment;
@@ -37,6 +38,7 @@
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.jboss.logging.Logger;
@@ -60,15 +62,13 @@
* @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
* @author <a href="mailto:jeff.zhang at jboss.org">Jeff Zhang</a>
*/
-public class RADeployer implements Deployer
+public class RADeployer implements CloneableDeployer
{
private static Logger log = Logger.getLogger(RADeployer.class);
private static boolean trace = log.isTraceEnabled();
- /**
- * validation optional
- */
- private boolean beanValidation = true;
+ /** Preform bean validation */
+ private static AtomicBoolean beanValidation = new AtomicBoolean(true);
/**
* Constructor
@@ -78,21 +78,21 @@
}
/**
- * setBeanValidation
- * @param value validation optional
+ * Set if bean validation should be performed
+ * @param value The value
*/
public void setBeanValidation(boolean value)
{
- beanValidation = value;
+ beanValidation.set(value);
}
/**
- * getBeanValidation
- * @return validation optional
+ * Should bean validation be performed
+ * @return True if validation; otherwise false
*/
public boolean getBeanValidation()
{
- return beanValidation;
+ return beanValidation.get();
}
/**
@@ -250,7 +250,7 @@
// Bean validation
- if (beanValidation)
+ if (getBeanValidation())
{
JBossRA20Base jrmd20 = null;
List<Class> groupsClasses = null;
@@ -366,4 +366,17 @@
}
return list.toArray(new URL[list.size()]);
}
+
+ /**
+ * Clone
+ * @return The copy of the object
+ * @exception CloneNotSupportedException Thrown if a copy can't be created
+ */
+ public Deployer clone() throws CloneNotSupportedException
+ {
+ RADeployer copy = new RADeployer();
+ copy.setBeanValidation(getBeanValidation());
+
+ return copy;
+ }
}
Modified: projects/jboss-jca/trunk/doc/developerguide/en/modules/fungal.xml
===================================================================
--- projects/jboss-jca/trunk/doc/developerguide/en/modules/fungal.xml 2009-11-28 13:47:17 UTC (rev 97127)
+++ projects/jboss-jca/trunk/doc/developerguide/en/modules/fungal.xml 2009-11-28 16:10:41 UTC (rev 97128)
@@ -6,7 +6,7 @@
<title>Overview</title>
<para>The JBoss JCA/Fungal kernel is a Plain Old Java Object (POJO) based kernel which
- can build a simple container environment for Java services.</para>
+ can build a container environment for Java services.</para>
<para>The kernel features</para>
@@ -37,6 +37,8 @@
</listitem>
</itemizedlist>
+ <para>The focus of the Fungal kernel is simplicity and high performance.</para>
+
</section>
<section id="fungal_configuration">
@@ -202,6 +204,9 @@
<para>Furthermore the dependencies between beans are recorded in order to be able to safely shutdown
deployments.</para>
+ <para>Note, that all deployment units in the <code>deploy</code> directory are booted in sequence
+ defined by the <code>File.listFiles()</code> method.</para>
+
</section>
<section id="fungal_classloading">
@@ -259,6 +264,38 @@
deployment unit or <code>null</code> if a deployment unit wasn't
created.</para>
+ <para>The implementation of the deployer bean must be thread-safe. This can be done by
+ using the <code>synchronized</code> keyword on the <code>deploy</code> method.</para>
+
+ <section id="fungal_deployers_advanced">
+ <title>Advanced deployers</title>
+
+ <para>The kernel supports deploying multiple artifacts of the same type at the same time
+ for optimal performance.</para>
+
+ <para>If a deployer supports this mechanism it must implement the</para>
+ <programlisting>
+org.jboss.jca.fungal.deployers.CloneableDeployer
+ </programlisting>
+ <para>interface.</para>
+
+ <para>The interface contains the</para>
+ <programlisting>
+/**
+ * Clone the deployer
+ * @return A copy of the deployer
+ * @exception CloneNotSupportedException Thrown if the copy operation isn't supported
+ */
+public Deployer clone() throws CloneNotSupportedException;
+ </programlisting>
+ <para>method which constructs a new instance of the deployer.</para>
+
+ <para>Implementing this interface means that the <code>deploy</code> method doesn't have
+ to be <code>synchronized</code>. However any state that should be shared between
+ all the deployer instances should be <code>static</code> and have atomic access.</para>
+
+ </section>
+
</section>
<section id="fungal_remote_protocol">
Added: projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/deployers/CloneableDeployer.java
===================================================================
--- projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/deployers/CloneableDeployer.java (rev 0)
+++ projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/deployers/CloneableDeployer.java 2009-11-28 16:10:41 UTC (rev 97128)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008-2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.jca.fungal.deployers;
+
+import java.net.URL;
+
+/**
+ * The deployer interface for JCA/Fungal
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ */
+public interface CloneableDeployer extends Deployer
+{
+ /**
+ * Clone the deployer
+ * @return A copy of the deployer
+ * @exception CloneNotSupportedException Thrown if the copy operation isn't supported
+ *
+ */
+ public Deployer clone() throws CloneNotSupportedException;
+}
Modified: projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/DeploymentDeployer.java
===================================================================
--- projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/DeploymentDeployer.java 2009-11-28 13:47:17 UTC (rev 97127)
+++ projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/DeploymentDeployer.java 2009-11-28 16:10:41 UTC (rev 97128)
@@ -22,6 +22,7 @@
package org.jboss.jca.fungal.impl;
+import org.jboss.jca.fungal.deployers.CloneableDeployer;
import org.jboss.jca.fungal.deployers.DeployException;
import org.jboss.jca.fungal.deployers.Deployer;
import org.jboss.jca.fungal.deployers.Deployment;
@@ -50,14 +51,11 @@
* The deployment deployer (deploys .xml files)
* @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
*/
-public class DeploymentDeployer implements Deployer
+public class DeploymentDeployer implements CloneableDeployer
{
/** The kernel */
private KernelImpl kernel;
- /** Bean latch */
- private CountDownLatch beansLatch;
-
/** Logging */
private static Object logging;
@@ -71,7 +69,6 @@
throw new IllegalArgumentException("Kernel is null");
this.kernel = kernel;
- this.beansLatch = null;
if (logging == null)
initLogging(kernel.getKernelClassLoader());
@@ -103,10 +100,12 @@
kernel.setBeanStatus(bt.getName(), ServiceLifecycle.NOT_STARTED);
}
+ kernel.beansRegistered();
+
List<BeanDeployer> deployers = new ArrayList<BeanDeployer>(deployment.getBean().size());
List<String> beans = Collections.synchronizedList(new ArrayList<String>(deployment.getBean().size()));
- beansLatch = new CountDownLatch(deployment.getBean().size());
+ final CountDownLatch beansLatch = new CountDownLatch(deployment.getBean().size());
for (BeanType bt : deployment.getBean())
{
@@ -306,10 +305,11 @@
{
ServiceLifecycle dependencyStatus = kernel.getBeanStatus(dependency);
- if (dependencyStatus == null)
+ if (dependencyStatus == null && kernel.isAllBeansRegistered())
throw new DeployException("Unknown dependency: " + dependency);
- if (dependencyStatus != ServiceLifecycle.STARTED && dependencyStatus != ServiceLifecycle.ERROR)
+ if (dependencyStatus == null ||
+ (dependencyStatus != ServiceLifecycle.STARTED && dependencyStatus != ServiceLifecycle.ERROR))
count += 1;
}
@@ -854,4 +854,14 @@
System.out.println(s);
}
}
+
+ /**
+ * Clone
+ * @return The copy of the object
+ * @exception CloneNotSupportedException Thrown if a copy can't be created
+ */
+ public Deployer clone() throws CloneNotSupportedException
+ {
+ return new DeploymentDeployer(kernel);
+ }
}
Modified: projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/KernelImpl.java
===================================================================
--- projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/KernelImpl.java 2009-11-28 13:47:17 UTC (rev 97127)
+++ projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/KernelImpl.java 2009-11-28 16:10:41 UTC (rev 97128)
@@ -32,20 +32,24 @@
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
@@ -72,6 +76,9 @@
/** Bean dependants */
private ConcurrentMap<String, Set<String>> beanDependants = new ConcurrentHashMap<String, Set<String>>();
+ /** Bean deployments */
+ private AtomicInteger beanDeployments;
+
/** Kernel thread pool */
private ThreadPoolExecutor threadPoolExecutor;
@@ -103,6 +110,7 @@
public KernelImpl(KernelConfiguration kc)
{
this.kernelConfiguration = kc;
+ this.beanDeployments = new AtomicInteger(0);
this.temporaryEnvironment = false;
}
@@ -128,11 +136,12 @@
BlockingQueue<Runnable> threadPoolQueue = new SynchronousQueue<Runnable>(true);
ThreadFactory tf = new FungalThreadFactory(tg);
- threadPoolExecutor = new ThreadPoolExecutor(1, Integer.MAX_VALUE,
+ threadPoolExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Integer.MAX_VALUE,
60, TimeUnit.SECONDS,
threadPoolQueue,
tf);
+ threadPoolExecutor.allowCoreThreadTimeOut(true);
threadPoolExecutor.prestartAllCoreThreads();
File root = null;
@@ -221,22 +230,17 @@
// Bootstrap urls
if (bootstrap != null)
{
+ beanDeployments = new AtomicInteger(bootstrap.getUrl().size());
+
+ List<URL> bootstrapUrls = new ArrayList<URL>(bootstrap.getUrl().size());
+
for (String url : bootstrap.getUrl())
{
- try
- {
- URL fullPath = new URL(configDirectory.toURI().toURL().toExternalForm() + url);
-
- if (isDebugEnabled())
- debug("URL=" + fullPath.toString());
-
- mainDeployer.deploy(fullPath, kernelClassLoader);
- }
- catch (Throwable deployThrowable)
- {
- error(deployThrowable.getMessage(), deployThrowable);
- }
+ URL fullPath = new URL(configDirectory.toURI().toURL().toExternalForm() + url);
+ bootstrapUrls.add(fullPath);
}
+
+ deployUrls(bootstrapUrls.toArray(new URL[bootstrapUrls.size()]));
}
}
}
@@ -244,19 +248,14 @@
// Deploy all files in deploy/
if (deployDirectory != null && deployDirectory.exists() && deployDirectory.isDirectory())
{
- for (File f : deployDirectory.listFiles())
+ File[] files = deployDirectory.listFiles();
+
+ if (files != null)
{
- try
+ for (File f : files)
{
- if (isDebugEnabled())
- debug("URL=" + f.toURI().toURL().toExternalForm());
-
- mainDeployer.deploy(f.toURI().toURL(), kernelClassLoader);
- }
- catch (Throwable deployThrowable)
- {
- error(deployThrowable.getMessage(), deployThrowable);
- }
+ deployUrls(new URL[] {f.toURI().toURL()});
+ }
}
}
@@ -271,6 +270,59 @@
}
/**
+ * Deploy URLs
+ * @param urls The URLs
+ */
+ private void deployUrls(URL[] urls)
+ {
+ if (urls != null && urls.length > 0)
+ {
+ try
+ {
+ List<UnitDeployer> unitDeployers = new ArrayList<UnitDeployer>(urls.length);
+
+ final CountDownLatch unitLatch = new CountDownLatch(urls.length);
+
+ for (URL url : urls)
+ {
+ try
+ {
+ if (isDebugEnabled())
+ debug("URL=" + url.toString());
+
+ MainDeployer deployer = (MainDeployer)mainDeployer.clone();
+ UnitDeployer unitDeployer = new UnitDeployer(url, deployer, kernelClassLoader, unitLatch);
+ unitDeployers.add(unitDeployer);
+
+ getExecutorService().execute(unitDeployer);
+ }
+ catch (Throwable deployThrowable)
+ {
+ error(deployThrowable.getMessage(), deployThrowable);
+ }
+ }
+
+ unitLatch.await();
+
+ Iterator<UnitDeployer> it = unitDeployers.iterator();
+ while (it.hasNext())
+ {
+ UnitDeployer deployer = it.next();
+ if (deployer.getThrowable() != null)
+ {
+ Throwable t = deployer.getThrowable();
+ error(t.getMessage(), t);
+ }
+ }
+ }
+ catch (Throwable t)
+ {
+ error(t.getMessage(), t);
+ }
+ }
+ }
+
+ /**
* Shutdown
* @exception Throwable Thrown if an error occurs
*/
@@ -497,12 +549,36 @@
}
/**
+ * Beans registered
+ */
+ void beansRegistered()
+ {
+ beanDeployments.decrementAndGet();
+ }
+
+ /**
+ * Is all beans registered
+ * @return True if all beans have been registered; otherwise false
+ */
+ boolean isAllBeansRegistered()
+ {
+ return beanDeployments.get() <= 0;
+ }
+
+ /**
* Get the main deployer
* @return The main deployer
*/
public MainDeployer getMainDeployer()
{
- return mainDeployer;
+ try
+ {
+ return (MainDeployer)mainDeployer.clone();
+ }
+ catch (CloneNotSupportedException cnse)
+ {
+ return mainDeployer;
+ }
}
/**
@@ -760,4 +836,68 @@
System.out.println(s);
}
}
+
+ /**
+ * Unit deployer
+ */
+ static class UnitDeployer implements Runnable
+ {
+ /** Unit URL */
+ private URL url;
+
+ /** Main deployer */
+ private MainDeployer deployer;
+
+ /** Class loader */
+ private ClassLoader classLoader;
+
+ /** Unit latch */
+ private CountDownLatch unitLatch;
+
+ /** Throwable */
+ private Throwable throwable;
+
+ /**
+ * Constructor
+ */
+ public UnitDeployer(final URL url,
+ final MainDeployer deployer,
+ final ClassLoader classLoader,
+ final CountDownLatch unitLatch)
+ {
+ this.url = url;
+ this.deployer = deployer;
+ this.classLoader = classLoader;
+ this.unitLatch = unitLatch;
+ this.throwable = null;
+ }
+
+ /**
+ * Run
+ */
+ public void run()
+ {
+ SecurityActions.setThreadContextClassLoader(classLoader);
+
+ try
+ {
+ deployer.deploy(url, classLoader);
+ }
+ catch (Throwable t)
+ {
+ throwable = t;
+ }
+
+ unitLatch.countDown();
+ }
+
+ /**
+ * Get deploy exception
+ * @return null if no error; otherwise the exception
+ */
+ public Throwable getThrowable()
+ {
+ return throwable;
+ }
+ }
}
Modified: projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/MainDeployer.java
===================================================================
--- projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/MainDeployer.java 2009-11-28 13:47:17 UTC (rev 97127)
+++ projects/jboss-jca/trunk/fungal/src/main/java/org/jboss/jca/fungal/impl/MainDeployer.java 2009-11-28 16:10:41 UTC (rev 97128)
@@ -22,21 +22,25 @@
package org.jboss.jca.fungal.impl;
+import org.jboss.jca.fungal.deployers.CloneableDeployer;
import org.jboss.jca.fungal.deployers.Deployer;
import org.jboss.jca.fungal.deployers.Deployment;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* The main deployer for JBoss JCA/Fungal
* @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
*/
-public class MainDeployer implements MainDeployerMBean
+public class MainDeployer implements Cloneable, MainDeployerMBean
{
+ private static List<Deployer> deployers = new CopyOnWriteArrayList<Deployer>();
+
private KernelImpl kernel;
- private List<Deployer> deployers;
+ private List<Deployer> copy;
/**
* Constructor
@@ -48,7 +52,7 @@
throw new IllegalArgumentException("Kernel is null");
this.kernel = kernel;
- this.deployers = new ArrayList<Deployer>();
+ this.copy = null;
}
/**
@@ -68,7 +72,7 @@
* @param url The URL for the deployment
* @exception Throwable If an error occurs
*/
- public synchronized void deploy(URL url) throws Throwable
+ public void deploy(URL url) throws Throwable
{
deploy(url, kernel.getKernelClassLoader());
}
@@ -79,7 +83,7 @@
* @param classLoader The parent class loader for the deployment
* @exception Throwable If an error occurs
*/
- public synchronized void deploy(URL url, ClassLoader classLoader) throws Throwable
+ public void deploy(URL url, ClassLoader classLoader) throws Throwable
{
if (url == null)
throw new IllegalArgumentException("URL is null");
@@ -87,11 +91,36 @@
if (classLoader == null)
throw new IllegalArgumentException("ClassLoader is null");
+ if (copy == null || copy.size() != deployers.size())
+ {
+ copy = new ArrayList<Deployer>(deployers.size());
+ for (Deployer deployer : deployers)
+ {
+ if (deployer instanceof CloneableDeployer)
+ {
+ try
+ {
+ copy.add(((CloneableDeployer)deployer).clone());
+ }
+ catch (CloneNotSupportedException cnse)
+ {
+ // Add the deployer and assume synchronized access
+ copy.add(deployer);
+ }
+ }
+ else
+ {
+ // Assume synchronized access to deploy()
+ copy.add(deployer);
+ }
+ }
+ }
+
boolean done = false;
- for (int i = 0; !done && i < deployers.size(); i++)
+ for (int i = 0; !done && i < copy.size(); i++)
{
- Deployer deployer = deployers.get(i);
+ Deployer deployer = copy.get(i);
Deployment deployment = deployer.deploy(url, classLoader);
if (deployment != null)
@@ -107,7 +136,7 @@
* @param url The URL for the deployment
* @exception Throwable If an error occurs
*/
- public synchronized void undeploy(URL url) throws Throwable
+ public void undeploy(URL url) throws Throwable
{
if (url == null)
throw new IllegalArgumentException("URL is null");
@@ -116,4 +145,14 @@
if (deployment != null)
kernel.shutdownDeployment(deployment);
}
+
+ /**
+ * Clone
+ * @return The copy of the object
+ * @exception CloneNotSupportedException Thrown if a copy can't be created
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return new MainDeployer(kernel);
+ }
}
Modified: projects/jboss-jca/trunk/web/src/main/java/org/jboss/jca/web/WARDeployer.java
===================================================================
--- projects/jboss-jca/trunk/web/src/main/java/org/jboss/jca/web/WARDeployer.java 2009-11-28 13:47:17 UTC (rev 97127)
+++ projects/jboss-jca/trunk/web/src/main/java/org/jboss/jca/web/WARDeployer.java 2009-11-28 16:10:41 UTC (rev 97128)
@@ -81,7 +81,7 @@
* @return The deployment
* @exception DeployException Thrown if an error occurs during deployment
*/
- public Deployment deploy(URL url, ClassLoader parent) throws DeployException
+ public synchronized Deployment deploy(URL url, ClassLoader parent) throws DeployException
{
if (url == null || !(url.toExternalForm().endsWith(".war") || url.toExternalForm().endsWith(".war/")))
return null;
More information about the jboss-cvs-commits
mailing list