antelder    2003/01/07 09:37:38

  Modified:    java/src/org/apache/wsif/providers/soap/apacheaxis
                        WSIFOperation_ApacheAxis.java
  Log:
  Enable sending attachments when using messaging with the AXIS provider
  
  Revision  Changes    Path
  1.55      +54 -41    
xml-axis-wsif/java/src/org/apache/wsif/providers/soap/apacheaxis/WSIFOperation_ApacheAxis.java
  
  Index: WSIFOperation_ApacheAxis.java
  ===================================================================
  RCS file: 
/home/cvs/xml-axis-wsif/java/src/org/apache/wsif/providers/soap/apacheaxis/WSIFOperation_ApacheAxis.java,v
  retrieving revision 1.54
  retrieving revision 1.55
  diff -u -r1.54 -r1.55
  --- WSIFOperation_ApacheAxis.java     7 Jan 2003 12:03:02 -0000       1.54
  +++ WSIFOperation_ApacheAxis.java     7 Jan 2003 17:37:38 -0000       1.55
  @@ -57,8 +57,6 @@
   
   package org.apache.wsif.providers.soap.apacheaxis;
   
  -import java.io.IOException;
  -import java.io.StringReader;
   import java.rmi.RemoteException;
   import java.util.ArrayList;
   import java.util.HashMap;
  @@ -130,9 +128,9 @@
   import org.apache.wsif.util.jms.WSIFJMSDestination;
   import org.apache.wsif.wsdl.extensions.jms.JMSProperty;
   import org.apache.wsif.wsdl.extensions.jms.JMSPropertyValue;
  -import org.apache.xerces.parsers.DOMParser;
   import org.w3c.dom.Element;
  -import org.xml.sax.InputSource;
  +import org.w3c.dom.Node;
  +import org.w3c.dom.NodeList;
   import org.xml.sax.SAXException;
   
   import com.ibm.wsdl.extensions.mime.MIMEConstants;
  @@ -1775,25 +1773,25 @@
   
                boolean workedOK = false;
   
  +        List attachments = addAttachments(inMsg, call);
  +
                Object[] inputValues = getInputMessageValues2(inMsg, null);
                ArrayList soapBodies = new ArrayList();
                for (int i = 0; i < inputValues.length; i++) {
                        if (inputValues[i] instanceof Element) {
  -                             soapBodies.add(new SOAPBodyElement((Element) 
inputValues[i]));
  +                             Element el = (Element) inputValues[i];
  +                             
  +                             if ((attachments.size() > 0) && (i == 0)) {
  +                                     fixAttachmentPartsCID(el, attachments);
  +                             }
  +                             
  +                             soapBodies.add(new SOAPBodyElement(el));
                        } else {
                                throw new WSIFException(
                                        "unexpected input type: " + inputValues[i]);
                        }
                }
                
  -        List attachments = addAttachments(inMsg, call);
  -        int mimePartIndex = 0;
  -        for (Iterator i = attachments.iterator(); i.hasNext(); ) {
  -             AttachmentPart attachment = (AttachmentPart) i.next();
  -            Part part = (Part) inputMIMEParts.get(mimePartIndex);
  -            Element el = makeSOAPBodyPart(part, attachment);         
  -                     soapBodies.add(new SOAPBodyElement(el));
  -        }
                
           Object[] axisInputs = soapBodies.toArray(); 
   
  @@ -1815,36 +1813,51 @@
        }
   
       /**
  -     * This makes a DOM Element href part referencing an attachment
  -     * The SOAP body has an href referencing each attachment: 
  -     *  <soapenv:Body>
  -     *     <file href="cid:B4953A2DF527FD54DBA115A9BA32050D"; 
xmlns="http://webservices.eraserver.net/"/>
  -     *  </soapenv:Body>
  -     * With AXIS when making the SOAPBody out of DOM Elements and
  -     * adding attachments with Call.addAttachment, this part must 
  -     * be added manually to the SOAP body (an AXIS bug?)
  +     * Fix the CID in the href of an attachment.
  +     * When sending an attachent with messaging two parts will
  +     * be in the WSIF input message, a DOM Element for the SOAP body contents,
  +     * and a DataHandler for the attachment. The contents Element must
  +     * include a href part for the attachment. This method will find
  +     * that href part and correct the CID value for the new AttachmentPart.
  +     * SOAPBody example with a href part named 'file':
  +     *       <ns1:bounceImage4 xmlns:ns1="http://mime/";>
  +      *         <ns1:shouldBounce xsi:type="xsd:boolean">true</ns1:shouldBounce>
  +      *         <ns1:file href="cid:413B07CE410E48EB9D89DC0A4DDD715D"/>
  +      *  </ns1:bounceImage4>
        */
  -    private Element makeSOAPBodyPart(Part part, AttachmentPart attachment) throws 
WSIFException {
  -     
  -        StringBuffer sb = new StringBuffer("<");
  -        sb.append(part.getName());
  -        sb.append(" href=\"cid:";);
  -        sb.append(attachment.getContentId());
  -        sb.append("\" xmlns=\"");
  -        sb.append(inputNamespace);
  -        sb.append("\"/>");
  -        
  -             DOMParser parser = new DOMParser();
  -             try {
  -            parser.parse(new InputSource(new StringReader(sb.toString())));
  -        } catch (SAXException e) {
  -             throw new WSIFException("SAXException making attachment href", e);
  -        } catch (IOException e) {
  -             throw new WSIFException("IOException making attachment href", e);
  -        }
  -             Element el = parser.getDocument().getDocumentElement();
  +    private void fixAttachmentPartsCID(Element body, List attachments) throws 
WSIFException {
   
  -     return el;
  +        NodeList childNodes = body.getChildNodes();
  +
  +        /* this isn't so nice: the AttachentPart has no name
  +         * but I know they were added to the attachments list 
  +         * in the same order as inputMIMEParts so I can get the 
  +         * part name from there.
  +         */ 
  +        int mimePartIndex = 0;
  +        for (Iterator i = attachments.iterator(); i.hasNext(); ) {
  +
  +             AttachmentPart attachment = (AttachmentPart) i.next();
  +            Part part = (Part) inputMIMEParts.get(mimePartIndex);
  +            String partName = part.getName();
  +
  +            Element el = null;
  +            for(int j = 0; j < childNodes.getLength() && el == null; j++) {
  +                     Node n = childNodes.item(j);
  +                     if (partName.equals(n.getLocalName()) && n instanceof Element) 
{
  +                    el = (Element) n;
  +                    el.setAttribute("href", "cid:"; + attachment.getContentId());    
                 
  +                     }
  +            }
  +            
  +            if (el == null) {
  +             throw new WSIFException(
  +                 "could not find attachment part '"
  +                 + partName
  +                 + "' in body: " 
  +                 + body);
  +            }
  +        }
       }
   
        /**
  
  
  


Reply via email to