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"/>
> >
> >
> >
> >
>
>