[jboss-cvs] JBossRemoting/src/main/org/jboss/remoting ...

Tom Elrod tom.elrod at jboss.com
Wed Jul 12 00:49:51 EDT 2006


  User: telrod  
  Date: 06/07/12 00:49:51

  Modified:    src/main/org/jboss/remoting    InvokerLocator.java
                        InvokerRegistry.java ServerInvoker.java
  Log:
  JBREM-496 & JBREM-492 & JBREM-535 - changed invoker loading to use a client and server factory instead of loading classes directly.  This allows users ability to plugin custom transport implementation with zero config.  Also added config for forcing remote call when client and server within same jvm (which was able to do previously using BYVALUE config, but not any more).  Also changed way to get hint if transport supports ssl to be provided by the transport factory instead of the transport itself.
  
  Revision  Changes    Path
  1.20      +9 -2      JBossRemoting/src/main/org/jboss/remoting/InvokerLocator.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: InvokerLocator.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossRemoting/src/main/org/jboss/remoting/InvokerLocator.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -b -r1.19 -r1.20
  --- InvokerLocator.java	21 Jun 2006 19:59:07 -0000	1.19
  +++ InvokerLocator.java	12 Jul 2006 04:49:51 -0000	1.20
  @@ -58,7 +58,7 @@
    *
    * @author <a href="mailto:jhaynie at vocalocity.net">Jeff Haynie</a>
    * @author <a href="mailto:telrod at e2technologies.net">Tom Elrod</a>
  - * @version $Revision: 1.19 $
  + * @version $Revision: 1.20 $
    */
   public class InvokerLocator implements Serializable
   {
  @@ -109,11 +109,18 @@
   
      /**
       * Constant to define the param name to be used when defining if marshalling should be by value,
  -    * which means will be remote client invoker instead of using local client invoker.
  +    * which means will be using local client invoker with cloning of payload value.
       */
      public static final String BYVALUE = "byvalue";
   
      /**
  +    * Constant to define the param name to be used when defining if marshalling should use
  +    * remote client invoker instead of using local client invoker (even though both client and
  +    * server invokers are within same JVM).
  +    */
  +   public static final String FORCE_REMOTE = "force_remote";   
  +
  +   /**
       * Constant to define if client should try to automatically establish a
       * lease with the server.  Value for this parameter key should be either 'true' or 'false'.
       */
  
  
  
  1.33      +181 -132  JBossRemoting/src/main/org/jboss/remoting/InvokerRegistry.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: InvokerRegistry.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossRemoting/src/main/org/jboss/remoting/InvokerRegistry.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -b -r1.32 -r1.33
  --- InvokerRegistry.java	7 Jul 2006 19:49:30 -0000	1.32
  +++ InvokerRegistry.java	12 Jul 2006 04:49:51 -0000	1.33
  @@ -25,10 +25,12 @@
   
   import org.jboss.logging.Logger;
   import org.jboss.remoting.serialization.ClassLoaderUtility;
  +import org.jboss.remoting.transport.ClientFactory;
   import org.jboss.remoting.transport.ClientInvoker;
  +import org.jboss.remoting.transport.ServerFactory;
   import org.jboss.remoting.transport.local.LocalClientInvoker;
   
  -import java.lang.reflect.Constructor;
  +import java.lang.reflect.InvocationTargetException;
   import java.lang.reflect.Method;
   import java.util.ArrayList;
   import java.util.Collection;
  @@ -46,17 +48,13 @@
    *
    * @author <a href="mailto:jhaynie at vocalocity.net">Jeff Haynie</a>
    * @author <a href="mailto:telrod at e2technologies.net">Tom Elrod</a>
  - * @version $Revision: 1.32 $
  + * @version $Revision: 1.33 $
    */
   public class InvokerRegistry
   {
   
      private static final Logger log = Logger.getLogger(InvokerRegistry.class);
   
  -   // holds the invoker classes (alrady loaded)
  -   private static final Map clientInvokers = new HashMap();
  -   private static final Map serverInvokers = new HashMap();
  -
      private static final Map clientLocators = new HashMap();
      private static final Map serverLocators = new HashMap();
   
  @@ -64,37 +62,8 @@
      private static final Object serverLock = new Object();
      private static final Object clientLock = new Object();
   
  -   private static final Map clientInvokerFQN = new HashMap();
  -   private static final Map serverInvokerFQN = new HashMap();
  -
  -   static
  -   {
  -      // auto-register class name (as Strings) of some standard invokers.  Doing String form so can be loaded lazily.
  -      clientInvokerFQN.put("socket", "org.jboss.remoting.transport.socket.SocketClientInvoker");
  -      serverInvokerFQN.put("socket", "org.jboss.remoting.transport.socket.SocketServerInvoker");
  -      clientInvokerFQN.put("sslsocket", "org.jboss.remoting.transport.socket.ssl.SSLSocketClientInvoker");
  -      serverInvokerFQN.put("sslsocket", "org.jboss.remoting.transport.socket.ssl.SSLSocketServerInvoker");
  -      clientInvokerFQN.put("rmi", "org.jboss.remoting.transport.rmi.RMIClientInvoker");
  -      serverInvokerFQN.put("rmi", "org.jboss.remoting.transport.rmi.RMIServerInvoker");
  -      clientInvokerFQN.put("sslrmi", "org.jboss.remoting.transport.rmi.ssl.SSLRMIClientInvoker");
  -      serverInvokerFQN.put("sslrmi", "org.jboss.remoting.transport.rmi.ssl.SSLRMIServerInvoker");
  -      clientInvokerFQN.put("http", "org.jboss.remoting.transport.http.HTTPClientInvoker");
  -      serverInvokerFQN.put("http", "org.jboss.remoting.transport.coyote.CoyoteInvoker");
  -      clientInvokerFQN.put("https", "org.jboss.remoting.transport.http.ssl.HTTPSClientInvoker");
  -      serverInvokerFQN.put("https", "org.jboss.remoting.transport.coyote.CoyoteInvoker");
  -      /*** The legacy http invoker implementation ***
  -       clientInvokerFQN.put("http", "org.jboss.remoting.transport.http.HTTPClientInvoker");
  -       serverInvokerFQN.put("http", "org.jboss.remoting.transport.http.HTTPServerInvoker");
  -       clientInvokerFQN.put("https", "org.jboss.remoting.transport.http.ssl.HTTPSClientInvoker");
  -       serverInvokerFQN.put("https", "org.jboss.remoting.transport.http.ssl.HTTPSServerInvoker");
  -       */
  -      clientInvokerFQN.put("servlet", "org.jboss.remoting.transport.http.ssl.HTTPSClientInvoker");
  -      serverInvokerFQN.put("servlet", "org.jboss.remoting.transport.servlet.ServletServerInvoker");
  -      clientInvokerFQN.put("multiplex", "org.jboss.remoting.transport.multiplex.MultiplexClientInvoker");
  -      serverInvokerFQN.put("multiplex", "org.jboss.remoting.transport.multiplex.MultiplexServerInvoker");
  -      clientInvokerFQN.put("sslmultiplex", "org.jboss.remoting.transport.multiplex.ssl.SSLMultiplexClientInvoker");
  -      serverInvokerFQN.put("sslmultiplex", "org.jboss.remoting.transport.multiplex.ssl.SSLMultiplexServerInvoker");
  -   }
  +   private static final Map transportClientFactoryClasses = new HashMap();
  +   private static final Map transportServerFactoryClasses = new HashMap();
   
      /**
       * return an array of InvokerLocators that are local to this VM (server invokers)
  @@ -137,7 +106,7 @@
      {
         synchronized(clientLock)
         {
  -         Set set = clientInvokers.keySet();
  +         Set set = transportClientFactoryClasses.keySet();
            String transports[] = new String[set.size()];
            return (String[]) set.toArray(transports);
         }
  @@ -195,42 +164,28 @@
      }
   
      /**
  -    * register a client/server invoker Class pair for a given transport
  +    * register a client/server invoker factory Class pair for a given transport
       *
       * @param transport
  -    * @param clientClassName
  -    * @param serverClassName
  +    * @param clientFactory implementation of org.jboss.remoting.transport.ClientFactory
  +    * @param serverFactory implementation of org.jboss.remoting.transport.ServerFactory
       */
  -   public static synchronized void registerInvoker(String transport, String clientClassName, String serverClassName)
  +   public static synchronized void registerInvokerFactories(String transport, Class clientFactory, Class serverFactory)
      {
  -      clientInvokerFQN.put(transport, clientClassName);
  -      serverInvokerFQN.put(transport, serverClassName);
  -   }
  +      transportClientFactoryClasses.put(transport, clientFactory);
  +      transportServerFactoryClasses.put(transport, serverFactory);
   
  -   /**
  -    * register a client/server invoker Class pair for a given transport
  -    *
  -    * @param transport
  -    * @param client
  -    * @param server
  -    */
  -   public static synchronized void registerInvoker(String transport, Class client, Class server)
  -   {
  -      clientInvokers.put(transport, client);
  -      serverInvokers.put(transport, server);
      }
   
      /**
  -    * unregister a client/server invoker pair for the given transport
  +    * unregister a client/server invoker factory pair for the given transport
       *
       * @param transport
       */
  -   public static synchronized void unregisterInvoker(String transport)
  +   public static synchronized void unregisterInvokerFactories(String transport)
      {
  -      clientInvokerFQN.remove(transport);
  -      clientInvokers.remove(transport);
  -      serverInvokerFQN.remove(transport);
  -      serverInvokers.remove(transport);
  +      transportClientFactoryClasses.remove(transport);
  +      transportServerFactoryClasses.remove(transport);
      }
   
      public static synchronized void unregisterLocator(InvokerLocator locator)
  @@ -314,6 +269,7 @@
               return invoker;
            }
   
  +         boolean isForceRemote = false;
            boolean isPassByValue = false;
            Map parameters = locator.getParameters();
            if(parameters != null)
  @@ -323,6 +279,11 @@
               {
                  isPassByValue = true;
               }
  +            value = (String) parameters.get(InvokerLocator.FORCE_REMOTE);
  +            if(value != null && Boolean.valueOf(value).booleanValue())
  +            {
  +               isForceRemote = true;
  +            }
            }
            // configuration map will override locator params
            if(configuration != null)
  @@ -332,12 +293,17 @@
               {
                  isPassByValue = true;
               }
  +            value = (String) configuration.get(InvokerLocator.FORCE_REMOTE);
  +            if(value != null && Boolean.valueOf(value).booleanValue())
  +            {
  +               isForceRemote = true;
  +            }
            }
   
            // Check to see if server invoker is local
            // If in server locators map, then created locally by this class
            ServerInvoker svrInvoker = (ServerInvoker) serverLocators.get(locator);
  -         if(svrInvoker != null)
  +         if(svrInvoker != null && !isForceRemote)
            {
               LocalClientInvoker localInvoker = new LocalClientInvoker(locator, configuration, isPassByValue);
               // have to set reference to local server invoker so client in invoke directly
  @@ -354,26 +320,8 @@
               {
                  throw new NullPointerException("protocol cannot be null for the locator");
               }
  -            Class cl = (Class) clientInvokers.get(protocol);
  -            if(cl == null)
  -            {
  -               cl = loadClientInvoker(protocol);
  -               if(cl == null)
  -               {
  -                  throw new RuntimeException("Couldn't find valid client invoker class for transport '" + protocol + "'");
  -               }
  -            }
   
  -            if(configuration != null)
  -            {
  -               Constructor ctor = cl.getConstructor(new Class[]{InvokerLocator.class, Map.class});
  -               invoker = (ClientInvoker) ctor.newInstance(new Object[]{locator, configuration});
  -            }
  -            else
  -            {
  -               Constructor ctor = cl.getConstructor(new Class[]{InvokerLocator.class});
  -               invoker = (ClientInvoker) ctor.newInstance(new Object[]{locator});
  -            }
  +            invoker = loadClientInvoker(protocol, locator, configuration);
   
               InvokerLocator l = invoker.getLocator();
   
  @@ -464,26 +412,132 @@
         holder.incrementCount();
      }
   
  -   private static Class loadClientInvoker(String protocol) throws ClassNotFoundException
  +   private static ClientInvoker loadClientInvoker(String protocol, InvokerLocator locator, Map configuration) throws ClassNotFoundException
  +   {
  +      ClientInvoker clientInvoker = null;
  +
  +      Class transportFactoryClass = getTransportClientFactory(protocol);
  +      if(transportFactoryClass != null)
  +      {
  +         try
  +         {
  +            ClientFactory transportFactory = (ClientFactory)transportFactoryClass.newInstance();
  +            Method getClientInvokerMethod = transportFactoryClass.getMethod("createClientInvoker", new Class[] {InvokerLocator.class, Map.class});
  +            clientInvoker = (ClientInvoker)getClientInvokerMethod.invoke(transportFactory, new Object[] {locator, configuration});
  +         }
  +         catch (ClassCastException e)
  +         {
  +            ClassNotFoundException cnfex = new ClassNotFoundException("Return from invoke on loadClientInvokerClass method is not of type Class");
  +            cnfex.initCause(e);
  +            throw cnfex;
  +         }
  +         catch (NoSuchMethodException e)
  +         {
  +            throw new ClassNotFoundException("Class '" + transportFactoryClass.getName() + " not of type " + ClientFactory.class.getName());
  +         }
  +         catch (IllegalAccessException e)
  +         {
  +            ClassNotFoundException cnfex = new ClassNotFoundException("Can not invoke loadClientInvokerClass method on " + transportFactoryClass);
  +            cnfex.initCause(e);
  +            throw cnfex;
  +         }
  +         catch (InvocationTargetException e)
  +         {
  +            ClassNotFoundException cnfex = new ClassNotFoundException("Can not invoke loadClientInvokerClass method on " + transportFactoryClass);
  +            cnfex.initCause(e);
  +            throw cnfex;
  +         }
  +         catch (InstantiationException e)
  +         {
  +            ClassNotFoundException cnfex = new ClassNotFoundException("Can not create a new instance of " + transportFactoryClass + " with void constructor.");
  +            cnfex.initCause(e);
  +            throw cnfex;
  +         }
  +
  +      }
  +      else
  +      {
  +         throw new ClassNotFoundException("Could not find class " + transportFactoryClass);
  +      }
  +
  +      return clientInvoker;
  +   }
  +
  +   private static ServerInvoker loadServerInvoker(String protocol, InvokerLocator locator, Map configuration) throws ClassNotFoundException
  +   {
  +      ServerInvoker serverInvoker = null;
  +
  +      Class transportFactoryClass = getTransportServerFactory(protocol);
  +      if(transportFactoryClass != null)
  +      {
  +         try
  +         {
  +            ServerFactory transportFactory = (ServerFactory)transportFactoryClass.newInstance();
  +            Method getClientInvokerMethod = transportFactoryClass.getMethod("createServerInvoker", new Class[] {InvokerLocator.class, Map.class});
  +            serverInvoker = (ServerInvoker)getClientInvokerMethod.invoke(transportFactory, new Object[] {locator, configuration});
  +         }
  +         catch (ClassCastException e)
  +         {
  +            ClassNotFoundException cnfex = new ClassNotFoundException("Return from invoke on loadServerInvokerClass method is not of type Class");
  +            cnfex.initCause(e);
  +            throw cnfex;
  +         }
  +         catch (NoSuchMethodException e)
  +         {
  +            throw new ClassNotFoundException("Class '" + transportFactoryClass.getName() + " not of type " + ClientFactory.class.getName());
  +         }
  +         catch (IllegalAccessException e)
  +         {
  +            ClassNotFoundException cnfex = new ClassNotFoundException("Can not invoke loadServerInvokerClass method on " + transportFactoryClass);
  +            cnfex.initCause(e);
  +            throw cnfex;
  +         }
  +         catch (InvocationTargetException e)
  +         {
  +            ClassNotFoundException cnfex = new ClassNotFoundException("Can not invoke loadServerInvokerClass method on " + transportFactoryClass);
  +            cnfex.initCause(e);
  +            throw cnfex;
  +         }
  +         catch (InstantiationException e)
  +         {
  +            ClassNotFoundException cnfex = new ClassNotFoundException("Can not can not create instance of " + transportFactoryClass + " using void constructor.");
  +            cnfex.initCause(e);
  +            throw cnfex;
  +         }
  +
  +      }
  +      else
      {
  -      Class clientInvokerClass = null;
  -      String clientInvokerClassName = (String) clientInvokerFQN.get(protocol);
  -      if(clientInvokerClassName != null)
  +         throw new ClassNotFoundException("Could not find class " + transportFactoryClass);
  +      }
  +
  +      return serverInvoker;
  +   }
  +
  +   private static Class getTransportClientFactory(String protocol)
  +         throws ClassNotFoundException
         {
  -         clientInvokerClass = ClassLoaderUtility.loadClass(clientInvokerClassName, InvokerRegistry.class);
  +      Class transportFactoryClass = (Class)transportClientFactoryClasses.get(protocol);
  +      if(transportFactoryClass == null)
  +      {
  +         String transportFactoryClassName = "org.jboss.remoting.transport." + protocol + ".TransportClientFactory";
  +         transportFactoryClass = ClassLoaderUtility.loadClass(transportFactoryClassName, InvokerRegistry.class);
  +         transportClientFactoryClasses.put(protocol, transportFactoryClass);
         }
  -      return clientInvokerClass;
  +      return transportFactoryClass;
      }
   
  -   private static Class loadServerInvoker(String protocol) throws ClassNotFoundException
  +   private static Class getTransportServerFactory(String protocol)
  +         throws ClassNotFoundException
      {
  -      Class serverInvokerClass = null;
  -      String serverInvokerClassName = (String) serverInvokerFQN.get(protocol);
  -      if(serverInvokerClassName != null)
  +      Class transportFactoryClass = (Class)transportServerFactoryClasses.get(protocol);
  +      if(transportFactoryClass == null)
         {
  -         serverInvokerClass = ClassLoaderUtility.loadClass(serverInvokerClassName, InvokerRegistry.class);
  +         String transportFactoryClassName = "org.jboss.remoting.transport." + protocol + ".TransportServerFactory";
  +         transportFactoryClass = ClassLoaderUtility.loadClass(transportFactoryClassName, InvokerRegistry.class);
  +         transportServerFactoryClasses.put(protocol, transportFactoryClass);
         }
  -      return serverInvokerClass;
  +      return transportFactoryClass;
      }
   
      /**
  @@ -537,46 +591,15 @@
                                                       "add new handlers to existing Connector.");
            }
            String protocol = locator.getProtocol();
  -         Class cl = (Class) serverInvokers.get(protocol);
  -         if(cl == null)
  -         {
  -            cl = loadServerInvoker(protocol);
  -            if(cl == null)
  -            {
  -               throw new RuntimeException("Couldn't find valid server invoker class for transport '" + protocol + "'");
  -            }
  -         }
  -         if(configuration != null)
  -         {
  -            Constructor ctor = cl.getConstructor(new Class[]{InvokerLocator.class, Map.class});
  -            invoker = (ServerInvoker) ctor.newInstance(new Object[]{locator, configuration});
  -         }
  -         else
  -         {
  -            Constructor ctor = cl.getConstructor(new Class[]{InvokerLocator.class});
  -            invoker = (ServerInvoker) ctor.newInstance(new Object[]{locator});
  -         }
  +
  +         invoker = loadServerInvoker(protocol, locator, configuration);
  +
            serverLocators.put(locator, invoker);
            registeredLocators.add(invoker.getLocator());
         }
         return invoker;
      }
   
  -   private static Class getServerInvokerClass(String protocol)
  -         throws ClassNotFoundException
  -   {
  -      Class cl = (Class) serverInvokers.get(protocol);
  -      if(cl == null)
  -      {
  -         cl = loadServerInvoker(protocol);
  -         if(cl == null)
  -         {
  -            throw new RuntimeException("Couldn't find valid server invoker class for transport '" + protocol + "'");
  -         }
  -      }
  -      return cl;
  -   }
  -
      public static void destroyServerInvoker(ServerInvoker invoker)
      {
         if(invoker != null)
  @@ -671,16 +694,42 @@
      public static boolean isSSLSupported(String transport) throws Exception
      {
         boolean isSSLSupported = false;
  +      Class transportFactoryClass = null;
         try
         {
  -         Class cl = getServerInvokerClass(transport);
  -         Method meth = cl.getMethod("supportsSSL", new Class[]{});
  -         Boolean boolVal = (Boolean)meth.invoke(cl, null);
  +         transportFactoryClass = getTransportClientFactory(transport);
  +         ClientFactory clientFactory = (ClientFactory)transportFactoryClass.newInstance();
  +         Method meth = transportFactoryClass.getMethod("supportsSSL", new Class[]{});
  +         Boolean boolVal = (Boolean)meth.invoke(clientFactory, null);
            isSSLSupported = boolVal.booleanValue();
         }
         catch (ClassNotFoundException e)
         {
  -         Exception ex = new Exception("Can not verify transport (" + transport + ") supports SSL because can not find server invoker implementation matching transport.");
  +         Exception ex = new Exception("Can not verify transport (" + transport + ") supports SSL because can not find invoker implementation matching transport.");
  +         ex.initCause(e);
  +         throw ex;
  +      }
  +      catch (NoSuchMethodException e)
  +      {
  +         Exception ex = new Exception("Can not call supportsSSL method on client factory class (" + transportFactoryClass + ") as there is no such method.");
  +         ex.initCause(e);
  +         throw ex;
  +      }
  +      catch (IllegalAccessException e)
  +      {
  +         Exception ex = new Exception("Can not call create instance of client factory class (" + transportFactoryClass + ").");
  +         ex.initCause(e);
  +         throw ex;
  +      }
  +      catch (InvocationTargetException e)
  +      {
  +         Exception ex = new Exception("Can not call supportsSSL method on client factory class (" + transportFactoryClass + ").");
  +         ex.initCause(e);
  +         throw ex;
  +      }
  +      catch (InstantiationException e)
  +      {
  +         Exception ex = new Exception("Can not call supportsSSL method on client factory class (" + transportFactoryClass + ").");
            ex.initCause(e);
            throw ex;
         }
  
  
  
  1.42      +1 -14     JBossRemoting/src/main/org/jboss/remoting/ServerInvoker.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: ServerInvoker.java
  ===================================================================
  RCS file: /cvsroot/jboss/JBossRemoting/src/main/org/jboss/remoting/ServerInvoker.java,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -b -r1.41 -r1.42
  --- ServerInvoker.java	22 Jun 2006 21:03:10 -0000	1.41
  +++ ServerInvoker.java	12 Jul 2006 04:49:51 -0000	1.42
  @@ -28,7 +28,6 @@
   import org.jboss.remoting.invocation.InternalInvocation;
   import org.jboss.remoting.invocation.OnewayInvocation;
   import org.jboss.remoting.loading.ClassBytes;
  -import org.jboss.remoting.security.CustomSSLServerSocketFactory;
   import org.jboss.remoting.security.SSLSocketBuilder;
   import org.jboss.remoting.security.ServerSocketFactoryMBean;
   import org.jboss.remoting.security.ServerSocketFactoryWrapper;
  @@ -45,7 +44,6 @@
   import javax.management.MalformedObjectNameException;
   import javax.management.ObjectName;
   import javax.net.ServerSocketFactory;
  -import javax.net.ssl.SSLServerSocketFactory;
   import java.io.IOException;
   import java.lang.reflect.Constructor;
   import java.net.InetAddress;
  @@ -60,7 +58,7 @@
    *
    * @author <a href="mailto:jhaynie at vocalocity.net">Jeff Haynie</a>
    * @author <a href="mailto:tom.elrod at jboss.com">Tom Elrod</a>
  - * @version $Revision: 1.41 $
  + * @version $Revision: 1.42 $
    */
   public abstract class ServerInvoker extends AbstractInvoker implements ServerInvokerMBean
   {
  @@ -774,17 +772,6 @@
      }
   
      /**
  -    * Indicates if this server invoker implementation supports
  -    * SSL.  By default will return false, so must be overridden
  -    * by implementor of ServerInvoker if does support SSL.
  -    * @return
  -    */
  -   public static boolean supportsSSL()
  -   {
  -      return false;
  -   }
  -
  -   /**
       * Will get the data type for the marshaller factory so know which marshaller to
       * get to marshal the data.  Will first check the locator uri for a 'datatype'
       * parameter and take that value if it exists.  Otherwise, will use the
  
  
  



More information about the jboss-cvs-commits mailing list