View Javadoc

1   /*
2    * $Id: AbstractReceiverServlet.java 12303 2008-07-11 20:02:32Z dandiep $
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.transport.servlet;
12  
13  import org.mule.RequestContext;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.transport.OutputHandler;
16  import org.mule.config.ExceptionHelper;
17  import org.mule.transport.http.HttpConnector;
18  import org.mule.transport.http.HttpConstants;
19  import org.mule.transport.http.HttpResponse;
20  
21  import java.io.IOException;
22  
23  import javax.servlet.ServletConfig;
24  import javax.servlet.ServletException;
25  import javax.servlet.http.HttpServlet;
26  import javax.servlet.http.HttpServletResponse;
27  
28  import org.apache.commons.httpclient.Header;
29  import org.apache.commons.logging.Log;
30  import org.apache.commons.logging.LogFactory;
31  
32  /**
33   * A base servlet used to receive requests from a servlet container and route
34   * them into Mule
35   */
36  
37  public abstract class AbstractReceiverServlet extends HttpServlet
38  {
39      /**
40       * logger used by this class
41       */
42      protected transient Log logger = LogFactory.getLog(getClass());
43  
44      public static final String REQUEST_TIMEOUT_PROPERTY = "org.mule.servlet.timeout";
45      public static final String FEEDBACK_PROPERTY = "org.mule.servlet.feedback";
46      public static final String DEFAULT_CONTENT_TYPE_PROPERTY = "org.mule.servlet.default.content.type";
47  
48      /** The name of the servlet connector to use with this Servlet */
49      public static final String SERVLET_CONNECTOR_NAME_PROPERTY = "org.mule.servlet.connector.name";
50  
51      public static final String PAYLOAD_PARAMETER_NAME = "org.mule.servlet.payload.param";
52      public static final String DEFAULT_PAYLOAD_PARAMETER_NAME = "payload";
53  
54      public static final long DEFAULT_GET_TIMEOUT = 10000L;
55  
56      protected String payloadParameterName;
57      protected long timeout = DEFAULT_GET_TIMEOUT;
58      protected boolean feedback = true;
59      protected String defaultContentType = HttpConstants.DEFAULT_CONTENT_TYPE;
60  
61      public final void init() throws ServletException
62      {
63          doInit();
64      }
65  
66      public final void init(ServletConfig servletConfig) throws ServletException
67      {
68          String timeoutString = servletConfig.getInitParameter(REQUEST_TIMEOUT_PROPERTY);
69          if (timeoutString != null)
70          {
71              timeout = Long.parseLong(timeoutString);
72          }
73          logger.info("Default request timeout for GET methods is: " + timeout);
74  
75          String feedbackString = servletConfig.getInitParameter(FEEDBACK_PROPERTY);
76          if (feedbackString != null)
77          {
78              feedback = Boolean.valueOf(feedbackString).booleanValue();
79          }
80          logger.info("feedback is set to: " + feedback);
81  
82          String ct = servletConfig.getInitParameter(DEFAULT_CONTENT_TYPE_PROPERTY);
83          if (ct != null)
84          {
85              defaultContentType = ct;
86          }
87          logger.info("Default content type is: " + defaultContentType);
88  
89          payloadParameterName = servletConfig.getInitParameter(PAYLOAD_PARAMETER_NAME);
90          if (payloadParameterName == null)
91          {
92              payloadParameterName = DEFAULT_PAYLOAD_PARAMETER_NAME;
93          }
94          logger.info("Using payload param name: " + payloadParameterName);
95  
96          doInit(servletConfig);
97      }
98  
99      protected void doInit(ServletConfig servletConfig) throws ServletException
100     {
101         // nothing to do
102     }
103 
104     protected void doInit() throws ServletException
105     {
106         // nothing to do
107     }
108 
109     protected void writeResponse(HttpServletResponse servletResponse, MuleMessage message) throws Exception
110     {
111         if (message == null)
112         {
113             servletResponse.setStatus(HttpServletResponse.SC_NO_CONTENT);
114             if (feedback)
115             {
116                 servletResponse.setStatus(HttpServletResponse.SC_OK);
117                 servletResponse.getWriter().write("Action was processed successfully. There was no result");
118             }
119         }
120         else
121         {
122             HttpResponse httpResponse;
123 
124             if (message.getPayload() instanceof HttpResponse)
125             {
126                 httpResponse = (HttpResponse)message.getPayload();
127             }
128             else
129             {
130                 httpResponse = new HttpResponse();
131                 String ct = message.getStringProperty(HttpConstants.HEADER_CONTENT_TYPE, null);
132                 if(ct!=null)
133                 {
134                     httpResponse.setHeader(new Header(HttpConstants.HEADER_CONTENT_TYPE, ct));
135                 }
136                 httpResponse.setStatusLine(httpResponse.getHttpVersion(), 
137                     message.getIntProperty(HttpConnector.HTTP_STATUS_PROPERTY, HttpServletResponse.SC_OK));
138                 httpResponse.setBody(message);
139                 
140             }
141 
142             Header contentTypeHeader = httpResponse.getFirstHeader(HttpConstants.HEADER_CONTENT_TYPE);
143             String contentType = null;
144             if (contentTypeHeader == null)
145             {
146                 contentType = defaultContentType;
147             }
148             else
149             {
150                 contentType = contentTypeHeader.getValue();
151             }
152 
153             if (!servletResponse.isCommitted())
154             {
155                 servletResponse.setStatus(httpResponse.getStatusCode());
156             }
157             
158             servletResponse.setContentType(contentType);
159             OutputHandler outputHandler = httpResponse.getBody();
160             
161             outputHandler.write(RequestContext.getEvent(), servletResponse.getOutputStream());
162         }
163         servletResponse.flushBuffer();
164     }
165 
166     protected void handleException(Throwable exception, String message, HttpServletResponse response)
167     {
168         logger.error("message: " + exception.getMessage(), exception);
169         int code = Integer.valueOf(ExceptionHelper.getErrorMapping("http", exception.getClass())).intValue();
170         response.setStatus(code);
171         try
172         {
173             response.sendError(code, message + ": " + exception.getMessage());
174         }
175         catch (IOException e)
176         {
177             logger.error("Failed to sendError on response: " + e.getMessage(), e);
178         }
179     }
180 }