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.
I strongly believe JWS should remain .jws, and if you want metadata, do it in one of these ways: 1) Use the AxisServiceConfig interface 2) Have a metadata format available in a parallel file: stuff/Service.jws stuff/Service.xml (which would basically be WSDD) 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? --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"/> > > > > > > > > > > > > > > > > >