scheu 2002/06/14 15:39:50
Modified: java/src/org/apache/axis/description ServiceDesc.java
java/src/org/apache/axis/encoding/ser BeanDeserializer.java
java/test/wsdl Java2WsdlAntTask.java Wsdl2javaTestSuite.xml
java/test/wsdl/addrNoImplSEI AddressBook.wsdl Main.java
Added: java/test/wsdl/addrNoImplSEI
AddressBookNoImplSEISoapBindingImpl.java
Removed: java/test/wsdl/addrNoImplSEI AddressBookSOAPBindingImpl.java
Log:
Problem:
The class passed to Java2WSDL may contain methods that
throw exceptions that are not allowed in an SEI.
The operations in the SEI must throw RemoteException
plus application specific exceptions. General exceptions
(like java.lang.Exception or java.lang.NullPointerException)
are not allowed in the SEI.
Solution:
Changed the ServiceDesc code that creates the FaultDesc objects.
A FaultDesc is not created for exceptions in the 'java' or 'javax'
packages. (Simple Change)
I recently added an addrNoImplSEI testcase which tests proper
processing if the server-side impl does not implement the SEI.
(This test is meant to somewhat simulate a server-side EJB).
I enhanced this testcase to roundtrip Java2WSDL and WSDL2Java.
I added some general purpose throw clauses to the Impl class to
make sure tht Java2WSDL properly ignored the exceptions when
generating the SEI.
Revision Changes Path
1.27 +11 -6 xml-axis/java/src/org/apache/axis/description/ServiceDesc.java
Index: ServiceDesc.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/description/ServiceDesc.java,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- ServiceDesc.java 11 Jun 2002 14:53:54 -0000 1.26
+++ ServiceDesc.java 14 Jun 2002 22:39:50 -0000 1.27
@@ -740,7 +740,12 @@
for (int i=0; i < exceptionTypes.length; i++) {
// Every remote method declares a java.rmi.RemoteException
- if (exceptionTypes[i] != java.rmi.RemoteException.class) {
+ // Only interested in application specific exceptions.
+ // Ignore java and javax package exceptions.
+ Class ex = exceptionTypes[i];
+ if (ex != java.rmi.RemoteException.class &&
+ !ex.getName().startsWith("java.") &&
+ !ex.getName().startsWith("javax.")) {
// For JSR 101 v.1.0, there is a simple fault mapping
// and a complexType fault mapping...both mappings
@@ -756,7 +761,7 @@
/* Old Simple Type Mode
- Field[] f = exceptionTypes[i].getDeclaredFields();
+ Field[] f = ex.getDeclaredFields();
ArrayList exceptionParams = new ArrayList();
for (int j = 0; j < f.length; j++) {
int mod = f[j].getModifiers();
@@ -771,7 +776,7 @@
exceptionParams.add(param);
}
}
- String pkgAndClsName = exceptionTypes[i].getName();
+ String pkgAndClsName = ex.getName();
FaultDesc fault = new FaultDesc();
fault.setName(pkgAndClsName);
fault.setParameters(exceptionParams);
@@ -783,12 +788,12 @@
ParameterDesc param = new ParameterDesc(
new QName("", "fault"),
ParameterDesc.IN,
- tm.getTypeQName(exceptionTypes[i]));
- param.setJavaType(exceptionTypes[i]);
+ tm.getTypeQName(ex));
+ param.setJavaType(ex);
ArrayList exceptionParams = new ArrayList();
exceptionParams.add(param);
- String pkgAndClsName = exceptionTypes[i].getName();
+ String pkgAndClsName = ex.getName();
FaultDesc fault = new FaultDesc();
fault.setName(pkgAndClsName);
fault.setParameters(exceptionParams);
1.32 +3 -3
xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java
Index: BeanDeserializer.java
===================================================================
RCS file:
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- BeanDeserializer.java 11 Jun 2002 14:53:55 -0000 1.31
+++ BeanDeserializer.java 14 Jun 2002 22:39:50 -0000 1.32
@@ -301,15 +301,15 @@
// Success! Register the target and deserializer.
collectionIndex = -1;
dSer.registerValueTarget(
- new BeanPropertyTarget(value, propDesc));
+ new BeanPropertyTarget(value, propDesc));
} else {
// Success! This is a collection of properties so use the index
collectionIndex++;
dSer.registerValueTarget(
- new BeanPropertyTarget(value,
+ new BeanPropertyTarget(value,
propDesc,
collectionIndex));
- }
+ }
}
return (SOAPHandler)dSer;
}
1.13 +8 -0 xml-axis/java/test/wsdl/Java2WsdlAntTask.java
Index: Java2WsdlAntTask.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/Java2WsdlAntTask.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- Java2WsdlAntTask.java 31 May 2002 20:29:51 -0000 1.12
+++ Java2WsdlAntTask.java 14 Jun 2002 22:39:50 -0000 1.13
@@ -78,6 +78,7 @@
private String output = "." ;
private String className = "." ;
private String servicePortName = null ;
+ private String portTypeName = null ;
private String implClass = null;
private boolean useInheritedMethods = false;
private String exclude = null;
@@ -109,6 +110,8 @@
}
if (servicePortName != null)
emitter.setServicePortName(servicePortName);
+ if (portTypeName != null)
+ emitter.setPortTypeName(portTypeName);
log("Java2WSDL " + className, Project.MSG_INFO);
emitter.setCls(className);
if (implClass != null)
@@ -165,6 +168,11 @@
// The setter for the "servicePortName" attribute
public void setServicePortName(String parameter) {
this.servicePortName = parameter;
+ }
+
+ // The setter for the "portTypeName" attribute
+ public void setPortTypeName(String parameter) {
+ this.portTypeName = parameter;
}
// The setter for the "namespace" attribute
1.104 +57 -1 xml-axis/java/test/wsdl/Wsdl2javaTestSuite.xml
Index: Wsdl2javaTestSuite.xml
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/Wsdl2javaTestSuite.xml,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -r1.103 -r1.104
--- Wsdl2javaTestSuite.xml 12 Jun 2002 18:41:12 -0000 1.103
+++ Wsdl2javaTestSuite.xml 14 Jun 2002 22:39:50 -0000 1.104
@@ -73,7 +73,19 @@
<mapping namespace="urn:MultiRefTest2" package="test.wsdl.multiref"/>
</wsdl2java>
- <!-- AddressBook Sample -->
+ <!-- AddressBook roundtrip example that does not implement SEI -->
+ <!-- Summary -->
+ <!-- Bootstrap the process by creating java classes from the original wsdl -->
+ <!-- Compile the classes plus the provided Impl class -->
+ <!-- The Impl class is supposed to simulate a server-side EJB -->
+ <!-- It does not implement the SEI and it contains some additional throw
clauses -->
+ <!-- Run Java2WSDL on the Impl class to ensure a valid wsdl is generated -->
+ <!-- Run WSDL2Java on the new wsdl to ensure valid java artifacts are generated
-->
+ <!-- This will ensure that java classes are not generated for
NullPointerException -->
+ <!-- Copy back over the original Impl and test classes. -->
+ <!-- They will be compiled and run as part of the test. -->
+ <delete dir="${build.dir}/classes/test/wsdl/addrNoImplSEI"/>
+ <delete dir="${build.dir}/work/test/wsdl/addrNoImplSEI"/>
<wsdl2java url="test/wsdl/addrNoImplSEI/AddressBook.wsdl"
output="build/work"
deployscope="session"
@@ -85,6 +97,50 @@
testcase="no">
<mapping namespace="urn:AddrNoImplSEI" package="test.wsdl.addrNoImplSEI"/>
</wsdl2java>
+
+ <!-- Copy over original classes -->
+ <copy todir="${build.dir}/work/test/wsdl/addrNoImplSEI" overwrite="yes">
+ <fileset dir="${test.dir}/wsdl/addrNoImplSEI">
+ <include name="*.java"/>
+ </fileset>
+ </copy>
+
+ <!-- Compile the Web Service -->
+ <javac srcdir="${build.dir}/work" destdir="${build.dest}" debug="${debug}">
+ <classpath refid="test-classpath" />
+ <include name="test/wsdl/addrNoImplSEI/**.java" />
+ <exclude name="test/wsdl/addrNoImplSEI/*TestCase.java" />
+ <exclude name="test/wsdl/addrNoImplSEI/Main.java" />
+ </javac>
+
+ <!-- Now run java to wsdl to make sure we don't have any strange artifacts -->
+ <java2wsdl output="build/work/test/wsdl/addrNoImplSEI/AddressBook.wsdl"
+ className=
"test.wsdl.addrNoImplSEI.AddressBookNoImplSEISoapBindingImpl"
+ useInheritedMethods="false"
+ portTypeName="AddressBookNoImplSEI"
+ namespace="http://addrNoImplSEI.wsdl.test"
+ location="http://localhost:8080/axis/services/AddressBookNoImplSEI">
+ <mapping namespace="urn:AddrNoImplSEI" package="test.wsdl.addrNoImplSEI"/>
+ </java2wsdl>
+
+ <!-- Now run wsdl to java to make sure we don't have any strange artifacts -->
+ <wsdl2java url="build/work/test/wsdl/addrNoImplSEI/AddressBook.wsdl"
+ output="build/work"
+ deployscope="session"
+ serverSide="yes"
+ skeletonDeploy="no"
+ noimports="no"
+ verbose="no"
+ typeMappingVersion="1.1"
+ testcase="no">
+ <mapping namespace="urn:AddrNoImplSEI" package="test.wsdl.addrNoImplSEI"/>
+ </wsdl2java>
+ <!-- Copy over original classes -->
+ <copy todir="${build.dir}/work/test/wsdl/addrNoImplSEI" overwrite="yes">
+ <fileset dir="${test.dir}/wsdl/addrNoImplSEI">
+ <include name="*.java"/>
+ </fileset>
+ </copy>
<!-- Operation style test (oneway, request/response, -->
<!-- solicit/response, notification -->
1.2 +4 -4 xml-axis/java/test/wsdl/addrNoImplSEI/AddressBook.wsdl
Index: AddressBook.wsdl
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/addrNoImplSEI/AddressBook.wsdl,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AddressBook.wsdl 21 May 2002 17:15:50 -0000 1.1
+++ AddressBook.wsdl 14 Jun 2002 22:39:50 -0000 1.2
@@ -57,7 +57,7 @@
</message>
<!-- port type declns -->
- <portType name="AddressBook">
+ <portType name="AddressBookNoImplSEI">
<operation name="addEntry">
<input message="tns:AddEntryRequest"/>
</operation>
@@ -68,7 +68,7 @@
</portType>
<!-- binding declns -->
- <binding name="AddressBookSOAPBinding" type="tns:AddressBook">
+ <binding name="AddressBookNoImplSEISoapBinding" type="tns:AddressBookNoImplSEI">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="addEntry">
@@ -100,8 +100,8 @@
</binding>
<!-- service decln -->
- <service name="AddressBookService">
- <port name="AddressBookNoImplSEI" binding="tns:AddressBookSOAPBinding">
+ <service name="AddressBookNoImplSEIService">
+ <port name="AddressBookNoImplSEI" binding="tns:AddressBookNoImplSEISoapBinding">
<soap:address
location="http://localhost:8080/axis/services/AddressBookNoImplSEI"/>
</port>
</service>
1.2 +18 -5 xml-axis/java/test/wsdl/addrNoImplSEI/Main.java
Index: Main.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/addrNoImplSEI/Main.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Main.java 21 May 2002 17:15:50 -0000 1.1
+++ Main.java 14 Jun 2002 22:39:50 -0000 1.2
@@ -106,7 +106,7 @@
ph.getExchange() + "-" + ph.getNumber());
}
- private static Object doit (AddressBook ab) throws Exception {
+ private static Object doit (AddressBookNoImplSEI ab) throws Exception {
System.err.println (">> Storing address for '" + name1 + "'");
ab.addEntry (name1, addr1);
System.err.println (">> Querying address for '" + name1 + "'");
@@ -121,6 +121,19 @@
resp = ab.getAddressFromName (name1);
System.err.println (">> Response is:");
printAddress (resp);
+
+ // Test NPE
+ try {
+ ab.addEntry(null, null);
+ throw new Exception("Expected exception when calling addEntry with null
params");
+ } catch (java.rmi.RemoteException e) {
+ if (e.detail instanceof java.lang.IllegalArgumentException) {
+ // Good! Expected this!
+ } else {
+ throw e; // This is not right!
+ }
+ }
+
return resp;
}
@@ -131,11 +144,11 @@
System.err.println ("Using proxy without session maintenance.");
System.err.println ("(queries without session should say: \"ADDRESS
NOT FOUND!\")");
- AddressBookService abs = new AddressBookServiceLocator();
+ AddressBookNoImplSEIService abs = new
AddressBookNoImplSEIServiceLocator();
opts.setDefaultURL( abs.getAddressBookNoImplSEIAddress() );
URL serviceURL = new URL(opts.getURL());
- AddressBook ab1 = null;
+ AddressBookNoImplSEI ab1 = null;
if (serviceURL == null) {
ab1 = abs.getAddressBookNoImplSEI();
}
@@ -148,14 +161,14 @@
}
System.err.println ("\n\nUsing proxy with session maintenance.");
- AddressBook ab2 = null;
+ AddressBookNoImplSEI ab2 = null;
if (serviceURL == null) {
ab2 = abs.getAddressBookNoImplSEI();
}
else {
ab2 = abs.getAddressBookNoImplSEI(serviceURL);
}
- ((AddressBookSOAPBindingStub) ab2).setMaintainSession (true);
+ ((AddressBookNoImplSEISoapBindingStub) ab2).setMaintainSession (true);
ret = doit (ab2);
if (ret == null) {
throw new Exception("session test expected non-null response, got
"+ret);
1.1
xml-axis/java/test/wsdl/addrNoImplSEI/AddressBookNoImplSEISoapBindingImpl.java
Index: AddressBookNoImplSEISoapBindingImpl.java
===================================================================
/**
* AddressBookNoImplSEISOAPBindingImpl.java
*
* This file was hand modified from the Emmitter generated code.
*/
package test.wsdl.addrNoImplSEI;
import java.util.Hashtable;
import java.util.Map;
// Don't implement the AddressBook interface
public class AddressBookNoImplSEISoapBindingImpl {
private Map addresses = new Hashtable();
public void addEntry(java.lang.String name, test.wsdl.addrNoImplSEI.Address
address)
throws java.rmi.RemoteException,
java.lang.IllegalArgumentException // This should be accepted
{
if (address == null) {
throw new java.lang.IllegalArgumentException();
}
this.addresses.put(name, address);
}
public test.wsdl.addrNoImplSEI.Address getAddressFromName(java.lang.String name)
throws java.rmi.RemoteException,
javax.xml.rpc.JAXRPCException // This should be accepted
{
return (test.wsdl.addrNoImplSEI.Address) this.addresses.get(name);
}
}