View Javadoc

    1   package org.codehaus.xfire.aegis.type.mtom;
    2
    3   import java.io.IOException;
    4   import java.net.MalformedURLException;
    5   import java.net.URL;
    6   import java.util.Map;
    7
    8   import javax.activation.DataContentHandler;
    9   import javax.activation.DataHandler;
    10  import javax.activation.URLDataSource;
    11
    12  import org.codehaus.xfire.MessageContext;
    13  import org.codehaus.xfire.aegis.MessageReader;
    14  import org.codehaus.xfire.aegis.MessageWriter;
    15  import org.codehaus.xfire.aegis.type.Type;
    16  import org.codehaus.xfire.attachments.Attachment;
    17  import org.codehaus.xfire.attachments.Attachments;
    18  import org.codehaus.xfire.attachments.DefaultDataContentHandlerFactory;
    19  import org.codehaus.xfire.attachments.SimpleAttachment;
    20  import org.codehaus.xfire.fault.XFireFault;
    21
    22  /***
    23   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
    24   */
    25  public abstract class XOPType
    26  	extends Type
    27  {
    28      public final static String XOP_NS = "http://www.w3.org/2004/08/xop/include";
    29      public final static String XML_MIME_NS = "http://www.w3.org/2004/11/xmlmime";
    30
    31      private static DefaultDataContentHandlerFactory factory =
    32          new DefaultDataContentHandlerFactory();
    33
    34      private Map classToCType;
    35      private Map CTypeToClass;
    36
    37      public XOPType()
    38      {
    39      }
    40
    41      public Object readObject(MessageReader reader, MessageContext context)
    42      	throws XFireFault
    43      {
    44          String uri = null; //getURI(reader.getValue(null, "href"));
    45          String contentType = null; //reader.getValue(XML_MIME_NS, "contentType");
    46
    47          Attachment att = getAttachment( uri, context );
    48
    49          String type = att.getDataHandler().getContentType();
    50          DataContentHandler handler = factory.createDataContentHandler(type);
    51          try
    52          {
    53              if ( handler != null )
    54              {
    55                  return handler.getContent(att.getDataHandler().getDataSource());
    56              }
    57              else
    58              {
    59                  return att.getDataHandler().getContent();
    60              }
    61          }
    62          catch (IOException e)
    63          {
    64              throw new XFireFault("Could not read the attachment " + uri, e, XFireFault.SENDER);
    65          }
    66      }
    67
    68      /***
    69       * Parse the URI from the <code>xop:Include</code> href value.
    70       * @param value
    71       * @return
    72       */
    73      protected String getURI(String value)
    74      {
    75          int index = value.indexOf(":");
    76          return value.substring(index+1);
    77      }
    78
    79      public Attachment getAttachment(String id, MessageContext context)
    80      	throws XFireFault
    81      {
    82          Attachments attachments =
    83              (Attachments) context.getProperty(Attachments.ATTACHMENTS_KEY);
    84          Attachment att = null;
    85
    86          if ( attachments != null)
    87          {
    88             att = attachments.getPart(id);
    89          }
    90
    91          // Try loading the URL remotely
    92          try
    93          {
    94              URLDataSource source = new URLDataSource(new URL(id));
    95              att = new SimpleAttachment(id, new DataHandler(source));
    96          }
    97          catch (MalformedURLException e)
    98          {
    99              throw new XFireFault("Invalid attachment id: " + id, e, XFireFault.SENDER);
    100         }
    101
    102         return att;
    103     }
    104
    105     public void writeObject(Object object, MessageWriter writer, MessageContext context)
    106     	throws XFireFault
    107     {
    108         /*Attachments attachments =
    109             (Attachments) context.getProperty(Attachments.ATTACHMENTS_KEY);
    110         if ( attachments == null )
    111         {
    112             attachments = new JavaMailAttachments();
    113             context.setProperty(Attachments.ATTACHMENTS_KEY, attachments);
    114         }
    115
    116         String id = null; // how do we generate this?
    117         String contentType = factory.getContentType(object.getClass()); // how?
    118
    119         DataHandler handler = new DataHandler(object, contentType);
    120         Attachment att = new SimpleAttachment(id, handler);
    121
    122         attachments.addPart(att);
    123
    124         // write XOP element*/
    125
    126         throw new UnsupportedOperationException();
    127     }
    128
    129
    130 }