Many thanks for you feedback, Davanum.

Are you sure this is a bug? Since your on the Apache webservices team, I'll take your word for it.

I was expecting I'm just doing something wrong, though if there's a right way to do this, I can't find it documented anywhere.

Is there really no way to get Java2WSDL to add the "mime:multipartRelated" element inserted in the "wsdl:output" of a "wsdl:operation" within the "wsdl:binding" portion of the WSDL document?

Cheers,
Bill

On Apr 2, 2004, at 8:52 AM, Davanum Srinivas wrote:

Please log a bug - http://issues.apache.org/jira/

--- William Bug <[EMAIL PROTECTED]> wrote:
Hi All,

I'm having trouble creating an appropriate WSDL file to create a
service that returns a large set of binary attachments.

I've been trying to combine what I could pull from the documentation on
WSDL2Java with the info in the very useful article:


Web services programming tips and tricks: SOAP attachments with JAX-RPC
http://www-106.ibm.com/developerworks/webservices/library/ws-tip-
soapjax.html


So far, I've not been successful.

I've got an original implementation in SAAJ that works, but the code is
much more complicated than it would be had I used JAX-RPC attachments
as described in the article listed above.


I created a very simple Interface that I ran through Java2WSDL to
create my WSDL file.

The Interface is as follows:

<snippet>
import java.io.File;
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
  *
  * @author  billbug
  */
public interface IRepositoryAccess extends Remote  {
         public File[] getImages(Boolean returnZip, String imageSet)
throws RemoteException;
}
</snippet>

I assumed extrapolating from the article above that I could have a
return type of File[] to return a collection of attached files.

The WSDL generated from this interface is all exactly as I'd expect it
to be - except in the wsdl:output element created within the
wsdl:operation element for my function call within the wsdl:binding
section of the WSDL.
Unfortunately, all I get is:

<snippet>
<wsdl:output name="getImagesResponse">
<wsdlsoap:body namespace="urn:RepositoryAccessService" use="encoded"/>
</wsdl:output>
</snippet>


According to the article, it should look something like this:

<snippet>
          <wsdl:output name="getImagesResponse">
                        <mime:multipartRelated>
                                <mime:part name="part1">
                                <wsdlsoap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
namespace="urn:RepositoryAccessService" use="encoded"/>
                        </mime:part>
                        <mime:part name="part2">
                                <mime:content part="output"
type="application/octetstream"/>
                        </mime:part>
                </mime:multipartRelated>
          </wsdl:output>
</snippet>

with:
        xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/";
included in the wsdl:definitions element at the top of the WSDL.

Basically, it's a multipart MIME message, where the first part is the
body of the SOAP response message, the the additional part(s) are the
attached binary files.

If I add in the mime:multipartRelated as given above into the
wsdl:output element, then try to run WSDL2Java, I get the following
error:

java org.apache.axis.wsdl.WSDL2Java --output "gen" --deployScope
"Application" --server-side --skeletonDeploy --verbose
RepositoryAcess.wsdl
java.lang.NullPointerException
at
org.apache.axis.wsdl.symbolTable.SymbolTable.addMIMETypes(SymbolTable. ja
va:2084)
at
org.apache.axis.wsdl.symbolTable.SymbolTable.fillInBindingInfo(SymbolT ab
le.java:1860)
at
org.apache.axis.wsdl.symbolTable.SymbolTable.populateBindings(SymbolTa bl
e.java:1795)
at
org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java :
577)
at
org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:421)
at
org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java :
408)
at
org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java :
393)
at
org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:245)
at java.lang.Thread.run(Thread.java:552)


I peaked into the source for
org.apache.axis.wsdl.symbolTable.SymbolTable.  At line 2084 where it's
hitting a NullPointerException, it is in the function addMIMETypes as
indicated above.  Here's a snippet from that function:

<snippet>
/**
* Add the parts that are really MIME types as MIME types.
* A side effect is to return the body Type of the given
* MIMEMultipartRelated object.
*/
private Use addMIMETypes(BindingEntry bEntry, MIMEMultipartRelated
mpr,
Operation op) throws IOException {
Use bodyType = Use.ENCODED;
List parts = mpr.getMIMEParts();
Iterator i = parts.iterator();
while (i.hasNext()) {
MIMEPart part = (MIMEPart) i.next();
List elems = part.getExtensibilityElements();
Iterator j = elems.iterator();
while (j.hasNext()) {
Object obj = j.next();
if (obj instanceof MIMEContent) {
MIMEContent content = (MIMEContent) obj;
TypeEntry typeEntry = findPart(op,
content.getPart());
line:2084-->String dims = typeEntry.getDimensions();
if(dims.length() <=0 && typeEntry.getRefType() !=
null) {
Node node = typeEntry.getRefType().getNode();
if(getInnerCollectionComponentQName(node)!=null)
dims += "[]";
}
String type = content.getType();
if(type == null || type.length() == 0)
type = "text/plain";
bEntry.setMIMEInfo(op.getName(), content.getPart(),
type, dims);
</snippet>


As best I figure from this code, the typeEntry object is null, probably
because content.getPart() returns null or an invalid value.


I'm pretty certain I've got the wsdl:output MIME syntax in the WSDL
very close.  The part I'm pretty certain is wrong is the line:

<mime:content part="output" type="application/octetstream"/>

I think the 'part="output" is the offending piece. The article I'm
using as my example describes how to create a WSDL for a function that
accepts an attachment as an input parameter, not one that returns an
attachment. I'm also trying to attach several files, not just a single
file. It seems I ought to have to specify I'm returning an array of
attachments somewhere in the mime:content element.


I've been to the World-Wide Web consortium site to look over the WSDL
v1.2 specification.  There's very little info contained in the section
on MIME multi-part messages:
        http://www.w3.org/TR/2003/WD-wsdl12-bindings-20030611/#_mime
There's really nothing here that goes much beyond the original article
I site above.

Can anyone suggest how to get this working?

Many thanks ahead of time for any assistance you can offer.

Cheers,
Bill Bug

Bill Bug
Senior Analyst/Ontological Engineer

Laboratory for Bioimaging  & Anatomical Informatics
Department of Neurobiology & Anatomy
Drexel University College of Medicine
2900 Queen Lane
Philadelphia, PA        19129
215 991 8430 (ph)



=====
Davanum Srinivas - http://webservices.apache.org/~dims/


Bill Bug
Senior Analyst/Ontological Engineer

Laboratory for Bioimaging  & Anatomical Informatics
Department of Neurobiology & Anatomy
Drexel University College of Medicine
2900 Queen Lane
Philadelphia, PA        19129
215 991 8430 (ph)



Reply via email to