/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.codehaus.stomp.jms; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.net.URISyntaxException; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.XAConnectionFactory; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.net.ServerSocketFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.stomp.tcp.TcpTransport; import org.codehaus.stomp.tcp.TcpTransportServer; /** * This class represents a service which accepts STOMP socket connections and binds them to JMS operations * * @version $Revision: 53 $ */ public class StompConnect { private static final transient Log log = LogFactory.getLog(StompConnect.class); private ConnectionFactory connectionFactory; private XAConnectionFactory xaConnectionFactory; private String uri = "tcp://localhost:61613"; private URI location; private ServerSocketFactory serverSocketFactory; private TcpTransportServer tcpServer; private InitialContext initialContext; private String connectionFactoryName = "java:/ConnectionFactory"; private String xaConnectionFactoryName = "java:/JmsXA"; public StompConnect() throws NamingException { initialContext = new InitialContext(); } public void assignProtocolConverter(TcpTransport transport) throws NamingException { ConnectionFactory factory = getConnectionFactory(); if (factory == null) { throw new IllegalArgumentException("No ConnectionFactory is configured!"); } XAConnectionFactory xaFactory = getXAConnectionFactory(); if (xaFactory == null) { throw new IllegalArgumentException("No XAConnectionFactory is configured!"); } new ProtocolConverter(initialContext, factory, xaFactory, transport); } // Properties // ------------------------------------------------------------------------- public ConnectionFactory getConnectionFactory() throws NamingException { if (connectionFactory == null) { connectionFactory = createConnectionFactory(); } return connectionFactory; } // Properties // ------------------------------------------------------------------------- public XAConnectionFactory getXAConnectionFactory() throws NamingException { if (xaConnectionFactory == null) { xaConnectionFactory = createXAConnectionFactory(); } return xaConnectionFactory; } /** * Sets the JMS connection factory to use to communicate with */ public void setConnectionFactory(XAConnectionFactory connectionFactory) { this.xaConnectionFactory = connectionFactory; } public String getUri() { return uri; } /** * Sets the URI string for the hostname/IP address and port to listen on for STOMP frames */ public void setUri(String uri) { this.uri = uri; } public URI getLocation() throws URISyntaxException { if (location == null) { location = new URI(uri); } return location; } /** * Sets the URI for the hostname/IP address and port to listen on for STOMP frames */ public void setLocation(URI location) { this.location = location; } public ServerSocketFactory getServerSocketFactory() { if (serverSocketFactory == null) { serverSocketFactory = ServerSocketFactory.getDefault(); } return serverSocketFactory; } /** * Sets the {@link ServerSocketFactory} to use to listen for STOMP frames */ public void setServerSocketFactory(ServerSocketFactory serverSocketFactory) { this.serverSocketFactory = serverSocketFactory; } public TcpTransportServer getTcpServer() throws IOException, URISyntaxException { if (tcpServer == null) { tcpServer = new TcpTransportServer(this, getLocation(), getServerSocketFactory()); } return tcpServer; } public void setTcpServer(TcpTransportServer tcpServer) { this.tcpServer = tcpServer; } /** * Allows an initial context to be configured which is used if no explicit {@link ConnectionFactory} is configured via the * {@link #setConnectionFactory(ConnectionFactory)} method */ public void setInitialContext(InitialContext initialContext) { this.initialContext = initialContext; } public String getXAConnectionFactoryName() { return xaConnectionFactoryName; } /** * Allows the JNDI name to be configured which is used to perform a JNDI lookup if no explicit {@link ConnectionFactory} is * configured via the {@link #setConnectionFactory(ConnectionFactory)} method */ public void setXAConnectionFactoryName(String jndiName) { this.xaConnectionFactoryName = jndiName; } public String getConnectionFactoryName() { return connectionFactoryName; } /** * Allows the JNDI name to be configured which is used to perform a JNDI lookup if no explicit {@link ConnectionFactory} is * configured via the {@link #setConnectionFactory(ConnectionFactory)} method */ public void setConnectionFactoryName(String jndiName) { this.connectionFactoryName = jndiName; } public void start() throws IOException, URISyntaxException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { getTcpServer().start(); } public void stop() throws InterruptedException, IOException, JMSException, URISyntaxException { getTcpServer().stop(); } /** * Factory method to lazily create a {@link ConnectionFactory} if one is not explicitly configured. By default lets try * looking in JNDI */ protected XAConnectionFactory createXAConnectionFactory() throws NamingException { String name = getXAConnectionFactoryName(); log.info("Looking up name: " + name + " in JNDI InitialContext for JMS ConnectionFactory"); Object value = initialContext.lookup(name); if (value == null) { throw new IllegalArgumentException("No ConnectionFactory object is available in JNDI at name: " + name); } if (value instanceof XAConnectionFactory) { return (XAConnectionFactory) value; } else { throw new IllegalArgumentException("The object in JNDI at name: " + name + " cannot be cast to XAConnectionFactory. " + "Either a JNDI configuration issue or you have multiple JMS API jars on your classpath. " + "Actual Object was: " + value); } } /** * Factory method to lazily create a {@link ConnectionFactory} if one is not explicitly configured. By default lets try * looking in JNDI */ protected ConnectionFactory createConnectionFactory() throws NamingException { String name = getConnectionFactoryName(); log.info("Looking up name: " + name + " in JNDI InitialContext for JMS ConnectionFactory"); Object value = initialContext.lookup(name); if (value == null) { throw new IllegalArgumentException("No ConnectionFactory object is available in JNDI at name: " + name); } if (value instanceof ConnectionFactory) { return (ConnectionFactory) value; } else { throw new IllegalArgumentException("The object in JNDI at name: " + name + " cannot be cast to ConnectionFactory. " + "Either a JNDI configuration issue or you have multiple JMS API jars on your classpath. " + "Actual Object was: " + value); } } }