Hi Glen: appreciate the feedback, here are my thoughts:

> Hi Simon!
>
> The association between the filename and a set of parameters is exactly what I
> think is a bad idea here.  JWS works because there is a servlet mapping in the
> web.xml linking the *.jws extension to the AxisServlet.  If you add more
> extensions, you need to keep this updated, which is a PITA and seems kind of
> broken to me.
>
Good point, I forgot that I had had to do that, and it is somewhat of a PITA as
you say.

> I strongly believe JWS should remain .jws, and if you want metadata, do it in
> one of these ways:
>
> 1) Use the AxisServiceConfig interface
>
No problem with this, except as noted in my previous message that the
AxisServiceConfig interface needs to be unified with the ServiceDesc class,
perhaps as its interface, so that you can control everything of interest in a
ServiceDesc through an AxisServiceConfig interface.

> 2) Have a metadata format available in a parallel file:
>       stuff/Service.jws
>       stuff/Service.xml (which would basically be WSDD)
>
This sounds like a better approach to controlling the deployment of JWS files,
since it would allow you to specify handler chains etc.  Sincce Service.xml
would essentially be Service.wsdd, why not call it that instead?  To do
deployment safely, you would presumably copy-in the Service.wsdd file first,
then the Service.jws file second.

> Really, if you're using generated code, what's the point of using the JWS
> mechanism at all here?  Why not just drop a compiled class into the classes
> directory and deploy it programatically using WSDD?
>
This may well be a better approach, but it wasn't obvious to me how to do this
programmatically.  I'm still learning, and the Axis deployment infrastructure
isn't simple.  JWS deployment is trivially easy to learn.

Anyway, my feeling is that what's currently checked in as JWSProcessor does give
you the capability of doing what I was doing, and you *don't* have to do it that
way.  Removing that ability would be a step back IMO, so I would leave it in
there, even if it is not the cleanest approach.

Thanks.

Simon.

>
> --Glen
>
> ----- Original Message -----
> From: "Simon Tuffs" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Friday, June 07, 2002 6:16 AM
> Subject: Re: cvs commit: xml-axis/java/src/org/apache/axis/server
> server-config.wsdd
>
>
> > Hello Glen:
> >
> > I appreciate and agree with your concerns, but here's where I was coming
> from.
> > My goal was to auto-deploy Java code that was itself automatically generated
> (or
> > precompiled), i.e. I don't have control over the code.  This makes it
> impossible
> > to add a meta-data method through the AxisServiceConfig mechanism, although
I
> > agree that this would be another way to do it.  BTW, it seems to me that
> > AxisServiceConfig should return something more like a ServiceDesc, i.e.
> >
> > public interface AxisServiceConfig
> > {
> >     /** Get a service descriptor
> >      */
> >     public ServiceDesc getServiceDesc();
> > }
> >
> > otherwise it's going to end up being constantly modified to allow java-code
> to
> > have the control they need over their representation as a service.
> >
> > Thus, the only way I had to differentiate the kind of scoping I wanted was
by
> > the filename (i.e. URL access).  A hack, but I think an acceptable one since
> if
> > you wanted to add application scope, you could do it like this right now
> without
> > changing any code!
> >
> >      <handler type="java:org.apache.axis.handlers.JWSHandler">
> >         <parameter name="scope" value="application"/>
> >         <parameter name="extension" value=".jwa"/>
> >      </handler>
> >
> > i.e. yet another filename extension.  What's going on here is weakly typed
> > association between the filename and a set of parameters, quite powerful I
> > think.
> >
> > Your thoughts appreciated.
> >
> > P.S. Sorry for the delay in responding, I filter my mail into sub-folders,
> and
> > only caught this one by accident since it went into my 'cvs' folder.
> >
> > Simon.
> >
> >
> > ----- Original Message -----
> > From: "Glen Daniels" <[EMAIL PROTECTED]>
> > To: <[EMAIL PROTECTED]>
> > Sent: Thursday, June 06, 2002 7:22 AM
> > Subject: Re: cvs commit: xml-axis/java/src/org/apache/axis/server
> > server-config.wsdd
> >
> >
> > > 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