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