View Javadoc

1   /*
2    * $Id: AxisMessageAdapter.java 7963 2007-08-21 08:53:15Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.providers.soap.axis;
12  
13  import org.mule.impl.ThreadSafeAccess;
14  import org.mule.providers.AbstractMessageAdapter;
15  import org.mule.providers.soap.MuleSoapHeaders;
16  import org.mule.providers.soap.i18n.SoapMessages;
17  import org.mule.transformers.simple.SerializableToByteArray;
18  import org.mule.umo.MessagingException;
19  import org.mule.umo.transformer.UMOTransformer;
20  import org.mule.util.StringUtils;
21  
22  import java.util.Iterator;
23  
24  import javax.activation.DataHandler;
25  import javax.xml.soap.SOAPException;
26  import javax.xml.soap.SOAPMessage;
27  
28  import org.apache.axis.MessageContext;
29  import org.apache.axis.attachments.AttachmentPart;
30  
31  /**
32   * <code>AxisMessageAdapter</code> wraps a soap message. The payload of the adapter
33   * is the raw message received from the transport, but you also have access to the
34   * SOAPMessage object by using <code>adapter.getSOAPMessage()</code>
35   */
36  public class AxisMessageAdapter extends AbstractMessageAdapter
37  {
38      /**
39       * Serial version
40       */
41      private static final long serialVersionUID = -923205879581370143L;
42  
43      private final Object payload;
44      private final SOAPMessage message;
45      private UMOTransformer trans = new SerializableToByteArray();
46  
47      public AxisMessageAdapter(Object message) throws MessagingException
48      {
49          this.payload = message;
50          try
51          {
52              MessageContext ctx = MessageContext.getCurrentContext();
53  
54              if (ctx != null)
55              {
56                  MuleSoapHeaders header = new MuleSoapHeaders(ctx.getMessage().getSOAPPart().getEnvelope()
57                      .getHeader());
58  
59                  if (StringUtils.isNotBlank(header.getReplyTo()))
60                  {
61                      setReplyTo(header.getReplyTo());
62                  }
63  
64                  if (StringUtils.isNotBlank(header.getCorrelationGroup()))
65                  {
66                      setCorrelationGroupSize(Integer.parseInt(header.getCorrelationGroup()));
67                  }
68                  if (StringUtils.isNotBlank(header.getCorrelationSequence()))
69                  {
70                      setCorrelationSequence(Integer.parseInt(header.getCorrelationSequence()));
71                  }
72                  if (StringUtils.isNotBlank(header.getCorrelationId()))
73                  {
74                      setCorrelationId(header.getCorrelationId());
75                  }
76  
77                  this.message = ctx.getMessage();
78                  int x = 1;
79                  try
80                  {
81                      for (Iterator i = this.message.getAttachments(); i.hasNext(); x++)
82                      {
83                          super.addAttachment(String.valueOf(x), ((AttachmentPart)i.next())
84                              .getActivationDataHandler());
85                      }
86                  }
87                  catch (Exception e)
88                  {
89                      // this will not happen
90                      logger.fatal("Failed to read attachments", e);
91                  }
92              }
93              else
94              {
95                  this.message = null;
96              }
97          }
98          catch (SOAPException e)
99          {
100             throw new MessagingException(SoapMessages.failedToProcessSoapHeaders(), message, e);
101         }
102     }
103 
104     public AxisMessageAdapter(AxisMessageAdapter template)
105     {
106         super(template);
107         payload = template.payload;
108         message = template.message;
109         trans = template.trans;
110     }
111 
112     /**
113      * Converts the message implementation into a String representation
114      * 
115      * @param encoding The encoding to use when transforming the message (if
116      *            necessary). The parameter is used when converting from a byte array
117      * @return String representation of the message payload
118      * @throws Exception Implementation may throw an endpoint specific exception
119      */
120     public String getPayloadAsString(String encoding) throws Exception
121     {
122         return new String(getPayloadAsBytes(), encoding);
123     }
124 
125     /**
126      * Converts the payload implementation into a String representation
127      * 
128      * @return String representation of the payload
129      * @throws Exception Implemetation may throw an endpoint specific exception
130      */
131     public byte[] getPayloadAsBytes() throws Exception
132     {
133         return (byte[])trans.transform(payload);
134     }
135 
136     /**
137      * @return the current payload
138      */
139     public Object getPayload()
140     {
141         return payload;
142     }
143 
144     public SOAPMessage getSoapMessage()
145     {
146         return message;
147     }
148 
149     public void addAttachment(String name, DataHandler dataHandler) throws Exception
150     {
151         if (null != message)
152         {
153             message.addAttachmentPart(new AttachmentPart(dataHandler));
154         }
155         super.addAttachment(name, dataHandler);
156     }
157 
158     public void removeAttachment(String name) throws Exception
159     {
160         if ("all".equalsIgnoreCase(name))
161         {
162             message.removeAllAttachments();
163             attachments.clear();
164         }
165         else
166         {
167             throw new SOAPException(SoapMessages.cannotRemoveSingleAttachment().toString());
168         }
169     }
170 
171     public ThreadSafeAccess newThreadCopy()
172     {
173         return new AxisMessageAdapter(this);
174     }
175 
176 }