[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