User: stark   
  Date: 01/02/20 22:19:24

  Modified:    src/main/org/jboss/deployment J2eeDeployer.java
  Log:
  Applied patches by David Castro and Tom Coleman et. al for multiple
  ejb jars
  
  Revision  Changes    Path
  1.19      +114 -103  jboss/src/main/org/jboss/deployment/J2eeDeployer.java
  
  Index: J2eeDeployer.java
  ===================================================================
  RCS file: 
/products/cvs/ejboss/jboss/src/main/org/jboss/deployment/J2eeDeployer.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- J2eeDeployer.java 2001/02/15 17:34:20     1.18
  +++ J2eeDeployer.java 2001/02/21 06:19:24     1.19
  @@ -65,7 +65,7 @@
   *  (ContainerFactory for JBoss and EmbededTomcatService for Tomcat).
   *
   *   @author <a href="mailto:[EMAIL PROTECTED]">Daniel Schulze</a>
  -*   @version $Revision: 1.18 $
  +*   @version $Revision: 1.19 $
   */
   public class J2eeDeployer 
   extends ServiceMBeanSupport
  @@ -420,18 +420,16 @@
            }
   
            // JBoss
  -         it = _d.ejbModules.iterator ();
  -         while (it.hasNext ())
  -         {
  -            m = (Deployment.Module)it.next ();
  -            
  -            log.log ("Starting module " + m.name);
  -            
  -            // Call the ContainerFactory that is loaded in the JMX server
  -            server.invoke(jarDeployer, "deploy",
  -               new Object[] { m.localUrls.firstElement().toString () }, new 
String[] { "java.lang.String" });
  -         }       
  -       }
  +         // gather the ejb module urls and deploy the application
  +         Vector tmp = new java.util.Vector();
  +         for( it = _d.ejbModules.iterator(); it.hasNext(); )
  +            tmp.add( ((Deployment.Module) 
it.next()).localUrls.firstElement().toString() );
  +         String[] jarUrls = new String[ tmp.size() ];
  +         tmp.toArray( jarUrls );
  +         // Call the ContainerFactory that is loaded in the JMX server
  +         server.invoke(jarDeployer, "deploy",
  +            new Object[]{ _d.localUrl.toString(), jarUrls }, new String[]{ 
String.class.getName(), String[].class.getName() } );
  +      }
         catch (MBeanException _mbe)
         {
            log.error ("Starting "+m.name+" failed!");
  @@ -445,6 +443,7 @@
         catch (RuntimeMBeanException e)
         {
            log.error ("Starting "+m.name+" failed!");
  +         e.getTargetException ().printStackTrace();
            throw new J2eeDeploymentException ("Error while starting "+m.name+": " + 
e.getTargetException ().getMessage (), e.getTargetException ());
         }
         catch (JMException _jme)
  @@ -468,61 +467,65 @@
      {
         // save the old classloader, tomcat replaces my classloader somehow?!
         ClassLoader oldCl = Thread.currentThread().getContextClassLoader ();
  -      
         StringBuffer error = new StringBuffer ();
  -      ObjectName[] container = new ObjectName[] {jarDeployer, warDeployer};
  -      Iterator modules[] = new Iterator[] {_d.ejbModules.iterator 
(),_d.webModules.iterator ()};
  -      for (int i = 0; i < container.length; ++i)
  +
  +      // stop the jar modules (the ContainerFactory is responsible for undeploying
  +      // all jars associated w/ a given application)
  +      stopModule( jarDeployer, _d.name, _d.localUrl.toString(), error );
  +
  +      // stop the web modules
  +      if( warDeployer != null )
         {
  -         if (container[i] == null && modules[i].hasNext ())
  -         {
  -            // in case we are not running with tomcat
  -            // should only happen for tomcat (i=1)
  -            log.warning("Cannot find web container");
  -            continue;
  -         }         
  -         
  -         while (modules[i].hasNext ())
  +         for( Iterator webModules = _d.webModules.iterator(); webModules.hasNext(); 
)
            {
  -            Deployment.Module m = (Deployment.Module)modules[i].next ();
  -            try
  -            {
  -               // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX 
server
  -               Object result = server.invoke(container[i], "isDeployed",
  -                  new Object[] { m.localUrls.firstElement ().toString () }, new 
String[] { "java.lang.String" });
  -               if (((Boolean)result).booleanValue ())
  -               {
  -                  
  -                  log.log ("Stopping module " + m.name);
  -                  server.invoke(container[i], "undeploy",
  -                     new Object[] { m.localUrls.firstElement ().toString () }, new 
String[] { "java.lang.String" });
  -               }
  -               else
  -                  log.log ("Module " + m.name+" is not running");
  -            
  -            }
  -            catch (MBeanException _mbe) 
  -            {
  -               log.error ("Unable to stop module " + m.name + ": " + 
_mbe.getTargetException ().getMessage ());
  -               error.append("Unable to stop module " + m.name + ": " + 
_mbe.getTargetException ().getMessage ());
  -               error.append ("/n");
  -            } 
  -            catch (JMException _jme)
  -            {
  -               log.error ("Unable to stop module " + m.name + ": " + 
_jme.getMessage ());
  -               error.append("Unable to stop module " + m.name + ": fatal error 
while calling "+container[i]+": " + _jme.getMessage ());
  -               error.append ("/n");
  -            }
  +            Deployment.Module m = (Deployment.Module)webModules.next ();
  +            stopModule( warDeployer, m.name, m.localUrls.firstElement().toString(), 
error );
            }
         }
  -      if (!error.toString ().equals (""))
  -         // there was at least one error...
  -      throw new J2eeDeploymentException ("Error(s) on stopping application 
"+_d.name+":\n"+error.toString ());
  +      else
  +      {
  +         // in case we are not running with tomcat
  +         // should only happen for tomcat (i=1)
  +         log.warning("Cannot find web container");
  +      }
  +
  +      if (!error.toString ().equals ("")) // there was at least one error...
  +        throw new J2eeDeploymentException ("Error(s) on stopping application 
"+_d.name+":\n"+error.toString ());
   
         // restore the classloader
         Thread.currentThread().setContextClassLoader (oldCl);
      }
  -   
  +
  +   private void stopModule( ObjectName container, String moduleName, String 
moduleUrl, StringBuffer error )
  +   {
  +      try
  +      {
  +         // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX server
  +         Object result = server.invoke(container, "isDeployed",
  +            new Object[] { moduleUrl }, new String[] { "java.lang.String" });
  +         if (((Boolean)result).booleanValue ())
  +         {
  +            log.log ("Stopping module " + moduleName);
  +            server.invoke(container, "undeploy",
  +              new Object[] { moduleUrl }, new String[] { "java.lang.String" });
  +         }
  +         else
  +            log.log ("Module " + moduleName + " is not running");
  +      }
  +      catch (MBeanException _mbe)
  +      {
  +         log.error ("Unable to stop module " + moduleName + ": " + 
_mbe.getTargetException ().getMessage ());
  +         error.append("Unable to stop module " + moduleName + ": " + 
_mbe.getTargetException ().getMessage ());
  +         error.append ("/n");
  +      }
  +      catch (JMException _jme)
  +      {
  +         log.error ("Unable to stop module " + moduleName + ": " + _jme.getMessage 
());
  +         error.append("Unable to stop module " + moduleName + ": fatal error while 
calling " + container + ": " + _jme.getMessage ());
  +         error.append ("/n");
  +      }
  +   }
  +
      /** Checks the Deplyment if it is correctly deployed.
      *   @param app to check
      *   @throws J2eeDeploymentException if some inconsistency in the deployment is
  @@ -533,41 +536,23 @@
         boolean result = false;
         int count = 0;
         int others = 0;
  -      
  -      ObjectName[] container = new ObjectName[] {jarDeployer, warDeployer};
  -      Iterator modules[] = new Iterator[] {_d.ejbModules.iterator 
(),_d.webModules.iterator ()};
  -      for (int i = 0; i < container.length; ++i)
  +
  +
  +      // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX server
  +      Object o = checkModule( jarDeployer, _d.name, _d.localUrl.toString() );
  +
  +      if( o == null )
  +        ++others;
  +      else
  +        result = ((Boolean) o).booleanValue();
  +
  +      if (warDeployer != null )
         {
  -         if (container[i] == null && modules[i].hasNext ())
  -         {
  -            // in case we are not running with tomcat
  -            // should only happen for tomcat (i=1)
  -            log.warning("Cannot find web container");
  -            continue;
  -         }         
  -         
  -         while (modules[i].hasNext ())
  +         for( Iterator webModules = _d.webModules.iterator(); webModules.hasNext(); 
)
            {
  -            Deployment.Module m = (Deployment.Module)modules[i].next ();
  -            Object o = null;
  -            try
  -            {
  -               
  -               log.log ("Checking module " + m.name);
  -               // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX 
server
  -               o = server.invoke(container[i], "isDeployed",
  -                  new Object[] { m.localUrls.firstElement ().toString () }, new 
String[] { "java.lang.String" });
  -            
  -            }
  -            catch (MBeanException _mbe) 
  -            {
  -               log.error ("Error while checking module " + m.name + ": " + 
_mbe.getTargetException ().getMessage ());
  -            } 
  -            catch (JMException _jme)
  -            {
  -               log.error ("Fatal error while checking module " + m.name + ": " + 
_jme.getMessage ());
  -            }
  -            
  +            Deployment.Module m = (Deployment.Module)webModules.next ();
  +            o = checkModule( warDeployer, m.name, 
m.localUrls.firstElement().toString() );
  +
               if (o == null) // had an exception
                  ++others;
               else if (count++ == 0) // first module -> set state
  @@ -576,6 +561,12 @@
                  ++others;
            }
         }
  +      else
  +      {
  +         // in case we are not running with tomcat
  +         log.warning("Cannot find web container");
  +      }
  +
         if (others > 0)
            // there was at least one error...
         throw new J2eeDeploymentException ("Application "+_d.name+" is not correctly 
deployed! ("+
  @@ -585,33 +576,53 @@
            " are not)");
         return result;
      }
  -   
  -   
  -   
  +
  +   private Object checkModule( ObjectName container, String moduleName, String 
moduleUrl )
  +    {
  +            try
  +            {
  +               log.log ("Checking module " + moduleName);
  +               // Call the ContainerFactory/EmbededTomcat that is loaded in the JMX 
server
  +               return server.invoke(container, "isDeployed",
  +                  new Object[] { moduleUrl }, new String[] { "java.lang.String" });
  +            }
  +            catch (MBeanException _mbe)
  +            {
  +               log.error ("Error while checking module " + moduleName + ": " + 
_mbe.getTargetException ().getMessage ());
  +               return null;
  +            }
  +            catch (JMException _jme)
  +            {
  +               log.error ("Fatal error while checking module " + moduleName + ": " 
+ _jme.getMessage ());
  +               return null;
  +            }
  +    }
  +
  +
  +
      /** tests if the web container deployer is available */
      private boolean warDeployerAvailable ()
      {
         return server.isRegistered (warDeployer);
      }
  -   
  -   
  +
  +
      /**
      * creates an application class loader for this deployment
      * this class loader will be shared between jboss and tomcat via the 
contextclassloader
      */
      private void createContextClassLoader(Deployment deployment) {
  -      
  -      // get urls we want all classloaders of this application to share 
  +
  +      // get urls we want all classloaders of this application to share
         URL[] urls = new URL[deployment.commonUrls.size ()];
         for (int i = 0, l = deployment.commonUrls.size (); i < l; ++i)
  -         urls[i] = (URL)deployment.commonUrls.elementAt (i); 
  -      
  +         urls[i] = (URL)deployment.commonUrls.elementAt (i);
  +
         // create classloader
         ClassLoader parent = Thread.currentThread().getContextClassLoader();
         URLClassLoader appCl = new URLClassLoader(urls, parent);
  -      
  +
         // set it as the context class loader for the deployment thread
         Thread.currentThread().setContextClassLoader(appCl);
      }
  -
   }
  
  
  

Reply via email to