rsitze      2002/06/05 16:26:07

  Modified:    java/src/org/apache/axis/providers/java JavaProvider.java
               java/src/org/apache/axis/handlers JWSHandler.java
                        JWSProcessor.java
               java/src/org/apache/axis/server server-config.wsdd
  Log:
  "Simon Tuffs" <[EMAIL PROTECTED]>
  ************************************
  I'd like to submit a patch that makes the following changes to the JWS processing 
supported by Axis.  I needed these changes to implement a small project I've been 
working on:
   
      o    Allows the scope of a JWS hander service object to be specified in the 
server-config.wsdd file, e.g.
   
   <globalConfiguration>
     <requestFlow>
       <handler type="java:org.apache.axis.handlers.JWSHandler">
          <parameter name="scope" value="session"/>
       </handler>
   
      o    Allows multiple kinds of JWS handler to be set on the global chain, 
associated with a file-extension (so for example allowing .jwr files to be scoped as 
request scope):
   
       <handler type="java:org.apache.axis.handlers.JWSHandler">
          <parameter name="scope" value="request"/>
          <parameter name="extension" value=".jwr"/>
       </handler>
   
      o    Cleans up various constant strings used in the JavaProvider
   
      o    Uses a cache for JWS rpc objects to they don't have to be re-instantiated 
on each request.
  
  Revision  Changes    Path
  1.57      +34 -15    
xml-axis/java/src/org/apache/axis/providers/java/JavaProvider.java
  
  Index: JavaProvider.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis/java/src/org/apache/axis/providers/java/JavaProvider.java,v
  retrieving revision 1.56
  retrieving revision 1.57
  diff -u -r1.56 -r1.57
  --- JavaProvider.java 31 May 2002 19:08:09 -0000      1.56
  +++ JavaProvider.java 5 Jun 2002 23:26:07 -0000       1.57
  @@ -70,6 +70,7 @@
   import org.apache.axis.encoding.TypeMapping;
   import org.apache.axis.Constants;
   import org.apache.axis.handlers.soap.SOAPService;
  +import org.apache.axis.deployment.wsdd.WSDDConstants;
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
   import org.w3c.dom.Document;
  @@ -98,12 +99,30 @@
       public static final String OPTION_ALLOWEDMETHODS = "allowedMethods";
       public static final String OPTION_IS_STATIC = "isStatic";
       public static final String OPTION_CLASSPATH = "classPath";
  +    
  +    public static final String OPTION_SCOPE = "scope";
   
  +    // Values for the OPTION_SCOPE
  +    public static final String OPTION_SCOPE_REQUEST = "Request";
  +    public static final String OPTION_SCOPE_SESSION = "Session";
  +    public static final String OPTION_SCOPE_APPLICATION = "Application";
  +    public static final String OPTION_SCOPE_DEFAULT = OPTION_SCOPE_REQUEST;
  +    
  +    public static final byte BYTE_SCOPE_NOT_EXPLICIT = 0x00;
  +    public static final byte BYTE_SCOPE_APPLICATION  = 0x01;
  +    public static final byte BYTE_SCOPE_REQUEST      = 0x10;
  +    public static final byte BYTE_SCOPE_SESSION      = 0x11;
  +    public static final byte BYTE_SCOPE_DEFAULT      = BYTE_SCOPE_REQUEST;
   
  -    public static final int SCOPE_REQUEST = 0;
  -    public static final int SCOPE_SESSION = 1;
  -    public static final int SCOPE_APPLICATION = 2;
  -
  +    public static boolean isValidScope(String scope)
  +    {
  +        return scope == null  ||
  +               scope.length() == 0  ||
  +               scope.equalsIgnoreCase(OPTION_SCOPE_REQUEST)  ||
  +               scope.equalsIgnoreCase(OPTION_SCOPE_APPLICATION)  ||
  +               scope.equalsIgnoreCase(OPTION_SCOPE_SESSION);
  +    }
  +    
   
       /**
        * Get the service object whose method actually provides the service.
  @@ -119,22 +138,22 @@
   
           // scope can be "Request", "Session", "Application"
           // (as with Apache SOAP)
  -        String scope = (String)service.getOption("scope");
  +        String scope = (String)service.getOption(OPTION_SCOPE);
           if (scope == null) {
               // default is Request scope
  -            scope = "Request";
  +            scope = OPTION_SCOPE_DEFAULT;
           }
   
  -        if (scope.equalsIgnoreCase("Request")) {
  +        if (scope.equalsIgnoreCase(OPTION_SCOPE_REQUEST)) {
               // Convey the scope upwards
  -            scopeHolder.value = SCOPE_REQUEST;
  +            scopeHolder.value = BYTE_SCOPE_REQUEST;
   
               // make a one-off
               return getNewServiceObject(msgContext, clsName);
   
  -        } else if (scope.equalsIgnoreCase("Session")) {
  +        } else if (scope.equalsIgnoreCase(OPTION_SCOPE_SESSION)) {
               // Convey the scope upwards
  -            scopeHolder.value = SCOPE_SESSION;
  +            scopeHolder.value = BYTE_SCOPE_SESSION;
   
               // What do we do if serviceName is null at this point???
               if (serviceName == null)
  @@ -154,12 +173,12 @@
                   }
               } else {
                   // was no incoming session, sigh, treat as request scope
  -                scopeHolder.value = SCOPE_REQUEST;
  +                scopeHolder.value = BYTE_SCOPE_REQUEST;
                   return getNewServiceObject(msgContext, clsName);
               }
   
  -        } else if (scope.equalsIgnoreCase("Application")) {
  -            scopeHolder.value = SCOPE_APPLICATION;
  +        } else if (scope.equalsIgnoreCase(OPTION_SCOPE_APPLICATION)) {
  +            scopeHolder.value = BYTE_SCOPE_APPLICATION;
   
               // MUST be AxisEngine here!
               AxisEngine engine = msgContext.getAxisEngine();
  @@ -178,7 +197,7 @@
               } else {
                   // was no application session, sigh, treat as request scope
                   // FIXME : Should we bomb in this case?
  -                scopeHolder.value = SCOPE_REQUEST;
  +                scopeHolder.value = BYTE_SCOPE_REQUEST;
                   return getNewServiceObject(msgContext, clsName);
               }
   
  @@ -304,7 +323,7 @@
               } finally {
                   // If this is a request scoped service object which implements
                   // ServiceLifecycle, let it know that it's being destroyed now.
  -                if (scope.value == SCOPE_REQUEST &&
  +                if (scope.value == BYTE_SCOPE_REQUEST &&
                           obj instanceof ServiceLifecycle) {
                       ((ServiceLifecycle)obj).destroy();
                   }
  
  
  
  1.17      +20 -3     xml-axis/java/src/org/apache/axis/handlers/JWSHandler.java
  
  Index: JWSHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/handlers/JWSHandler.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- JWSHandler.java   9 May 2002 18:25:17 -0000       1.16
  +++ JWSHandler.java   5 Jun 2002 23:26:07 -0000       1.17
  @@ -63,6 +63,7 @@
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
   
  +import java.util.Hashtable;
   
   /** A <code>JWSHandler</code> sets the target service and JWS filename
    * in the context depending on the JWS configuration and the target URL.
  @@ -76,9 +77,15 @@
       protected static Log log =
           LogFactory.getLog(JWSHandler.class.getName());
   
  +    public final String OPTION_JWS_FILE_EXTENSION = "extension";
  +    public final String DEFAULT_JWS_FILE_EXTENSION = ".jws";
  +
       // Keep the processor Handler around so we can make it the service
  -    // Handler for this request if appropriate.
  -    static SOAPService processor = new SOAPService(new JWSProcessor());
  +    // Handler for this request if appropriate.  No need for these to be
  +    // static, since it may be desirable to have JWS handlers with different
  +    // behaviours for different file extensions.
  +    JWSProcessor jws = new JWSProcessor();
  +    SOAPService processor = new SOAPService(jws);
   
       public void invoke(MessageContext msgContext) throws AxisFault
       {
  @@ -88,8 +95,10 @@
   
           // FORCE the targetService to be JWS if the URL is right.
           String realpath = msgContext.getStrProp(Constants.MC_REALPATH);
  +        String extension = (String)getOption(OPTION_JWS_FILE_EXTENSION);
  +        if (extension == null) extension = DEFAULT_JWS_FILE_EXTENSION;
   
  -        if ((realpath!=null) && (realpath.endsWith(".jws"))) {
  +        if ((realpath!=null) && (realpath.endsWith(extension))) {
               msgContext.setService(processor);
           }
   
  @@ -100,5 +109,13 @@
   
       public void generateWSDL(MessageContext msgContext) throws AxisFault {
           invoke(msgContext);
  +    }
  +
  +    /**
  +     * Propagate options set on this handler into the processor.
  +     */
  +    public void setOptions(Hashtable opts) {
  +        super.setOptions(opts);
  +        jws.setOptions(opts);
       }
   }
  
  
  
  1.48      +31 -14    xml-axis/java/src/org/apache/axis/handlers/JWSProcessor.java
  
  Index: JWSProcessor.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/handlers/JWSProcessor.java,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- JWSProcessor.java 30 May 2002 03:06:10 -0000      1.47
  +++ JWSProcessor.java 5 Jun 2002 23:26:07 -0000       1.48
  @@ -83,6 +83,7 @@
   import java.util.jar.JarFile;
   import java.util.jar.JarInputStream;
   import java.util.jar.Manifest;
  +import java.util.HashMap;
   
   /**
    * This handler will use the MC_REALPATH property of the MsgContext to
  @@ -100,6 +101,7 @@
       protected static Log log =
           LogFactory.getLog(JWSProcessor.class.getName());
   
  +    protected static HashMap soapServices = new HashMap();
   
       public void invoke(MessageContext msgContext) throws AxisFault
       {
  @@ -153,7 +155,7 @@
   
               if (log.isDebugEnabled())
                   log.debug("jwsFile: " + jwsFile );
  -            
  +
               String   jFile   = outdir + File.separator + file.substring(0, 
file.length()-3) +
                       "java" ;
               String   cFile   = outdir + File.separator + file.substring(0, 
file.length()-3) +
  @@ -249,6 +251,8 @@
                           null, new Element[] { root } );
                   }
                   JWSClassLoader.removeClassLoader( clsName );
  +                // And clean out the cached service.
  +                soapServices.remove(clsName);
               }
   
               JWSClassLoader cl = JWSClassLoader.getClassLoader(clsName);
  @@ -263,24 +267,37 @@
               /* Create a new RPCProvider - this will be the "service"   */
               /* that we invoke.                                                */
               /******************************************************************/
  -            SOAPService rpc = new SOAPService(new RPCProvider());
  -            msgContext.setService( rpc );
  +            // Cache the rpc service created to handle the class.  The cache
  +            // is based on class name, so only one .jws/.jwr class can be active
  +            // in the system at a time.
  +            SOAPService rpc = (SOAPService)soapServices.get(clsName);
  +            if (rpc == null) {
  +                rpc = new SOAPService(new RPCProvider());
  +                rpc.setOption(RPCProvider.OPTION_CLASSNAME, clsName );
  +
  +                // Support specification of "allowedMethods" as a parameter.
  +                String allowed = 
(String)getOption(RPCProvider.OPTION_ALLOWEDMETHODS);
  +                if (allowed == null) allowed = "*";
  +                rpc.setOption(RPCProvider.OPTION_ALLOWEDMETHODS, allowed);
  +                // Take the setting for the scope option from the handler
  +                // parameter named "scope"
  +                String scope = (String)getOption(RPCProvider.OPTION_SCOPE);
  +                if (scope == null) scope = RPCProvider.OPTION_SCOPE_DEFAULT;
  +                rpc.setOption(RPCProvider.OPTION_SCOPE, scope);
  +
  +                // Set up service description
  +                ServiceDesc sd = rpc.getServiceDescription();
  +                sd.setImplClass(cl.loadClass(clsName));
  +                sd.setTypeMapping(msgContext.getTypeMapping());
   
  -            rpc.setOption(RPCProvider.OPTION_CLASSNAME, clsName );
  +                soapServices.put(clsName, rpc);
   
  -            /** For now, allow all methods - we probably want to have a way to
  -            * configure this in the future.
  -            */
  -            rpc.setOption(RPCProvider.OPTION_ALLOWEDMETHODS, "*");
  -
  -            // Set up service description
  -            ServiceDesc sd = rpc.getServiceDescription();
  -            sd.setImplClass(cl.loadClass(clsName));
  -            sd.setTypeMapping(msgContext.getTypeMapping());
  +            }
  +            msgContext.setService( rpc );
   
               // Set engine, which hooks up type mappings.
               rpc.setEngine(msgContext.getAxisEngine());
  -            
  +
               rpc.init();   // ??
               if (doWsdl)
                   rpc.generateWSDL(msgContext);
  
  
  
  1.12      +9 -3      xml-axis/java/src/org/apache/axis/server/server-config.wsdd
  
  Index: server-config.wsdd
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/server/server-config.wsdd,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- server-config.wsdd        14 Feb 2002 23:01:48 -0000      1.11
  +++ server-config.wsdd        5 Jun 2002 23:26:07 -0000       1.12
  @@ -6,7 +6,13 @@
   
    <globalConfiguration>
      <requestFlow>
  -     <handler type="java:org.apache.axis.handlers.JWSHandler"/>
  +     <handler type="java:org.apache.axis.handlers.JWSHandler">
  +        <parameter name="scope" value="session"/>
  +     </handler>
  +     <handler type="java:org.apache.axis.handlers.JWSHandler">
  +        <parameter name="scope" value="request"/>
  +        <parameter name="extension" value=".jwr"/>
  +     </handler>
      </requestFlow>
    </globalConfiguration>
   
  @@ -22,7 +28,7 @@
     <parameter name="enableRemoteAdmin" value="false"/>
     <parameter name="className" value="org.apache.axis.utils.Admin"/>
    </service>
  - 
  +
    <service name="Version" provider="java:RPC">
     <parameter name="allowedMethods" value="getVersion"/>
     <parameter name="className" value="org.apache.axis.Version"/>
  @@ -34,7 +40,7 @@
      <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
     </requestFlow>
    </transport>
  - 
  +
    <transport name="local">
     <responseFlow>
      <handler type="java:org.apache.axis.transport.local.LocalResponder"/>
  
  
  


Reply via email to