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(SymbolTab 
> le.java:1860)
>          at  
> org.apache.axis.wsdl.symbolTable.SymbolTable.populateBindings(SymbolTabl 
> 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/

Reply via email to