SaajUtils
  
 

package com.ack.webservices.saaj;

import java.io.ByteArrayInputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.StringTokenizer;
import javax.activation.DataHandler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MimeHeader;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;

public class SaajUtils {

  /**
   * extract the MIME header information from within the HTTP Request
   * @param req the http request
   * @return MimeHeaders as defined within the SAAJ API
   */
  public static MimeHeaders getHeaders( HttpServletRequest req ) {
    Enumeration enum = req.getHeaderNames();
    MimeHeaders headers = new MimeHeaders();

    while( enum.hasMoreElements() ) {
      String headerName = (String) enum.nextElement();
      String headerValue = req.getHeader( headerName );

      StringTokenizer values = new StringTokenizer( headerValue, "," );
      while( values.hasMoreTokens() ) {
        headers.addHeader( headerName, values.nextToken().trim() );
      }
    }
    return headers;
  }

  /**
   * stuff the MIME headers into the HTTP response
   * @param headers the SAAJ MIME headers
   * @param res the Http servlet response
   */
  public static void putHeaders( MimeHeaders headers, HttpServletResponse res ) {
    for( Iterator it = headers.getAllHeaders(); it.hasNext(); ) {
      MimeHeader header = (MimeHeader) it.next();
      String[] values = headers.getHeader( header.getName() );
      if( values.length == 1 ) {
        res.setHeader( header.getName(), header.getValue() );
      }
      else {
        StringBuffer concat = new StringBuffer();
        for( int i = 0; i < values.length; i++ ) {
          if( i != 0 ) {
            concat.append( ',' );
          }
          concat.append( values[i] );
        }
        res.setHeader( header.getName(), concat.toString() );
      }
    }
  }

  public static void attachBytes( SOAPMessage soapMessage, byte[] theBytes, String contentType )
      throws SOAPException {
    AttachmentPart attachment = soapMessage.createAttachmentPart();
    attachment.setContent( new ByteArrayInputStream( theBytes ), contentType );
    soapMessage.addAttachmentPart( attachment );
  }

  public static void attachUrlContents( SOAPMessage soapMessage, String urlLocation, String contentType )
      throws SOAPException, MalformedURLException {
    URL url = new URL( urlLocation );
    AttachmentPart attachment = soapMessage.createAttachmentPart( new DataHandler( url ) );
    attachment.setContentType( contentType );
    soapMessage.addAttachmentPart( attachment );
  }

  public static String getAttachmentReport( SOAPMessage soapMessage ) throws SOAPException {
    int numOfAttachments = soapMessage.countAttachments();
    Iterator attachments = soapMessage.getAttachments();

    StringBuffer buf = new StringBuffer( "Number of attachments: " );
    buf.append( numOfAttachments );

    while( attachments.hasNext() ) {
      buf.append( "\n--------------------------------------------\n" );
      AttachmentPart attachment = (AttachmentPart) attachments.next();
      buf.append( "\nContent Location: " + attachment.getContentLocation() );
      buf.append( "\nContent Id: " + attachment.getContentId() );
      buf.append( "\nContent Size: " + attachment.getSize() );
      buf.append( "\nContent Type: " + attachment.getContentType() );
    }

    return buf.toString();
  }
}
