View Javadoc
1 /*** 2 * Redistribution and use of this software and associated documentation 3 * ("Software"), with or without modification, are permitted provided 4 * that the following conditions are met: 5 * 6 * 1. Redistributions of source code must retain copyright 7 * statements and notices. Redistributions must also contain a 8 * copy of this document. 9 * 10 * 2. Redistributions in binary form must reproduce the 11 * above copyright notice, this list of conditions and the 12 * following disclaimer in the documentation and/or other 13 * materials provided with the distribution. 14 * 15 * 3. The name "Exolab" must not be used to endorse or promote 16 * products derived from this Software without prior written 17 * permission of Exoffice Technologies. For written permission, 18 * please contact info@exolab.org. 19 * 20 * 4. Products derived from this Software may not be called "Exolab" 21 * nor may "Exolab" appear in their names without prior written 22 * permission of Exoffice Technologies. Exolab is a registered 23 * trademark of Exoffice Technologies. 24 * 25 * 5. Due credit should be given to the Exolab Project 26 * (http://www.exolab.org/). 27 * 28 * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT 30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 32 * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 39 * OF THE POSSIBILITY OF SUCH DAMAGE. 40 * 41 * Copyright 2001-2003 (C) Exoffice Technologies Inc. All Rights Reserved. 42 * 43 * $Id: HttpJmsSessionConnection.java,v 1.14 2003/08/25 03:38:14 tanderson Exp $ 44 */ 45 package org.exolab.jms.server.http; 46 47 import java.io.IOException; 48 import java.rmi.UnknownHostException; 49 import java.util.HashMap; 50 import java.util.Vector; 51 52 import javax.jms.JMSException; 53 import javax.jms.Message; 54 55 import org.apache.commons.logging.Log; 56 import org.apache.commons.logging.LogFactory; 57 58 import org.exolab.core.http.HttpClient; 59 import org.exolab.core.mipc.MultiplexConnectionIfc; 60 import org.exolab.jms.client.JmsQueue; 61 import org.exolab.jms.client.JmsTopic; 62 import org.exolab.jms.config.Configuration; 63 import org.exolab.jms.config.HttpConfiguration; 64 import org.exolab.jms.config.HttpsConfiguration; 65 import org.exolab.jms.server.JmsServerSession; 66 import org.exolab.jms.server.mipc.IpcJmsServer; 67 import org.exolab.jms.server.mipc.IpcJmsSessionConnection; 68 69 70 /*** 71 * This is the server side receiver for JmsSession requests. All requests are 72 * unpacked and passed on to the appropriate JmsServerSession object. 73 * 74 * @version $Revision: 1.14 $ $Date: 2003/08/25 03:38:14 $ 75 * @author <a href="mailto:mourikis@exolab.org">Jim Mourikis</a> 76 */ 77 public class HttpJmsSessionConnection extends IpcJmsSessionConnection { 78 79 /*** 80 * The list of all http client consumer connections, used to send 81 * JmsMessages on. 82 */ 83 private HashMap _consumerList = new HashMap(); 84 85 /*** 86 * The logger 87 */ 88 private static final Log _log = 89 LogFactory.getLog(HttpJmsSessionConnection.class); 90 91 92 /*** 93 * Construct a new <code>HttpJmsSessionConnection</code> 94 * 95 * @param server the server instance 96 */ 97 public HttpJmsSessionConnection(IpcJmsServer server) { 98 super(server); 99 } 100 101 /*** 102 * Create a new receiver 103 * 104 * @param session The session the request is for. 105 * @param queue The queue to create the reciver for 106 * @param consumerName The unique name of this consumer, 107 * only valid for persitent messages 108 * @param selector The selector to filter messages. This may be null. 109 * @param connection The MultiplexConnection to the machine the consumer is on 110 * @param host The host the client is running on. 111 * @param port The port the client is listening on. 112 * @param url The url for the clients web server. 113 * @return Vector The result of the request. 114 * 115 */ 116 protected Vector createReceiver(JmsServerSession session, JmsQueue queue, 117 Long consumerId, String selector, 118 MultiplexConnectionIfc not_used, String host, String port, String url) { 119 if (session != null) { 120 try { 121 session.createReceiver 122 (queue, consumerId.longValue(), selector); 123 addSession(session, url, host, port); 124 } catch (JMSException error) { 125 return pack(new Boolean(false), error); 126 } catch (Exception error) { 127 return pack(new Boolean(false), error.getMessage()); 128 } 129 } 130 131 return pack(new Boolean(true), null); 132 } 133 134 135 /*** 136 * Create a new queue browser for the specified session and queue. 137 * 138 * @param session session that the request is for 139 * @param queue queue to browse 140 * @param clientId the client identity 141 * @param selector message selector. May be null 142 * @param connection the connection to the remote machine 143 * @param host The host the client is running on. 144 * @param port The port the client is listening on. 145 * @param url The url for the clients web server. 146 * @return Vector result of the request 147 * 148 */ 149 protected Vector createBrowser(JmsServerSession session, 150 JmsQueue queue, Long clientId, String selector, 151 MultiplexConnectionIfc not_used, String host, String port, String url) { 152 Vector result = null; 153 if (session == null) { 154 result = pack(new Boolean(true), null); 155 } else { 156 try { 157 session.createBrowser(queue, clientId.longValue(), selector); 158 addSession(session, url, host, port); 159 result = pack(new Boolean(true), null); 160 } catch (JMSException error) { 161 result = pack(new Boolean(false), error); 162 } catch (Exception error) { 163 return pack(new Boolean(false), error.getMessage()); 164 } 165 } 166 167 return result; 168 } 169 170 /*** 171 * Create a new subscriber, and connect back to the client through the 172 * MultiplexConnection. 173 * 174 * @param session The session the request is for. 175 * @param topic The topic the subscriber is subscribing on 176 * @param name The unique name of this subscriber, 177 * only valid for persitent messages 178 * @param selector The selector to filter messages. This may be null. 179 * @param connection The MultiplexConnection to the machine the consumer is on 180 * @param host The host the client is running on. 181 * @param port The port the client is listening on. 182 * @param url The url for the clients web server. 183 * @return Vector The result of the request. 184 * 185 */ 186 protected Vector createSubscriber(JmsServerSession session, JmsTopic topic, 187 String name, Long clientId, String selector, Boolean noLocal, 188 MultiplexConnectionIfc not_used, String host, String port, String url) { 189 if (session != null) { 190 try { 191 session.createSubscriber(topic, name, clientId.longValue(), 192 selector, noLocal.booleanValue()); 193 addSession(session, url, host, port); 194 } catch (JMSException error) { 195 return pack(new Boolean(false), error); 196 // pass JMSExceptions back to the client 197 } catch (Exception error) { 198 return pack(new Boolean(false), error.getMessage()); 199 } 200 } 201 202 return pack(new Boolean(true), null); 203 } 204 205 /*** 206 * A close request has been received. 207 * 208 * @param session the session to close 209 * @param connection the connection associated with the session 210 * @return the result of the request. 211 * 212 */ 213 protected Vector close(JmsServerSession session, 214 MultiplexConnectionIfc connection) { 215 removeSession(session); 216 return super.close(session, connection); 217 } 218 219 /*** 220 * A disconnection has been detected for this session, by the 221 * session sender, perform any neccessary cleanup, and deregister. 222 */ 223 protected void disconnect(JmsServerSession session) { 224 if (session != null) { 225 removeSession(session); 226 try { 227 session.close(); 228 } catch (Exception ignore) { 229 } 230 } 231 } 232 233 /*** 234 * Add a new session for this client. 235 * 236 * @param session The client session 237 * @param url The client url for connecting to the servlet. 238 */ 239 private synchronized void addSession( 240 JmsServerSession session, String url, String host, String port) 241 throws UnknownHostException, IOException { 242 243 if (_log.isDebugEnabled()) { 244 _log.debug("Adding session for client, webserver URL=" 245 + url + ", host=" + host + ", port=" + port); 246 } 247 248 HttpJmsSessionSender sender = (HttpJmsSessionSender) _consumerList.get 249 (session.getSessionId()); 250 if (sender == null) { 251 HttpClient client = new HttpClient(url, "HttpJmsSessionConnection"); 252 sender = new HttpJmsSessionSender( 253 this, client, session, host, port); 254 _consumerList.put(session.getSessionId(), sender); 255 session.setMessageListener(sender); 256 } 257 } 258 259 /*** 260 * Remove this sessions connection 261 * 262 * @param session The client session. 263 */ 264 private synchronized void removeSession(JmsServerSession session) { 265 HttpJmsSessionSender sender = 266 (HttpJmsSessionSender) _consumerList.remove( 267 session.getSessionId()); 268 if (sender != null) { 269 sender.close(); 270 } 271 } 272 273 } //-- HttpJmsSessionConnection 274

This page was automatically generated by Maven