001 /*
002 * Copyright (C) The Apache Software Foundation. All rights reserved.
003 *
004 * This software is published under the terms of the Apache Software License
005 * version 1.1, a copy of which has been included with this distribution in
006 * the LICENSE file.
007 *
008 * $Id: MessageHttpServletDispatcher.java 155459 2005-02-26 13:24:44Z dirkv $
009 */
010 package org.apache.commons.messagelet.impl;
011
012 import javax.jms.JMSException;
013 import javax.jms.Message;
014 import javax.servlet.ServletException;
015
016 import org.apache.commons.messagelet.MessageDrivenObjectSupport;
017 import org.apache.commons.messenger.Messenger;
018 import org.apache.commons.messenger.MessengerListener;
019
020 /** <p><code>MessageHttpServletDispatcher</code> dispatches JMS Messages
021 * into a HttpServlet for procesing.</p>
022 *
023 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
024 * @version $Revision: 155459 $
025 */
026 public class MessageHttpServletDispatcher extends MessageDrivenObjectSupport implements MessengerListener {
027
028 /**
029 * The HttpServletRequest object we will pass to the servlet engine
030 */
031 private HttpMessageletRequestImpl request;
032
033 /**
034 * The HttpServletResponse object we will pass to the servlet engine
035 */
036 private HttpMessageletResponseImpl response;
037
038 /**
039 * The reply to messenger
040 */
041 private Messenger messenger;
042
043 /** Holds value of property path. */
044 private String path;
045
046
047 public MessageHttpServletDispatcher() {
048 //request.setResponse(response);
049 //response.setRequest(request);
050 }
051
052 public MessageHttpServletDispatcher(String path) {
053 this();
054 this.path = path;
055 }
056
057
058 public void init() throws ServletException {
059 request = new HttpMessageletRequestImpl( createHttpServletRequest() );
060 response = new HttpMessageletResponseImpl( new HttpServletResponseImpl() );
061 }
062
063 // MessengerListener methods
064 //-------------------------------------------------------------------------
065 public void setMessenger(Messenger messenger) {
066 this.messenger = messenger;
067 }
068
069 /**
070 * Process the incoming JMS Message.
071 *
072 * @param message is the message to be processed
073 */
074 public void onMessage(Message message) {
075 try {
076 response.setReplyToDestination( message.getJMSReplyTo() );
077 }
078 catch (JMSException e) {
079 log( "Could not find JMS replyTo destination", e );
080 response.setReplyToDestination( null );
081 }
082
083 // Ask our Container to process this request
084 try {
085 // initialise the request
086 request.setMessage( message );
087 request.setMessenger( messenger );
088 response.setReplyMessenger( messenger );
089 response.reset();
090
091 // dispatch the servlet
092 getServletContext().getRequestDispatcher( getPath() ).include(request, response);
093
094 // finish up the response, sending a reply if necessary
095 response.finish();
096 }
097 catch (Throwable e) {
098 handleException( message, e );
099 }
100 }
101
102
103 // Properties
104 //-------------------------------------------------------------------------
105 /** Getter for property path.
106 * @return Value of property path.
107 */
108 public String getPath() {
109 return path;
110 }
111
112 /** Setter for property path.
113 * @param path New value of property path.
114 */
115 public void setPath(String path) {
116 this.path = path;
117
118 //request.setRequestURI(path);
119 }
120
121
122
123 // Implementation methods
124 //-------------------------------------------------------------------------
125 protected void handleException(Message message, Throwable t) {
126 log( "Caught exception processing message: " + message, t);
127 }
128
129 protected HttpServletRequestImpl createHttpServletRequest() {
130 HttpServletRequestImpl request = new HttpServletRequestImpl( getServletContext() );
131 request.setRequestURI( path );
132 int idx = path.indexOf( '?' );
133 if ( idx >= 0 ) {
134 request.setQueryString( path.substring( idx + 1 ) );
135 request.setPathInfo( path.substring( 0, idx ) );
136 }
137 return request;
138 }
139 }