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: HttpMessageletResponseImpl.java 155459 2005-02-26 13:24:44Z dirkv $ 009 */ 010 package org.apache.commons.messagelet.impl; 011 012 import java.io.IOException; 013 import java.io.PrintWriter; 014 015 import javax.jms.Destination; 016 import javax.jms.JMSException; 017 import javax.jms.Message; 018 import javax.servlet.ServletOutputStream; 019 import javax.servlet.http.HttpServletResponse; 020 import javax.servlet.http.HttpServletResponseWrapper; 021 022 import org.apache.commons.messagelet.MessageletResponse; 023 import org.apache.commons.messenger.Messenger; 024 025 /** <p><code>HttpMessageletResponseImpl</code> represents a servlet request from 026 * a JMS Message source which appears like a HTTP request.</p> 027 * 028 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a> 029 * @version $Revision: 155459 $ 030 */ 031 public class HttpMessageletResponseImpl extends HttpServletResponseWrapper implements MessageletResponse { 032 033 /** the messenger used to send replies to */ 034 private Messenger messenger; 035 /** the reply to destination to send replies to */ 036 private Destination replyToDestination; 037 038 /** The BufferedServletOutputStream that is given to the servlet to capture 039 * the response 040 */ 041 private BufferedServletOutputStream stream = null; 042 /** The PrintWriter that has been returned by getWriter(), if any */ 043 protected PrintWriter writer; 044 045 public HttpMessageletResponseImpl(HttpServletResponse response) { 046 super(response); 047 } 048 049 /** Resets the response, ready for a new request */ 050 public void reset() { 051 writer = null; 052 stream = null; 053 } 054 055 /** Called to finish the request */ 056 public void finish() throws IOException, JMSException { 057 try { 058 if ( writer != null ) { 059 writer.flush(); 060 writer.close(); 061 } 062 if ( stream != null ) { 063 byte[] data = stream.toByteArray(); 064 065 // for now assume a text message 066 String text = new String(data); 067 Message message = getReplyMessenger().createTextMessage( text ); 068 sendReply( message ); 069 } 070 } 071 finally { 072 writer = null; 073 stream = null; 074 } 075 } 076 077 // MessageletResponse methods 078 //------------------------------------------------------------------------- 079 080 /** Sends a reply to the original message */ 081 public void sendReply(Message replyMessage) throws JMSException { 082 getReplyMessenger().send( getReplyToDestination(), replyMessage ); 083 } 084 085 public Messenger getReplyMessenger() { 086 return messenger; 087 } 088 089 public Destination getReplyToDestination() { 090 return replyToDestination; 091 } 092 093 public void setReplyMessenger(Messenger messenger) { 094 this.messenger = messenger; 095 } 096 097 public void setReplyToDestination(Destination replyToDestination) { 098 this.replyToDestination = replyToDestination; 099 } 100 101 102 // Implementation methods 103 //------------------------------------------------------------------------- 104 105 public void flushBuffer() throws IOException { 106 if ( stream != null ) { 107 stream.flush(); 108 } 109 } 110 111 public ServletOutputStream getOutputStream() throws IOException { 112 if (writer != null) { 113 throw new IllegalStateException("getWriter() has already been called " + 114 "for this response"); 115 } 116 if (stream == null) { 117 stream = createOutputStream(); 118 } 119 return stream; 120 } 121 122 public PrintWriter getWriter() throws IOException { 123 if (writer != null) { 124 return writer; 125 } 126 if (stream != null) { 127 throw new IllegalStateException("getOutputStream() has already been called for this response"); 128 } 129 stream = createOutputStream(); 130 writer = new PrintWriter(stream); 131 return writer; 132 } 133 134 protected BufferedServletOutputStream createOutputStream() { 135 return new BufferedServletOutputStream(); 136 } 137 } 138