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 2003/03/20 22:22:43 UTC
DO NOT REPLY [Bug 18205] New: -
WSDL type mapping broken for non-built-in MIME type attachments
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=18205>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=18205
WSDL type mapping broken for non-built-in MIME type attachments
Summary: WSDL type mapping broken for non-built-in MIME type
attachments
Product: Axis
Version: 1.1rc2
Platform: PC
OS/Version: Windows NT/2K
Status: NEW
Severity: Normal
Priority: Other
Component: WSDL processing
AssignedTo: axis-dev@ws.apache.org
ReportedBy: gary.gordon@softwareagusa.com
While the JAX-RPC standard does not absolutely require the handling of
attachments whose MIME type is not one of the five listed in the table of
chapter 7.5 of the spec, it says other MIME types may be supported using the
generic javax.activation.DataHandler. I believe the intent of Axis is to
support such generic MIME types using DataHandler, so that on Call.invoke(), an
argument can be a DataHandler or DataHandlerHolder if the attachment type is
some weirdo MIME type. Otherwise, Axis could only ever support the current
hard-coded types. To wit, the default type mapping implementation in Axis
contains:
myRegister(Constants.MIME_DATA_HANDLER, javax.activation.DataHandler.class,
new JAFDataHandlerSerializerFactory(),
new JAFDataHandlerDeserializerFactory());
While it is possible to explicitly set an operation parameter type to use the
MIME_DATA_HANDLER type mapping, this doesn't work when the attachment is
defined in the WSDL file, where the Service object is prefilled from the WSDL
file, and the Call object is then created via Service.CreateCall(). That is,
you can't and/or shouldn't have to tweak the OperationDesc parameters once it
is built from a WSDL file. In addition, the WSDLtoJava tools choke and abort
on WSDL files with such non-built-in MIME type attachments. To fix the
service.createCall() problem requires a one line fix. To fix WSDLtoJava
requires a few more lines in two files. I realize it may be a bit late to fix
these for 1.1, but I hope a maintenance release could use these.
Here are the two proposed fixes:
===================================================================
RCS file: /home/cvspublic/xml-axis/java/src/org/apache/axis/utils/JavaUtils.java
,v
retrieving revision 1.97
diff -u -r1.97 JavaUtils.java
--- JavaUtils.java 14 Mar 2003 15:36:06 -0000 1.97
+++ JavaUtils.java 20 Mar 2003 20:59:04 -0000
@@ -1156,7 +1156,7 @@
return "javax.mail.internet.MimeMultipart";
}
else {
- return null;
+ return "javax.activation.DataHandler";
}
} // mimeToJava
===================================================================
and
===================================================================
RCS file: /home/cvspublic/xml-axis/java/src/org/apache/axis/wsdl/toJava/Utils.ja
va,v
retrieving revision 1.74
diff -u -r1.74 Utils.java
--- Utils.java 14 Mar 2003 16:14:37 -0000 1.74
+++ Utils.java 20 Mar 2003 21:00:41 -0000
@@ -120,6 +120,8 @@
else if (mimeType.equals("text/xml") ||
mimeType.equals("application/xml")) {
return "org.apache.axis.holders.SourceHolder" + mimeDimensions;
+ } else {
+ return "org.apache.axis.holders.DataHandlerHolder" + mimeDimens
ions;
}
}
@@ -587,7 +589,7 @@
return "(org.apache.axis.attachments.OctetStream" + mimeDimensi
ons + ") " + var + ";";
}
else {
- return "(" + type.getName() + ") " + var + ";";
+ return "(javax.activation.DataHandler" + mimeDimensions + ") "
+ var + ";";
}
}
else {
@@ -799,7 +801,7 @@
return Constants.MIME_MULTIPART;
}
else {
- return null;
+ return Constants.MIME_DATA_HANDLER;
}
} // getMIMEType
===================================================================
As a test case, simply run:
java -classpath <your classpath> org.apache.axis.wsdl.WSDL2Java -s
MyService.wsdl
with and without the fix. The WSDL file could be as follows:
===================================================================
<?xml version="1.0" ?>
<definitions name="urn:GetQuote"
targetNamespace="urn:xmltoday-delayed-quotes"
xmlns:tns="urn:xmltoday-delayed-quotes"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soape="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<!-- message declns -->
<message name="GetQuoteRequest">
<part name="input" type="xsd:hexBinary"/>
</message>
<message name="GetQuoteResponse">
<part name="output" type = "xsd:hexBinary"/>
</message>
<!-- port type declns -->
<portType name="GetQuote">
<operation name="getQuote" >
<input message="tns:GetQuoteRequest"/>
<output message="tns:GetQuoteResponse"/>
</operation>
</portType>
<!-- binding declns -->
<binding name="GetQuoteBinding" type="tns:GetQuote">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getQuote">
<soap:operation soapAction="getQuote"/>
<input>
<mime:multipartRelated>
<mime:part>
<soap:body use="encoded"
namespace="urn:xmltoday-delayed-quotes"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</mime:part>
<mime:part>
<mime:content part="input" type="audio/midi"/>
</mime:part>
</mime:multipartRelated>
</input>
<output>
<mime:multipartRelated>
<mime:part>
<soap:body use="encoded"
namespace="urn:xmltoday-delayed-quotes"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</mime:part>
<mime:part>
<mime:content part="output" type="video/mpeg"/>
</mime:part>
</mime:multipartRelated>
</output>
</operation>
</binding>
<!-- service decln -->
<service name="GetQuoteService">
<port name="GetQuote" binding="tns:GetQuoteBinding">
<soap:address location="http://localhost:8080/axis/services/GetQuote"/>
</port>
</service>
</definitions>
===================================================================
Without the bug fix, you get a stack trace...
java.lang.NullPointerException
at org.apache.axis.wsdl.toJava.Utils.getNewQName(Utils.java:684)
at org.apache.axis.wsdl.toJava.JavaStubWriter.writeOperationMap(JavaStub
Writer.java:430)
at org.apache.axis.wsdl.toJava.JavaStubWriter.writeFileBody(JavaStubWrit
er.java:165)
at org.apache.axis.wsdl.toJava.JavaWriter.generate(JavaWriter.java:148)
at org.apache.axis.wsdl.toJava.JavaBindingWriter.generate(JavaBindingWri
ter.java:141)
at org.apache.axis.wsdl.toJava.JavaGeneratorFactory$Writers.generate(Jav
aGeneratorFactory.java:284)
at org.apache.axis.wsdl.gen.Parser.generate(Parser.java:328)
at org.apache.axis.wsdl.gen.Parser.access$000(Parser.java:82)
at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:246)
at java.lang.Thread.run(Thread.java:536)
Even with this fix, I still noteiced some weirdness, such as the generated stub
containing a no-arg constructor for DataHandler (which doesn't exist), but
that's probably another tweak somewhere. I'm more concerned with fixing
service.createCall().
Gary