KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mule > providers > http > transformers > UMOMessageToHttpResponse


1 /*
2  * $Id: UMOMessageToHttpResponse.java 3798 2006-11-04 04:07:14Z aperepel $
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 MuleSource MPL
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.http.transformers;
12
13 import org.apache.commons.httpclient.Header;
14 import org.apache.commons.httpclient.HttpVersion;
15 import org.apache.commons.lang.StringUtils;
16 import org.mule.MuleManager;
17 import org.mule.config.MuleProperties;
18 import org.mule.providers.NullPayload;
19 import org.mule.providers.http.HttpConnector;
20 import org.mule.providers.http.HttpConstants;
21 import org.mule.providers.http.HttpResponse;
22 import org.mule.transformers.AbstractEventAwareTransformer;
23 import org.mule.transformers.simple.SerializableToByteArray;
24 import org.mule.umo.UMOEventContext;
25 import org.mule.umo.UMOMessage;
26 import org.mule.umo.transformer.TransformerException;
27
28 import java.io.ByteArrayInputStream JavaDoc;
29 import java.io.IOException JavaDoc;
30 import java.io.InputStream JavaDoc;
31 import java.text.SimpleDateFormat JavaDoc;
32 import java.util.Collection JavaDoc;
33 import java.util.Date JavaDoc;
34 import java.util.Iterator JavaDoc;
35 import java.util.Locale JavaDoc;
36 import java.util.Map JavaDoc;
37
38 /**
39  * <code>UMOMessageToHttpResponse</code> converts a UMOMEssage into an Http
40  * response.
41  *
42  * @author <a HREF="mailto:ross.mason@symphonysoft.com">Ross Mason</a>
43  * @version $Revision: 3798 $
44  */

45
46 public class UMOMessageToHttpResponse extends AbstractEventAwareTransformer
47 {
48     /**
49      * Serial version
50      */

51     private static final long serialVersionUID = 9137870668198309755L;
52
53     public static final String JavaDoc CUSTOM_HEADER_PREFIX = "";
54
55     private SimpleDateFormat JavaDoc format = null;
56     private String JavaDoc server = null;
57     private SerializableToByteArray serializableToByteArray;
58
59     public UMOMessageToHttpResponse()
60     {
61         registerSourceType(Object JavaDoc.class);
62         setReturnClass(Object JavaDoc.class);
63
64         format = new SimpleDateFormat JavaDoc(HttpConstants.DATE_FORMAT, Locale.US);
65
66         // When running with the source code, Meta information is not set
67
// so product name and version are not available, hence we hard code
68
if (MuleManager.getConfiguration().getProductName() == null)
69         {
70             server = "Mule/SNAPSHOT";
71         }
72         else
73         {
74             server = MuleManager.getConfiguration().getProductName() + "/"
75                      + MuleManager.getConfiguration().getProductVersion();
76         }
77         serializableToByteArray = new SerializableToByteArray();
78     }
79
80     public Object JavaDoc transform(Object JavaDoc src, String JavaDoc encoding, UMOEventContext context) throws TransformerException
81     {
82         // Send back the exception payload if one has been set
83
if (context.getMessage().getExceptionPayload() != null)
84         {
85             // src = context.getMessage().getExceptionPayload();
86
}
87
88         // Note this transformer excepts Null as we must always return a result
89
// from the Http
90
// connector if a response transformer is present
91
if (src instanceof NullPayload)
92         {
93             src = StringUtils.EMPTY;
94         }
95
96         try
97         {
98             HttpResponse response = null;
99             if (src instanceof HttpResponse)
100             {
101                 response = (HttpResponse)src;
102             }
103             else
104             {
105                 response = createResponse(src, encoding, context);
106             }
107
108             // Ensure there's a content type header
109
if (!response.containsHeader(HttpConstants.HEADER_CONTENT_TYPE))
110             {
111                 response.addHeader(new Header(HttpConstants.HEADER_CONTENT_TYPE,
112                     HttpConstants.DEFAULT_CONTENT_TYPE));
113             }
114
115             // Ensure there's a content length or transfer encoding header
116
if (!response.containsHeader(HttpConstants.HEADER_CONTENT_LENGTH)
117                 && !response.containsHeader(HttpConstants.HEADER_TRANSFER_ENCODING))
118             {
119                 InputStream JavaDoc content = response.getBody();
120                 if (content != null)
121                 {
122                     long len = response.getContentLength();
123                     if (len < 0)
124                     {
125                         if (response.getHttpVersion().lessEquals(HttpVersion.HTTP_1_0))
126                         {
127                             throw new IOException JavaDoc("Chunked encoding not supported for HTTP version "
128                                                   + response.getHttpVersion());
129                         }
130                         Header header = new Header(HttpConstants.HEADER_TRANSFER_ENCODING, "chunked");
131                         response.addHeader(header);
132                     }
133                     else
134                     {
135                         Header header = new Header(HttpConstants.HEADER_CONTENT_LENGTH, Long.toString(len));
136                         response.setHeader(header);
137                     }
138                 }
139                 else
140                 {
141                     Header header = new Header(HttpConstants.HEADER_CONTENT_LENGTH, "0");
142                     response.addHeader(header);
143                 }
144             }
145
146             UMOMessage msg = context.getMessage();
147
148             if (!response.containsHeader(HttpConstants.HEADER_CONNECTION))
149             {
150                 // See if the the client explicitly handles connection persistence
151
String JavaDoc connHeader = msg.getStringProperty(HttpConstants.HEADER_CONNECTION, null);
152                 if (connHeader != null)
153                 {
154                     if (connHeader.equalsIgnoreCase("keep-alive"))
155                     {
156                         Header header = new Header(HttpConstants.HEADER_CONNECTION, "keep-alive");
157                         response.addHeader(header);
158                         response.setKeepAlive(true);
159                     }
160                     if (connHeader.equalsIgnoreCase("close"))
161                     {
162                         Header header = new Header(HttpConstants.HEADER_CONNECTION, "close");
163                         response.addHeader(header);
164                         response.setKeepAlive(false);
165                     }
166                 }
167                 else
168                 {
169                     // Use protocol default connection policy
170
if (response.getHttpVersion().greaterEquals(HttpVersion.HTTP_1_1))
171                     {
172                         response.setKeepAlive(true);
173                     }
174                     else
175                     {
176                         response.setKeepAlive(false);
177                     }
178                 }
179             }
180             if ("HEAD".equalsIgnoreCase(msg.getStringProperty(HttpConnector.HTTP_METHOD_PROPERTY, null)))
181             {
182                 // this is a head request, we don't want to send the actual content
183
response.setBody(null);
184             }
185             return response;
186         }
187         catch (IOException JavaDoc e)
188         {
189             throw new TransformerException(this, e);
190         }
191
192     }
193
194     protected HttpResponse createResponse(Object JavaDoc src, String JavaDoc encoding, UMOEventContext context)
195         throws IOException JavaDoc, TransformerException
196     {
197         HttpResponse response = new HttpResponse();
198         UMOMessage msg = context.getMessage();
199
200         int status = msg.getIntProperty(HttpConnector.HTTP_STATUS_PROPERTY, HttpConstants.SC_OK);
201         String JavaDoc version = msg.getStringProperty(HttpConnector.HTTP_VERSION_PROPERTY, HttpConstants.HTTP11);
202         String JavaDoc date = format.format(new Date JavaDoc());
203         String JavaDoc contentType = msg.getStringProperty(HttpConstants.HEADER_CONTENT_TYPE,
204             HttpConstants.DEFAULT_CONTENT_TYPE);
205
206         response.setStatusLine(HttpVersion.parse(version), status);
207         response.setHeader(new Header(HttpConstants.HEADER_CONTENT_TYPE, contentType));
208         response.setHeader(new Header(HttpConstants.HEADER_DATE, date));
209         response.setHeader(new Header(HttpConstants.HEADER_SERVER, server));
210         if (msg.getProperty(HttpConstants.HEADER_EXPIRES) == null)
211         {
212             response.setHeader(new Header(HttpConstants.HEADER_EXPIRES, date));
213         }
214         response.setFallbackCharset(encoding);
215
216         Collection JavaDoc headerNames = HttpConstants.RESPONSE_HEADER_NAMES.values();
217         String JavaDoc headerName, value;
218         for (Iterator JavaDoc iterator = headerNames.iterator(); iterator.hasNext();)
219         {
220             headerName = (String JavaDoc)iterator.next();
221             value = msg.getStringProperty(headerName, null);
222             if (value != null)
223             {
224                 response.setHeader(new Header(headerName, value));
225             }
226         }
227
228         // Custom responseHeaderNames
229
Map JavaDoc customHeaders = (Map JavaDoc)msg.getProperty(HttpConnector.HTTP_CUSTOM_HEADERS_MAP_PROPERTY);
230         if (customHeaders != null)
231         {
232             Map.Entry JavaDoc entry;
233             for (Iterator JavaDoc iterator = customHeaders.entrySet().iterator(); iterator.hasNext();)
234             {
235                 entry = (Map.Entry JavaDoc)iterator.next();
236                 if (entry.getValue() != null)
237                 {
238                     response.setHeader(new Header(entry.getKey().toString(), entry.getValue().toString()));
239                 }
240             }
241         }
242
243         // Mule properties
244
String JavaDoc user = msg.getStringProperty(MuleProperties.MULE_USER_PROPERTY, null);
245         if (user != null)
246         {
247             response.setHeader(new Header(CUSTOM_HEADER_PREFIX + MuleProperties.MULE_USER_PROPERTY, user));
248         }
249         if (msg.getCorrelationId() != null)
250         {
251             response.setHeader(new Header(CUSTOM_HEADER_PREFIX + MuleProperties.MULE_CORRELATION_ID_PROPERTY,
252                 msg.getCorrelationId()));
253             response.setHeader(new Header(CUSTOM_HEADER_PREFIX
254                                           + MuleProperties.MULE_CORRELATION_GROUP_SIZE_PROPERTY,
255                 String.valueOf(msg.getCorrelationGroupSize())));
256             response.setHeader(new Header(CUSTOM_HEADER_PREFIX
257                                           + MuleProperties.MULE_CORRELATION_SEQUENCE_PROPERTY,
258                 String.valueOf(msg.getCorrelationSequence())));
259         }
260         if (msg.getReplyTo() != null)
261         {
262             response.setHeader(new Header(CUSTOM_HEADER_PREFIX + MuleProperties.MULE_REPLY_TO_PROPERTY,
263                 msg.getReplyTo().toString()));
264         }
265         if (src instanceof InputStream JavaDoc)
266         {
267             response.setBody((InputStream JavaDoc)src);
268         }
269         else if (src instanceof String JavaDoc)
270         {
271             response.setBodyString(src.toString());
272         }
273         else
274         {
275             response.setBody(new ByteArrayInputStream JavaDoc((byte[])serializableToByteArray.doTransform(src,
276                 encoding)));
277         }
278         return response;
279     }
280
281     public boolean isAcceptNull()
282     {
283         return true;
284     }
285 }
286
Popular Tags