001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.mq;
023:
024: import java.io.Serializable;
025: import java.util.Properties;
026:
027: import javax.jms.JMSException;
028:
029: import org.jboss.logging.Logger;
030: import org.jboss.mq.il.ClientILService;
031: import org.jboss.mq.il.ServerIL;
032: import org.jboss.mq.il.ServerILFactory;
033:
034: /**
035: * The RMI implementation of the DistributedConnectionFactory object
036: *
037: * @author Hiram Chirino (Cojonudo14@hotmail.com)
038: * @author <a href="mailto:adrian@jboss.org">Adrian Brock</a>
039: * @version $Revision: 57198 $
040: */
041: public class GenericConnectionFactory implements Serializable {
042: // Constants -----------------------------------------------------
043:
044: /** The serialVersionUID */
045: private static final long serialVersionUID = 2288420610006129296L;
046:
047: /** The log */
048: static Logger log = Logger
049: .getLogger(GenericConnectionFactory.class);
050:
051: // Attributes ----------------------------------------------------
052:
053: /**
054: * An instance of the ServerIL, once it is setup, we make clones every
055: */
056: private ServerIL server;
057:
058: /**
059: * Holds all the information need to connect to the server.
060: */
061: private Properties connectionProperties;
062:
063: // Static --------------------------------------------------------
064:
065: // Constructors --------------------------------------------------
066:
067: /**
068: * The constructor takes a ServerIL and the Connection Properties
069: * parameters, The connection properties are allways required since they are
070: * used to setup the ClientIL, but the ServerIL can be null if the
071: * connection properties defines a ServerILFactory so that the SeverIL can
072: * be created on the client side. The ServerIL paramter is usefull for IL
073: * such as RMI or the JVM IL since trying to explicity create a connection
074: * to them is not strait forward.
075: *
076: * @param server the serverIL
077: * @param props the connection properties
078: */
079: public GenericConnectionFactory(ServerIL server, Properties props) {
080: this .server = server;
081: this .connectionProperties = props;
082: }
083:
084: // Public --------------------------------------------------------
085:
086: /**
087: * For testing
088: */
089: public Properties getProperties() {
090: return connectionProperties;
091: }
092:
093: /**
094: * Initialise the connection
095: *
096: * @param connection the connection to initialise
097: */
098: public void initialise(Connection connection) throws JMSException {
099: String clientID = connectionProperties
100: .getProperty(ServerILFactory.CLIENTID);
101: if (clientID != null)
102: connection.clientID = clientID;
103: }
104:
105: /**
106: * Creates a new instance of the ClientILService
107: *
108: * @param connection the connection
109: * @return the client il
110: * @exception Exception for any error
111: */
112: public ClientILService createClientILService(Connection connection)
113: throws Exception {
114: // This is a good time to setup the PingPeriod
115: String pingPeriod = connectionProperties.getProperty(
116: ServerILFactory.PING_PERIOD_KEY, ""
117: + connection.pingPeriod);
118: connection.pingPeriod = Long.parseLong(pingPeriod);
119:
120: // Setup the client connection.
121: String clientILServiceCN = connectionProperties
122: .getProperty(ServerILFactory.CLIENT_IL_SERVICE_KEY);
123: ClientILService service = (ClientILService) Class.forName(
124: clientILServiceCN).newInstance();
125: service.init(connection, connectionProperties);
126:
127: if (log.isTraceEnabled())
128: log.trace("Handing out ClientIL: " + clientILServiceCN);
129:
130: return service;
131: }
132:
133: /**
134: * Creates a new instance of the ServerIL
135: *
136: * @return the server il
137: * @exception JMSException for any error
138: */
139: public ServerIL createServerIL() throws JMSException {
140: try {
141: // The server was not set, so lets try to set it up with
142: // A ServerILFactory
143: if (server == null) {
144: String className = connectionProperties
145: .getProperty(ServerILFactory.SERVER_IL_FACTORY_KEY);
146: ServerILFactory factory = (ServerILFactory) Class
147: .forName(className).newInstance();
148: factory.init(connectionProperties);
149:
150: server = factory.getServerIL();
151: }
152:
153: // We clone because one ConnectionFactory instance can be
154: // used to produce multiple connections.
155: return server.cloneServerIL();
156: } catch (Exception e) {
157: throw new SpyJMSException(
158: "Could not connect to the server", e);
159: }
160: }
161:
162: // Object overrides ----------------------------------------------
163:
164: public String toString() {
165: return "GenericConnectionFactory[server=" + server
166: + " connectionProperties=" + connectionProperties + "]";
167: }
168:
169: // Package protected ---------------------------------------------
170:
171: // Protected -----------------------------------------------------
172:
173: // Private -------------------------------------------------------
174:
175: // Inner classes -------------------------------------------------
176: }
|