You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by bu...@apache.org on 2002/03/23 03:18:18 UTC
cvs commit: xml-axis/java/src/org/apache/axis/description ParameterDesc.java
butek 02/03/22 18:18:18
Modified: java/src/javax/xml/rpc Call.java
java/src/org/apache/axis/client Call.java
java/src/org/apache/axis/description ParameterDesc.java
Log:
Brought the Call interface/object up to JAX-RPC 0.8 snuff.
Next I have to write a test for the Call object.
Revision Changes Path
1.10 +56 -5 xml-axis/java/src/javax/xml/rpc/Call.java
Index: Call.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/javax/xml/rpc/Call.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Call.java 21 Mar 2002 16:07:43 -0000 1.9
+++ Call.java 23 Mar 2002 02:18:18 -0000 1.10
@@ -54,6 +54,8 @@
*/
package javax.xml.rpc;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import javax.xml.rpc.namespace.QName;
@@ -118,17 +120,36 @@
* configured type mapping registry.
*
* @param paramName - Name of the parameter
- * @param paramType - XML datatype of the parameter
+ * @param xmlType - XML datatype of the parameter
* @param parameterMode - Mode of the parameter-whether PARAM_MODE_IN,
* PARAM_MODE_OUT or PARAM_MODE_INOUT
* @exception JAXRPCException - if isParameterAndReturnSpecRequired returns
* false, then addParameter will throw
* JAXRPCException.
*/
- public void addParameter(String paramName, QName paramType,
+ public void addParameter(String paramName, QName xmlType,
ParameterMode parameterMode);
/**
+ * Adds a parameter type and mode for a specific operation. Note that the
+ * client code is not required to call any addParameter and setReturnType
+ * methods before calling the invoke method. A Call implementation class
+ * can determine the parameter types by using the Java reflection and
+ * configured type mapping registry.
+ *
+ * @param paramName - Name of the parameter
+ * @param xmlType - XML datatype of the parameter
+ * @param javaType - The Java class of the parameter
+ * @param parameterMode - Mode of the parameter-whether PARAM_MODE_IN,
+ * PARAM_MODE_OUT or PARAM_MODE_INOUT
+ * @exception JAXRPCException - if isParameterAndReturnSpecRequired returns
+ * false, then addParameter will throw
+ * JAXRPCException.
+ */
+ public void addParameter(String paramName, QName xmlType,
+ Class javaType, ParameterMode parameterMode);
+
+ /**
* Given a parameter name, return the QName of its type. If the parameter
* doesn't exist, this method returns null.
*
@@ -146,6 +167,16 @@
public void setReturnType(QName xmlType);
/**
+ * Sets the return type for a specific operation.
+ *
+ * @param xmlType - QName of the data type of the return value
+ * @param javaType - Java class of the return value
+ * @exception JAXRPCException - if isParameterAndReturnSpecRequired returns
+ * false, then setReturnType will throw JAXRPCException.
+ */
+ public void setReturnType(QName xmlType, Class javaType);
+
+ /**
* Get the QName of the return type.
*/
public QName getReturnType();
@@ -194,14 +225,14 @@
* @param address - Endpoint address of the target service port; specified
* as URI
*/
- public void setTargetEndpointAddress(java.net.URL address);
+ public void setTargetEndpointAddress(String address);
/**
* Gets the endpoint address of a target service port.
*
* @return Endpoint address of the target service port as an URI
*/
- public java.net.URL getTargetEndpointAddress();
+ public String getTargetEndpointAddress();
/**
* Sets the value for a named property. JAX-RPC 1.0 specification
@@ -241,6 +272,13 @@
*/
public void removeProperty(String name);
+ /**
+ * Gets the names of configurable properties supported by this Call object.
+ *
+ * @return Iterator for the property names
+ */
+ public Iterator getPropertyNames();
+
// Remote Method Invocation methods
/**
* Invokes a specific operation using a synchronous request-response
@@ -310,5 +348,18 @@
* has been called.
*/
public Map getOutputParams();
-}
+ /**
+ * Returns a List values for the output parameters of the last
+ * invoked operation.
+ *
+ * @return Values for the output parameters. An empty List is
+ * returned if there are no output values.
+ *
+ * @throws JAXRPCException - If this method is invoked for a
+ * one-way operation or is invoked
+ * before any invoke method has been called.
+ */
+ public List getOutputValues();
+
+}
1.104 +158 -23 xml-axis/java/src/org/apache/axis/client/Call.java
Index: Call.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/client/Call.java,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -r1.103 -r1.104
--- Call.java 22 Mar 2002 16:08:31 -0000 1.103
+++ Call.java 23 Mar 2002 02:18:18 -0000 1.104
@@ -172,8 +172,11 @@
private Transport transport = null ;
private String transportName = null ;
- // A place to store output parameters
+ // A couple places to store output parameters.
+ // As a HashMap, retrievable via QName (for getOutputParams).
private HashMap outParams = null;
+ // As a list, retrievable by index (for getOutputValues).
+ private ArrayList outParamsList = null;
// A place to store any client-specified headers
private Vector myHeaders = null;
@@ -411,6 +414,28 @@
}
/**
+ * Gets the names of configurable properties supported by this Call object.
+ *
+ * @return Iterator for the property names
+ */
+ private static ArrayList propertyNames = null;
+
+ public Iterator getPropertyNames() {
+ if (propertyNames == null) {
+ propertyNames = new ArrayList();
+ propertyNames.add(USERNAME_PROPERTY);
+ propertyNames.add(PASSWORD_PROPERTY);
+ propertyNames.add(SESSION_MAINTAIN_PROPERTY);
+ propertyNames.add(OPERATION_STYLE_PROPERTY);
+ propertyNames.add(SOAPACTION_USE_PROPERTY);
+ propertyNames.add(SOAPACTION_URI_PROPERTY);
+ propertyNames.add(ENCODINGSTYLE_URI_PROPERTY);
+ propertyNames.add(TRANSPORT_NAME);
+ }
+ return propertyNames.iterator();
+ }
+
+ /**
* Set the username.
*/
public void setUsername(String username) {
@@ -544,8 +569,29 @@
}
/**
+ * Sets the endpoint address of the target service port. This address must
+ * correspond to the transport specified in the binding for this Call
+ * instance.
+ *
+ * @param address - Endpoint address of the target service port; specified
+ * as URI
+ */
+ public void setTargetEndpointAddress(String address) {
+ URL urlAddress;
+ try {
+ urlAddress = new URL(address);
+ }
+ catch (MalformedURLException mue) {
+ throw new JAXRPCException(mue);
+ }
+ setTargetEndpointAddress(urlAddress);
+ }
+
+ /**
* Sets the URL of the target Web Service.
*
+ * Note: Not part of JAX-RPC specification.
+ *
* @param address URL of the target Web Service
*/
public void setTargetEndpointAddress(java.net.URL address) {
@@ -607,10 +653,10 @@
*
* @return URL URL of the target Web Service
*/
- public java.net.URL getTargetEndpointAddress() {
+ public String getTargetEndpointAddress() {
try {
if ( transport == null ) return( null );
- return( new java.net.URL( transport.getUrl() ) );
+ return( transport.getUrl() );
}
catch( Exception exp ) {
return( null );
@@ -644,35 +690,42 @@
* Adds the specified parameter to the list of parameters for the
* operation associated with this Call object.
*
+ * Note: Not part of JAX-RPC specification.
+ *
* @param paramName Name that will be used for the parameter in the XML
- * @param paramType XMLType of the parameter
+ * @param xmlType XMLType of the parameter
* @param parameterMode one of PARAM_MODE_IN, PARAM_MODE_OUT
* or PARAM_MODE_INOUT
*/
- public void addParameter(String paramName, QName paramType,
+ public void addParameter(QName paramName, QName xmlType,
ParameterMode parameterMode) {
- addParameter(new QName("", paramName), paramType, parameterMode);
+ addParameter(paramName, xmlType, null, parameterMode);
}
+
/**
* Adds the specified parameter to the list of parameters for the
* operation associated with this Call object.
*
+ *
+ * Note: Not part of JAX-RPC specification.
+ *
* @param paramName Name that will be used for the parameter in the XML
- * @param paramType XMLType of the parameter
+ * @param xmlType XMLType of the parameter
+ * @param javaType - The Java class of the parameter
* @param parameterMode one of PARAM_MODE_IN, PARAM_MODE_OUT
* or PARAM_MODE_INOUT
*/
- public void addParameter(QName paramName, QName paramType,
- ParameterMode parameterMode) {
+ public void addParameter(QName paramName, QName xmlType,
+ Class javaType, ParameterMode parameterMode) {
if (parmAndRetReq) {
-
if (operation == null) {
operation = new OperationDesc();
}
ParameterDesc param = new ParameterDesc();
param.setQName( paramName );
- param.setTypeQName( paramType );
+ param.setTypeQName( xmlType );
+ param.setJavaType( javaType );
byte mode = ParameterDesc.IN;
if (parameterMode == ParameterMode.PARAM_MODE_INOUT) {
mode = ParameterDesc.INOUT;
@@ -689,6 +742,41 @@
}
/**
+ * Adds the specified parameter to the list of parameters for the
+ * operation associated with this Call object.
+ *
+ * @param paramName Name that will be used for the parameter in the XML
+ * @param xmlType XMLType of the parameter
+ * @param parameterMode one of PARAM_MODE_IN, PARAM_MODE_OUT
+ * or PARAM_MODE_INOUT
+ */
+ public void addParameter(String paramName, QName xmlType,
+ ParameterMode parameterMode) {
+ addParameter(new QName("", paramName), xmlType, null, parameterMode);
+ }
+
+ /**
+ * Adds a parameter type and mode for a specific operation. Note that the
+ * client code is not required to call any addParameter and setReturnType
+ * methods before calling the invoke method. A Call implementation class
+ * can determine the parameter types by using the Java reflection and
+ * configured type mapping registry.
+ *
+ * @param paramName - Name of the parameter
+ * @param xmlType - XML datatype of the parameter
+ * @param javaType - The Java class of the parameter
+ * @param parameterMode - Mode of the parameter-whether PARAM_MODE_IN,
+ * PARAM_MODE_OUT or PARAM_MODE_INOUT
+ * @exception JAXRPCException - if isParameterAndReturnSpecRequired returns
+ * false, then addParameter will throw
+ * JAXRPCException.
+ */
+ public void addParameter(String paramName, QName xmlType,
+ Class javaType, ParameterMode parameterMode) {
+ addParameter(new QName("", paramName), xmlType, javaType, parameterMode);
+ }
+
+ /**
* Return the QName of the type of the parameters with the given name.
*
* @param paramName name of the parameter to return
@@ -717,7 +805,6 @@
if (param != null) {
return param.getTypeQName();
}
-
return( null );
}
@@ -737,6 +824,19 @@
}
/**
+ * Sets the return type for a specific operation.
+ *
+ * @param xmlType - QName of the data type of the return value
+ * @param javaType - Java class of the return value
+ * @exception JAXRPCException - if isParameterAndReturnSpecRequired returns
+ * false, then setReturnType will throw JAXRPCException.
+ */
+ public void setReturnType(QName xmlType, Class javaType) {
+ setReturnType(xmlType);
+ returnJavaType = javaType;
+ }
+
+ /**
* Returns the QName of the type of the return value of this Call - or null if
* not set.
*
@@ -759,12 +859,13 @@
* and you'd get a Vector back from invoke() instead of having to do
* the conversion yourself.
*
+ * Note: Not part of JAX-RPC specification. To be JAX-RPC compliant,
+ * use setReturnType(QName, Class).
+ *
* @param cls the desired return class.
*/
public void setReturnClass(Class cls) {
returnJavaType = cls;
- // NOTE: Should be setting XML type based on this as well at some
- // point, so you can just use this.
}
/**
@@ -846,7 +947,7 @@
// Get the URL
////////////////////////////////////////////////////////////////////
- this.setTargetEndpointAddress( null );
+ this.setTargetEndpointAddress( (URL) null );
List list = port.getExtensibilityElements();
for ( int i = 0 ; list != null && i < list.size() ; i++ ) {
Object obj = list.get(i);
@@ -1260,7 +1361,7 @@
/**
* Convert the list of objects into RPCParam's based on the paramNames,
- * paramTypes and paramModes variables. If those aren't set then just
+ * paramXMLTypes and paramModes variables. If those aren't set then just
* return what was passed in.
*
* @param params Array of parameters to pass into the operation/method
@@ -1518,7 +1619,7 @@
/**
* Since JAX-RPC requires us to specify all or nothing, if setReturnType
* was called (returnType != null) and we have args but addParameter
- * wasn't called (paramTypes == null), then toss a fault.
+ * wasn't called (paramXMLTypes == null), then toss a fault.
*/
if (returnType != null && args != null && args.length != 0
&& operation == null) {
@@ -1589,6 +1690,7 @@
// Clear the output params
outParams = new HashMap();
+ outParamsList = new ArrayList();
// If we have headers to insert, do so now.
if (myHeaders != null) {
@@ -1633,7 +1735,7 @@
// If we have resArgs and the returnType is specified, then the first
// resArgs is the return. If we have resArgs and neither returnType
- // nor paramTypes are specified, then we assume that the caller is
+ // nor paramXMLTypes are specified, then we assume that the caller is
// following the non-JAX-RPC AXIS shortcut of not having to specify
// the return, in which case we again assume the first resArgs is
// the return.
@@ -1646,9 +1748,9 @@
// this caller to set the returnType to void, but there's no void
// type in XML.
// NOTE 2: we should probably verify that the resArgs element
- // types match the expected returnType and paramTypes, but I'm not
+ // types match the expected returnType and paramXMLTypes, but I'm not
// sure how to do that since the resArgs value is a Java Object
- // and the returnType and paramTypes are QNames.
+ // and the returnType and paramXMLTypes are QNames.
// GD 03/15/02 : We're now checking for invalid metadata
// config at the top of this method, so don't need to do it
@@ -1661,7 +1763,18 @@
for (int i = outParamStart; i < resArgs.size(); i++) {
RPCParam param = (RPCParam) resArgs.get(i);
- outParams.put(param.getQName(), param.getValue());
+
+ Class javaType = getJavaTypeForQName(param.getQName());
+ Object value = param.getValue();
+
+ // Convert type if needed
+ if (javaType != null &&
+ !javaType.isAssignableFrom(value.getClass())) {
+ value = JavaUtils.convert(value, javaType);
+ }
+
+ outParams.put(param.getQName(), value);
+ outParamsList.add(value);
}
}
} else {
@@ -1690,6 +1803,15 @@
}
/**
+ * Get the javaType for a given parameter.
+ *
+ */
+ private Class getJavaTypeForQName(QName name) {
+ ParameterDesc param = operation.getOutputParamByQName(name);
+ return param == null ? null : param.getJavaType();
+ }
+
+ /**
* Set engine option.
*
* Note: Not part of JAX-RPC specification.
@@ -1843,13 +1965,26 @@
* name and value - if you want the value, you'll need to call
* param.getValue().
*
- * Note: Not part of JAX-RPC specification.
- *
* @return Vector of RPCParams
*/
public Map getOutputParams()
{
return this.outParams;
+ }
+
+ /**
+ * Returns a List values for the output parameters of the last
+ * invoked operation.
+ *
+ * @return Values for the output parameters. An empty List is
+ * returned if there are no output values.
+ *
+ * @throws JAXRPCException - If this method is invoked for a
+ * one-way operation or is invoked
+ * before any invoke method has been called.
+ */
+ public List getOutputValues() {
+ return outParamsList;
}
/**
1.2 +10 -0 xml-axis/java/src/org/apache/axis/description/ParameterDesc.java
Index: ParameterDesc.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/description/ParameterDesc.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ParameterDesc.java 22 Mar 2002 16:08:31 -0000 1.1
+++ ParameterDesc.java 23 Mar 2002 02:18:18 -0000 1.2
@@ -82,6 +82,8 @@
public byte mode = IN;
/** The XML type of this parameter */
private QName typeQName;
+ /** The Java type of this parameter */
+ private Class javaType;
/** The order of this parameter (-1 indicates unordered) */
private int order = -1;
@@ -141,6 +143,14 @@
public void setTypeQName(QName typeQName) {
this.typeQName = typeQName;
+ }
+
+ public Class getJavaType() {
+ return javaType;
+ }
+
+ public void setJavaType(Class javaType) {
+ this.javaType = javaType;
}
public byte getMode() {