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 2000-2003 (C) Exoffice Technologies Inc. All Rights Reserved. 42 * 43 * $Id: IpcJmsServerConnection.java,v 1.8 2003/08/17 01:32:26 tanderson Exp $ 44 * 45 * Date Author Changes 46 * $Date jimm Created 47 */ 48 package org.exolab.jms.server.mipc; 49 50 import java.io.Serializable; 51 import java.util.Hashtable; 52 import java.util.Vector; 53 54 import javax.jms.JMSException; 55 56 import org.exolab.core.ipc.NotifierIfc; 57 import org.exolab.jms.server.JmsServerConnection; 58 import org.exolab.jms.server.JmsServerConnectionManager; 59 import org.exolab.jms.server.JmsServerSession; 60 61 62 /*** 63 * This class is responsible for interpreting server connection requests and 64 * delegating them to the server. And passing back any necessary replies. 65 * 66 * @version $Revision: 1.8 $ $Date: 2003/08/17 01:32:26 $ 67 * @author <a href="mailto:mourikis@exolab.org">Jim Mourikis</a> 68 * @see org.exolab.jms.server.mipc.IpcJmsReceiver 69 * @see org.exolab.jms.server.JmsServerConnection 70 * @see org.exolab.jms.server.JmsServerConnectionManager 71 * @see org.exolab.core.ipc.NotifierIfc 72 */ 73 public class IpcJmsServerConnection implements NotifierIfc { 74 75 /*** 76 * A hashtable of Vectors. Each node containing the list of Connection Id's 77 * for a particular IPC connection. 78 */ 79 private static Hashtable _connections = new Hashtable(); 80 81 /*** 82 * Default constructor 83 */ 84 public IpcJmsServerConnection() { 85 } 86 87 /*** 88 * A new request has been received. 89 * Carry out the request, and pass back any relevent data. 90 * 91 * @param ob The data received, 92 * @return Object Return any requested result. This must never be null. 93 * 94 */ 95 public Serializable notify(Object ob, String id) { 96 Vector v = (Vector) ob; 97 String func = (String) v.get(1); 98 Serializable result = null; 99 100 if (func.equals("createConnection")) { 101 // Use the unique Ipc id for every new connection. 102 result = createConnection(id, (String) v.get(2), (String) v.get(3), 103 (String) v.get(4)); 104 } else if (func.equals("createSession")) { 105 result = createSession(id, (String) v.get(2), (String) v.get(3), 106 (Integer) v.get(4), (Boolean) v.get(5)); 107 } else if (func.equals("close")) { 108 result = close(id, (String) v.get(2), (String) v.get(3)); 109 } else { 110 String st = ("Unknown request received: " + func); 111 System.err.println(st); 112 result = pack(new Boolean(false), st); 113 } 114 115 return result; 116 } 117 118 119 /*** 120 * The connection has been broken. 121 * 122 * @param The unique IPC identifier of this connection. 123 * 124 */ 125 public void disconnection(String id) { 126 Vector v; 127 synchronized (_connections) { 128 v = (Vector) _connections.remove(id); 129 } 130 131 if (v != null) { 132 Object[] ob = v.toArray(); 133 JmsServerConnection con = null; 134 135 for (int i = 0, j = v.size(); i < j; i++) { 136 con = JmsServerConnectionManager.instance().getConnection 137 ((String) ob[i]); 138 if (con != null) { 139 con.close(); 140 } 141 } 142 // help clean up. 143 v.clear(); 144 v = null; 145 } 146 } 147 148 /*** 149 * Add all the client id's for this IPC connection into the connections 150 * list. Use the IPC id as the key, so all client connections from 151 * a single physical client are on the same key. 152 * 153 * @param ipc The IPC client id if this connection 154 * @param id The unique clientId of this client 155 */ 156 private void addConnection(String ipc, String id) { 157 synchronized (_connections) { 158 Vector v = (Vector) _connections.get(ipc); 159 160 if (v == null) { 161 v = new Vector(); 162 _connections.put(ipc, v); 163 } 164 v.add(id); 165 } 166 } 167 168 /*** 169 * A new connection request has been made. 170 * Pass on the request to the JmsServerConnectionMgr. If the request 171 * succeeds return the connectionId to the client. 172 * 173 * @param ipcId The unique IPC id of this connection. 174 * @param clientId The unique id of the client. 175 * @param username the client's username 176 * @param password the client's password 177 * @return Vector The result of the request. 178 */ 179 private Vector createConnection(String ipcId, 180 String clientId, String username, 181 String password) { 182 Vector result; 183 try { 184 JmsServerConnection connection = 185 JmsServerConnectionManager.instance().createConnection( 186 clientId, username, password); 187 188 addConnection(ipcId, clientId); 189 result = pack(new Boolean(true), connection.getConnectionId()); 190 } catch (JMSException exception) { 191 result = pack(new Boolean(false), exception); 192 } 193 return result; 194 } 195 196 /*** 197 * A create session request has been received. Get the JmsServerConnection 198 * object from the manager and create a new session. If the request 199 * succeeds return the unique session id of the session, and the flow 200 * control notification limit. 201 * 202 * @param ipcId The unique IPC id of this connection. 203 * @param clientId The unique id of the client. 204 * @param connectionId The unique connection id of the client. 205 * @return Vector The result of the request. 206 * 207 */ 208 private Vector createSession(String ipcId, String clientId, 209 String connectionId, Integer ackMode, 210 Boolean transacted) { 211 Vector result = null; 212 213 JmsServerConnection connection = 214 JmsServerConnectionManager.instance().getConnection(clientId); 215 JmsServerSession session = null; 216 217 if (connection != null) { 218 session = connection.createSession(ackMode.intValue(), 219 transacted.booleanValue()); 220 } 221 if (session != null) { 222 Vector state = new Vector(2); 223 state.add(session.getSessionId()); 224 result = pack(new Boolean(true), state); 225 } else { 226 result = pack(new Boolean(false), 227 "Failed to create session"); 228 } 229 return result; 230 } 231 232 /*** 233 * A close connection request has been received. Get the 234 * JmsServerConnection object from the manager and close the connection. 235 * 236 * @param ipcId The unique IPC id of this connection. 237 * @param clientId The unique id of the client. 238 * @param connectionId The unique connection id of the client. 239 * @return Vector The result of the request. 240 */ 241 private Vector close(String ipcId, String clientId, String connectionId) { 242 synchronized (_connections) { 243 Vector connections = (Vector) _connections.get(ipcId); 244 if (connections != null) { 245 connections.remove(clientId); 246 if (connections.isEmpty()) { 247 _connections.remove(ipcId); 248 } 249 } 250 } 251 JmsServerConnectionManager.instance().closeConnection(clientId); 252 253 return pack(new Boolean(true), null); 254 } 255 256 /*** 257 * Pack all the data that is required by the server in a vector. 258 * Set the size of the vector to be exactly the right size for efficiency. 259 * 260 * @param success Boolean indicating success or failure of request. 261 * @param ob The Object being returned. 262 * @return Vector The vector containing all the data. 263 * 264 */ 265 private Vector pack(Boolean success, Object ob) { 266 Vector v = new Vector(2); 267 v.add(success); 268 v.add(ob); 269 return v; 270 } 271 272 } // End IpcJmsServerConnection

This page was automatically generated by Maven