Hi guys!

I'm sorry not to have been tuned in enough to this yesterday, but I'm still
travelling in San Jose and haven't been checking mail regularly.

The idea behind what you want here is fine, Simon, but I don't think this is
the way to do it.

We already have an interface called AxisServiceConfig.  The idea of this is
that you can have a static method on your JWS class which returns one of these,
and the system uses that as the configuration metadata to determine stuff about
your class.  Right now this is just for allowedMethods (which we support and
test - look at AltStockQuoteService.jws), but this is, I think, the right place
for things like scope options to go.  Having different JWSHandlers for
different extensions seems to me like a heavyweight and somewhat confusing way
to do this, since we want JWS to be about the JWS file, not about the
deploy.wsdd.

I would vastly prefer that we used the preexisting mechanism to get these
options in there (i.e. add a method to AxisServiceConfig/Impl "int getScope()"
which returns SCOPE_DEFAULT by default).

So...

+1 to the caching stuff in JWSProcessor!

Tentative -1 to the scoped-JWSHandler/extension changes.

Does this make sense?  I'm open to discussion as to why your method might be
better, but it seemed to me that you just didn't notice the AxisServiceConfig
mechanism could be used to get what you want (or at least what I think you
want!).

--Glen

----- Original Message -----
From: <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Wednesday, June 05, 2002 4:26 PM
Subject: cvs commit: xml-axis/java/src/org/apache/axis/server
server-config.wsdd


> 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