butek 02/02/15 10:20:10
Modified: java/src/org/apache/axis/message RPCHandler.java
java/src/org/apache/axis/providers/java RPCProvider.java
java/src/org/apache/axis/utils/cache JavaClass.java
JavaMethod.java
java/test/utils/cache TestJavaClass.java TestJavaMethod.java
java/test/wsdl/clash clash.wsdl
Log:
Overloaded operation work:
1. (done) fix WSDL2Java
2. (done) get WSDL4J fix
3. fix runtime (this commit does some work that should satisfy most cases, but
there's
a lot of resolution work that needs doing, yet)
4. fix Java2WSDL
Revision Changes Path
1.25 +8 -6 xml-axis/java/src/org/apache/axis/message/RPCHandler.java
Index: RPCHandler.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCHandler.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- RPCHandler.java 8 Feb 2002 03:09:25 -0000 1.24
+++ RPCHandler.java 15 Feb 2002 18:20:10 -0000 1.25
@@ -96,7 +96,7 @@
{
this.call = call;
}
-
+
private void determineDefaultParams(String methodName,
DeserializationContext context) {
MessageContext msgContext = context.getMessageContext();
@@ -116,11 +116,13 @@
"lookup00", methodName, clsName));
}
- // try to find the method without knowing the number of
- // parameters. If we are successful, we can make better
- // decisions about what deserializers to use for parameters
- Method method = jc.getMethod(methodName, -1);
- if (method != null) defaultParamTypes = method.getParameterTypes();
+ // If we find only one method of this name, we can use it
+ // to make better decisions about what deserializers to use
+ // for parameters.
+ Method[] method = jc.getMethod(methodName);
+ if (method != null && method.length == 1) {
+ defaultParamTypes = method[0].getParameterTypes();
+ }
// !!! This should be smart enough to deal with overloaded
// methods - we should really be keeping a list of all of
1.37 +70 -57
xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java
Index: RPCProvider.java
===================================================================
RCS file:
/home/cvs/xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- RPCProvider.java 29 Jan 2002 21:30:13 -0000 1.36
+++ RPCProvider.java 15 Feb 2002 18:20:10 -0000 1.37
@@ -174,63 +174,69 @@
// wsdl. Thus the following code only works if there is no
// overloading.
int numberOfBodyArgs = args.size();
- Method method = getMethod(jc, mName, args);
+ Method[] method = getMethod(jc, mName);
// If the method wasn't found, maybe it needs some Java mangling (ie.,
it's a Java
// keyword or it's capitalized and the java mapping requires lowercase).
if (method == null) {
mName = JavaUtils.xmlNameToJava(mName);
- method = getMethod(jc, mName, args);
+ method = getMethod(jc, mName);
}
if ( method == null )
throw new AxisFault( "AxisServer.error",
JavaUtils.getMessage("noMethod00", mName,
msgContext.getTargetService()),
null, null );
-
- Class params[] = method.getParameterTypes();
-
- // The number of method parameters must match the
- // arguments taking into consideration a MessageContext argument
- // and output parameters.
- Object[] newArgValues = new Object[params.length];
- int old = 0;
- boolean problem = false;
- for (int n = 0; n < newArgValues.length; n++) {
- Class heldType = JavaUtils.getHolderValueType(params[n]);
- if (params[n] == MessageContext.class) {
- newArgValues[n] = msgContext;
- } else if (argValues != null && old < argValues.length) {
- newArgValues[n] = argValues[old++];
- } else if (heldType == null) {
- // The parameters that don't match the argValues must
- // be Holders. Indicate problem occurred.
- problem = true;
- } else {
- newArgValues[n] = null;
- }
- // Create holders for each argument that is null that should be a
holder
- if (newArgValues[n] == null && heldType != null) {
- newArgValues[n] = JavaUtils.convert(newArgValues[n], params[n]);
+ Object objRes = null;
+ Class[] params = null;
+ Exception ex = null;
+
+ // There might be more than one method with this name, try them all.
+ int m = 0;
+ for (m = 0; m < method.length; ++m) {
+ ex = null;
+ params = method[m].getParameterTypes();
+
+
+ // The number of method parameters must match the
+ // arguments taking into consideration a MessageContext argument
+ // and output parameters.
+ Object[] newArgValues = new Object[params.length];
+ int old = 0;
+ boolean problem = false;
+ for (int n = 0; n < newArgValues.length; n++) {
+ Class heldType = JavaUtils.getHolderValueType(params[n]);
+ if (params[n] == MessageContext.class) {
+ newArgValues[n] = msgContext;
+ } else if (argValues != null && old < argValues.length) {
+ newArgValues[n] = argValues[old++];
+ } else if (heldType == null) {
+ // The parameters that don't match the argValues must
+ // be Holders. Indicate problem occurred.
+ problem = true;
+ } else {
+ newArgValues[n] = null;
+ }
+ // Create holders for each argument that is null that should be
a holder
+ if (newArgValues[n] == null && heldType != null) {
+ newArgValues[n] = JavaUtils.convert(newArgValues[n],
params[n]);
+ }
+ }
+ if (!problem) {
+ argValues = newArgValues; // Use newArgValues array if no
problems
}
- }
- if (!problem) {
- argValues = newArgValues; // Use newArgValues array if no problems
- }
- // Invoke the method and capture the returned object.
- // Note that if the method returns a primitive, invoke(...)
automatically
- // wraps it in a java.lang class representing the primitive.
- Object objRes;
- try {
- objRes = method.invoke(obj, argValues);
- } catch (IllegalArgumentException e) {
-
- {
+ // Invoke the method and capture the returned object.
+ // Note that if the method returns a primitive, invoke(...)
automatically
+ // wraps it in a java.lang class representing the primitive.
+ try {
+ objRes = method[m].invoke(obj, argValues);
+ break;
+ } catch (IllegalArgumentException e) {
// Hm - maybe we can help this with a conversion or two...
for (int i = 0; argValues != null && i < argValues.length &&
- i < params.length; i++) {
+ i < params.length; i++) {
Object thisArg = argValues[i];
if (!params[i].isAssignableFrom(thisArg.getClass())) {
// Attempt conversion for each non-assignable argument
@@ -239,31 +245,38 @@
argValues[i] = newArg;
}
}
-
+
// OK, now try again...
try {
- objRes = method.invoke( obj, argValues );
+ objRes = method[m].invoke( obj, argValues );
+ break;
} catch (IllegalArgumentException exp) {
StringBuffer argbuf = new StringBuffer();
String sep= "";
for(int i = 0; argValues != null &&
- i < argValues.length; ++i) {
+ i < argValues.length; ++i) {
argbuf.append(sep);
sep = ", ";
argbuf.append(argValues[i] == null ? "null" :
argValues[i].getClass().getName());
}
String objName = obj == null ? "null" :
- obj.getClass().getName();
+ obj.getClass().getName();
String msg = JavaUtils.getMessage("triedArgs00",
new String[] {
- exp.getMessage(),
- objName,
- method.getName(),
- argbuf.toString()});
- throw new IllegalArgumentException(msg);
+ exp.getMessage(),
+ objName,
+ method[m].getName(),
+ argbuf.toString()});
+ ex = new IllegalArgumentException(msg);
+ continue;
}
}
}
+ // If we've gone through all methods with the given name and there's
+ // an exception left over, throw that exception.
+ if (ex != null) {
+ throw ex;
+ }
if (category.isDebugEnabled())
category.debug(JavaUtils.getMessage("result00", "" + objRes));
@@ -283,17 +296,17 @@
resBody.addParam ((RPCParam) list.get (i));
}
else {
- resBody.addParam (new RPCParam (getParameterName(obj,
method,i, mName),
+ resBody.addParam (new RPCParam (getParameterName(obj,
method[m],i, mName),
list.get (i)));
}
}
}
else {
- RPCParam param = new RPCParam(getParameterName(obj, method,-1,
mName), objRes);
+ RPCParam param = new RPCParam(getParameterName(obj,
method[m],-1, mName), objRes);
resBody.addParam(param);
}
- } else if (method.getReturnType() != Void.TYPE) {
- RPCParam param = new RPCParam(getParameterName(obj, method,-1,
mName), objRes);
+ } else if (method[m].getReturnType() != Void.TYPE) {
+ RPCParam param = new RPCParam(getParameterName(obj, method[m],-1,
mName), objRes);
resBody.addParam(param);
}
@@ -305,7 +318,7 @@
// Create an RPCParam by converting the Holder back into
// the held type.
resBody.addParam (new RPCParam (getParameterName(obj,
- method,
+ method[m],
i,
mName,
args),
@@ -320,9 +333,9 @@
}
}
- protected Method getMethod(JavaClass jc, String mName, Vector args)
+ protected Method[] getMethod(JavaClass jc, String mName)
{
- return jc.getMethod(mName, args.size());
+ return jc.getMethod(mName);
}
/**
1.7 +4 -4 xml-axis/java/src/org/apache/axis/utils/cache/JavaClass.java
Index: JavaClass.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/cache/JavaClass.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- JavaClass.java 30 Oct 2001 16:46:41 -0000 1.6
+++ JavaClass.java 15 Feb 2002 18:20:10 -0000 1.7
@@ -101,17 +101,17 @@
}
/**
- * Lookup a method based on name and number of arguments
+ * Lookup a method based on name. This method returns an array just in
+ * case there is more than one.
* @param name name of method
- * @param numargs number of arguments
*/
- public Method getMethod(String name, int numargs) {
+ public Method[] getMethod(String name) {
JavaMethod jm = (JavaMethod) methods.get(name);
if (jm == null) {
methods.put(name, jm=new JavaMethod(jc, name));
}
- return jm.getMethod(numargs);
+ return jm.getMethod();
}
};
1.9 +9 -32 xml-axis/java/src/org/apache/axis/utils/cache/JavaMethod.java
Index: JavaMethod.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/cache/JavaMethod.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JavaMethod.java 30 Oct 2001 16:46:41 -0000 1.8
+++ JavaMethod.java 15 Feb 2002 18:20:10 -0000 1.9
@@ -65,9 +65,7 @@
*/
public class JavaMethod {
- // at most, one of the following two are non-null, depending
- // on the number of methods by this name found in the class
- private Method unique = null;
+ // The list of the methods in the given class with the given name.
private Method[] methods = null;
/**
@@ -77,50 +75,29 @@
*/
public JavaMethod(Class jc, String name) {
Method[] methods = jc.getMethods();
- Vector workinglist = null;
+ Vector workinglist = new Vector();
// scan for matching names, saving the match if it is unique,
// otherwise accumulating a list
for (int i=0; i<methods.length; i++) {
if (methods[i].getName().equals(name)) {
- if (unique != null) {
- workinglist = new Vector();
- workinglist.addElement(unique);
- workinglist.addElement(methods[i]);
- unique = null;
- } else if (workinglist != null) {
- workinglist.addElement(methods[i]);
- } else {
- unique = methods[i];
- }
+ workinglist.addElement(methods[i]);
}
}
// If a list was found, convert it into an array
- if (workinglist != null) {
+ if (workinglist.size() > 0) {
this.methods = new Method[workinglist.size()];
workinglist.copyInto(this.methods);
}
}
/**
- * Attempt to find the closest matching method based on the number
- * of arguments only. Note: if there are multiple matches, one
- * will be picked randomly. If the name is unique, it is simply
- * returned without checking as attempts to invoke a method based
- * on this will undoubtably fail anyway.
- * @param numargs number of arguments. Use -1 to indicate "don't care".
- * @return closest match
+ * Lookup a method based on name. This method returns an array just in
+ * case there is more than one.
+ * @param name name of method
*/
- public Method getMethod(int numargs) {
- if (methods != null) {
- for (int i=0; i<methods.length; i++) {
- if (methods[i].getParameterTypes().length == numargs) {
- return methods[i];
- }
- }
- }
-
- return unique;
+ public Method[] getMethod() {
+ return methods;
}
};
1.7 +19 -25 xml-axis/java/test/utils/cache/TestJavaClass.java
Index: TestJavaClass.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/utils/cache/TestJavaClass.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- TestJavaClass.java 18 Oct 2001 13:28:39 -0000 1.6
+++ TestJavaClass.java 15 Feb 2002 18:20:10 -0000 1.7
@@ -38,44 +38,38 @@
JavaClass jcVec = new JavaClass(v);
JavaClass jcST = new JavaClass(st);
- Method countTkns = jcST.getMethod("countTokens", 0);
- Method nextTkn = jcST.getMethod("nextToken", 1);
+ Method countTkns = jcST.getMethod("countTokens")[0];
+ Method nextTkn = jcST.getMethod("nextToken")[0];
- Method add1 = jcVec.getMethod("add", 1);
- Method add2 = jcVec.getMethod("add", 2);
+ Method[] adds = jcVec.getMethod("add");
assertEquals("countTkns name was not 'countTokens', it is: " +
countTkns.getName(),
"countTokens", countTkns.getName());
assertEquals("nextTkn name was not 'nextToken', it is: " +
nextTkn.getName(),
"nextToken", nextTkn.getName());
- assertEquals("Return type was not 'boolean', it was: " +
add1.getReturnType().getName(),
- "boolean", add1.getReturnType().getName());
- assertEquals("Return type was not 'void', it was: " +
add2.getReturnType().getName(),
- "void", add2.getReturnType().getName());
- }
-
- public void testNoSuchMethod()
- {
- Class v = new java.util.Vector().getClass();
- JavaClass jcVec = new JavaClass(v);
+ assertEquals("There are not 2 add methods as expected, there are " +
adds.length, 2, adds.length);
- Method add7 = jcVec.getMethod("add", 7);
- assertNull("add7 was not null", add7);
+ for (int i = 0; i < adds.length; ++i) {
+ if (adds[i].getReturnType().equals(boolean.class)) {
+ assertEquals("Unexpected boolean add signature",
+ "public synchronized boolean
java.util.Vector.add(java.lang.Object)",
+ adds[i].toString());
+ }
+ else {
+ assertEquals("Unexpected void add signature",
+ "public void java.util.Vector.add(int,java.lang.Object)",
+ adds[i].toString());
+ }
+ }
}
- public void testUnknownNumberOfArgs()
+ public void testNoSuchMethod()
{
Class v = new java.util.Vector().getClass();
JavaClass jcVec = new JavaClass(v);
- Method add7 = jcVec.getMethod("add", -1);
- assertNull("add7 was not null", add7);
-
- Method insertElementAt = jcVec.getMethod("insertElementAt", -1);
- assertEquals("Length was not 2, it was: " +
insertElementAt.getParameterTypes().length,
- 2, insertElementAt.getParameterTypes().length);
- assertEquals("Return type was not 'void', it was: " +
insertElementAt.getReturnType().getName(),
- "void", insertElementAt.getReturnType().getName());
+ Method[] gorp = jcVec.getMethod("gorp");
+ assertNull("gorp was not null", gorp);
}
}
1.5 +19 -24 xml-axis/java/test/utils/cache/TestJavaMethod.java
Index: TestJavaMethod.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/utils/cache/TestJavaMethod.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- TestJavaMethod.java 18 Oct 2001 13:28:39 -0000 1.4
+++ TestJavaMethod.java 15 Feb 2002 18:20:10 -0000 1.5
@@ -25,40 +25,34 @@
Class vector = new java.util.Vector().getClass();
JavaMethod jmAdd = new JavaMethod(vector, "add");
assertNotNull("jmAdd was null", jmAdd);
-
- Method methodWithOneParam = jmAdd.getMethod(1);
- assertEquals("Method with one param was not 'add'", "add",
methodWithOneParam.getName());
- Method methodWithTwoParams = jmAdd.getMethod(2);
- assertEquals("Method with two params was not 'add'", "add",
methodWithTwoParams.getName());
- assertEquals("Method with one param return type was not 'boolean'",
"boolean", methodWithOneParam.getReturnType().getName());
- assertEquals("Method with two params return type was not 'void'", "void",
methodWithTwoParams.getReturnType().getName());
-
- boolean gotError = false;
- try {
- Method nonceMethod = jmAdd.getMethod(0); //should be no add() method
with 0 params
- nonceMethod.getName();
- }
- catch (NullPointerException ex) {
- gotError = true;
- }
- assertTrue("Expected NullPointerException", gotError);
+ Method[] adds = jmAdd.getMethod();
+ assertEquals("There are not 2 add methods as expected, there are " +
adds.length, 2, adds.length);
- //on the other hand, make sure methods with 0 params work...
- JavaMethod jmCapacity = new JavaMethod(vector, "capacity");
- Method methodWithNoParams = jmCapacity.getMethod(0);
- assertEquals("Method with no params was not 'capacity'", "capacity",
methodWithNoParams.getName());
+ for (int i = 0; i < adds.length; ++i) {
+ if (adds[i].getReturnType().equals(boolean.class)) {
+ assertEquals("Unexpected boolean add signature",
+ "public synchronized boolean
java.util.Vector.add(java.lang.Object)",
+ adds[i].toString());
+ }
+ else {
+ assertEquals("Unexpected void add signature",
+ "public void java.util.Vector.add(int,java.lang.Object)",
+ adds[i].toString());
+ }
+ }
}
public void testGetMethodWithOverloadedStringValueOf()
{
+/* RJB - now that I've removed the numArgs parameter, is this test really testing
anything?
Class str = new String().getClass();
JavaMethod jm = new JavaMethod(str, "valueOf");
assertNotNull("JavaMethod is null", jm);
- Method methodWithOneParam = jm.getMethod(1);
+ Method methodWithOneParam = jm.getMethod()[0];
assertEquals("Method with one param is not 'valueOf'",
"valueOf",methodWithOneParam.getName());
- Method methodWithThreeParams = jm.getMethod(3);
+ Method methodWithThreeParams = jm.getMethod()[0];
assertEquals("Method with two params is not 'valueOf'",
"valueOf",methodWithThreeParams.getName());
assertEquals("Method with one param return type is not 'java.lang.String'",
"java.lang.String", methodWithOneParam.getReturnType().getName());
@@ -66,12 +60,13 @@
boolean gotError = false;
try {
- Method nonceMethod = jm.getMethod(2); //should be no valueOf() method
with 2 params
+ Method nonceMethod = jm.getMethod()[0]; //should be no valueOf() method
with 2 params
nonceMethod.getName();
}
catch (NullPointerException ex) {
gotError = true;
}
assertTrue("Expected NullPointerException", gotError);
+*/
}
}
1.4 +29 -25 xml-axis/java/test/wsdl/clash/clash.wsdl
Index: clash.wsdl
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/clash/clash.wsdl,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- clash.wsdl 13 Feb 2002 15:27:47 -0000 1.3
+++ clash.wsdl 15 Feb 2002 18:20:10 -0000 1.4
@@ -19,11 +19,18 @@
<xsd:element name="sharedName" type="xsd:int"/>
</xsd:all>
</xsd:complexType>
- <xsd:element name="myElement">
+ <xsd:element name="sharedName">
<xsd:complexType>
- <all>
- <element name="sharedName" type="xsd:int"/>
- </all>
+ <xsd:all>
+ <xsd:element name="sharedName" type="xsd:int"/>
+ </xsd:all>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="another">
+ <xsd:complexType>
+ <xsd:all>
+ <xsd:element name="sharedName" type="xsd:boolean"/>
+ </xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:schema>
@@ -35,8 +42,14 @@
<message name="sharedName">
<part name="sharedName" type="tns:sharedName"/>
</message>
+ <message name="anotherMessage">
+ <part name="sharedName" type="xsd:int"/>
+ </message>
<message name="literalMessage">
- <part name="literalPart" element="tns:myElement"/>
+ <part name="literalPart" element="tns:sharedName"/>
+ </message>
+ <message name="anotherLitMessage">
+ <part name="sharedName" element="tns:another"/>
</message>
<!-- port type declns -->
@@ -45,32 +58,29 @@
<input name="sharedName" message="tns:empty"/>
<output name="sharedName" message="tns:sharedName"/>
</operation>
-<!-- a bug in WSDL4J doesn't allow overloaded operations
<operation name="sharedName">
<input name="sharedName" message="tns:sharedName"/>
<output name="empty" message="tns:empty"/>
</operation>
<operation name="sharedName">
- <input name="empty" message="tns:empty"/>
- <output name="sharedName" message="tns:sharedName"/>
+ <input name="another" message="tns:anotherMessage"/>
+ <output name="empty" message="tns:empty"/>
</operation>
--->
</portType>
+
<portType name="literalPort">
<operation name="sharedName">
<input name="sharedName" message="tns:empty"/>
<output name="sharedName" message="tns:literalMessage"/>
</operation>
-<!-- a bug in WSDL4J doesn't allow overloaded operations
<operation name="sharedName">
<input name="sharedName" message="tns:literalMessage"/>
<output name="empty" message="tns:empty"/>
</operation>
<operation name="sharedName">
- <input name="empty" message="tns:empty"/>
- <output name="sharedName" message="tns:literalMessage"/>
+ <input name="another" message="tns:anotherLitMessage"/>
+ <output name="empty" message="tns:empty"/>
</operation>
--->
</portType>
<!-- binding declns -->
@@ -86,7 +96,6 @@
<soap:body use="encoded"/>
</output>
</operation>
-<!-- a bug in WSDL4J doesn't allow overloaded operations
<operation name="sharedName">
<input name="sharedName">
<soap:body use="encoded"/>
@@ -96,14 +105,13 @@
</output>
</operation>
<operation name="sharedName">
- <input name="empty">
+ <input name="another">
<soap:body use="encoded"/>
</input>
- <output name="sharedName">
+ <output name="empty">
<soap:body use="encoded"/>
</output>
</operation>
--->
</binding>
<binding name="sharedName" type="tns:literalPort">
@@ -118,7 +126,6 @@
<soap:body use="literal"/>
</output>
</operation>
-<!-- a bug in WSDL4J doesn't allow overloaded operations
<operation name="sharedName">
<input name="sharedName">
<soap:body use="literal"/>
@@ -128,14 +135,13 @@
</output>
</operation>
<operation name="sharedName">
- <input name="empty">
+ <input name="another">
<soap:body use="literal"/>
</input>
- <output name="sharedName">
+ <output name="empty">
<soap:body use="literal"/>
</output>
</operation>
--->
</binding>
<binding name="anotherNonSharedName" type="tns:sharedName">
@@ -150,7 +156,6 @@
<soap:body use="encoded"/>
</output>
</operation>
-<!-- a bug in WSDL4J doesn't allow overloaded operations
<operation name="sharedName">
<input name="sharedName">
<soap:body use="encoded"/>
@@ -160,14 +165,13 @@
</output>
</operation>
<operation name="sharedName">
- <input name="empty">
+ <input name="another">
<soap:body use="encoded"/>
</input>
- <output name="sharedName">
+ <output name="empty">
<soap:body use="encoded"/>
</output>
</operation>
--->
</binding>
<!-- service decln -->