001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.activemq; 019 020 import java.net.InetSocketAddress; 021 import java.net.URI; 022 import java.net.URISyntaxException; 023 024 import org.apache.commons.logging.Log; 025 import org.apache.commons.logging.LogFactory; 026 027 import org.apache.activemq.broker.TransportConnector; 028 import org.apache.geronimo.activemq.ActiveMQConnector; 029 import org.apache.geronimo.gbean.GBeanInfo; 030 import org.apache.geronimo.gbean.GBeanInfoBuilder; 031 import org.apache.geronimo.gbean.GBeanLifecycle; 032 import org.apache.geronimo.gbean.GConstructorInfo; 033 034 /** 035 * Default implementation of the ActiveMQ connector 036 * 037 * @version $Rev: 547376 $ $Date: 2007-06-14 15:38:13 -0400 (Thu, 14 Jun 2007) $ 038 */ 039 public class TransportConnectorGBeanImpl implements GBeanLifecycle, ActiveMQConnector { 040 private Log log = LogFactory.getLog(getClass().getName()); 041 042 private TransportConnector transportConnector; 043 private BrokerServiceGBean brokerServiceGBean; 044 045 private String protocol; 046 private String host; 047 private int port; 048 private String path; 049 private String query; 050 private String urlAsStarted; 051 private ClassLoader classLoader; 052 053 public TransportConnectorGBeanImpl(BrokerServiceGBean brokerServiceGBean, String protocol, String host, int port) { 054 this.brokerServiceGBean = brokerServiceGBean; 055 this.protocol = protocol; 056 this.host = host; 057 this.port = port; 058 } 059 060 public String getProtocol() { 061 return protocol; 062 } 063 064 public void setProtocol(String protocol) { 065 this.protocol = protocol; 066 } 067 068 public String getHost() { 069 return host; 070 } 071 072 public void setHost(String host) { 073 this.host = host; 074 } 075 076 public int getPort() { 077 return port; 078 } 079 080 public void setPort(int port) { 081 this.port = port; 082 } 083 084 public String getPath() { 085 return path; 086 } 087 088 public void setPath(String path) { 089 this.path = path; 090 } 091 092 public String getQuery() { 093 return query; 094 } 095 096 public void setQuery(String query) { 097 this.query = query; 098 } 099 100 public String getUrl() { 101 try { 102 return new URI(protocol, null, host, port, path, query, null).toString(); 103 } catch (URISyntaxException e) { 104 throw new IllegalStateException("Attributes don't form a valid URI: "+protocol+"://"+host+":"+port+"/"+path+"?"+query, e); 105 } 106 } 107 108 public InetSocketAddress getListenAddress() { 109 try { 110 return transportConnector.getServer().getSocketAddress(); 111 } catch (Throwable e) { 112 log.debug("Failure to determine ListenAddress: "+e,e); 113 return null; 114 } 115 } 116 117 public synchronized void doStart() throws Exception { 118 ClassLoader old = Thread.currentThread().getContextClassLoader(); 119 Thread.currentThread().setContextClassLoader(getClassLoader()); 120 try { 121 if (transportConnector == null) { 122 urlAsStarted = getUrl(); 123 transportConnector = createBrokerConnector(urlAsStarted); 124 transportConnector.start(); 125 } 126 } finally { 127 Thread.currentThread().setContextClassLoader(old); 128 } 129 } 130 131 public synchronized void doStop() throws Exception { 132 if (transportConnector != null) { 133 TransportConnector temp = transportConnector; 134 transportConnector = null; 135 temp.stop(); 136 } 137 } 138 139 public synchronized void doFail() { 140 if (transportConnector != null) { 141 TransportConnector temp = transportConnector; 142 transportConnector = null; 143 try { 144 temp.stop(); 145 } 146 catch (Exception e) { 147 log.info("Caught while closing due to failure: " + e, e); 148 } 149 } 150 } 151 152 protected TransportConnector createBrokerConnector(String url) throws Exception { 153 return brokerServiceGBean.getBrokerContainer().addConnector(url); 154 } 155 156 public ClassLoader getClassLoader() { 157 if( classLoader == null ) { 158 classLoader = this.getClass().getClassLoader(); 159 } 160 return classLoader; 161 } 162 163 public void setClassLoader(ClassLoader classLoader) { 164 this.classLoader = classLoader; 165 } 166 167 public static final GBeanInfo GBEAN_INFO; 168 169 static { 170 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic("ActiveMQ Transport Connector", TransportConnectorGBeanImpl.class, CONNECTOR_J2EE_TYPE); 171 infoBuilder.addAttribute("classLoader", ClassLoader.class, false); 172 infoBuilder.addAttribute("url", String.class.getName(), false); 173 infoBuilder.addReference("brokerService", BrokerServiceGBean.class); 174 infoBuilder.addInterface(ActiveMQConnector.class, new String[]{"host","port","protocol","path","query"}, 175 new String[]{"host","port"}); 176 infoBuilder.setConstructor(new GConstructorInfo(new String[]{"brokerService", "protocol", "host", "port"})); 177 GBEAN_INFO = infoBuilder.getBeanInfo(); 178 } 179 180 public static GBeanInfo getGBeanInfo() { 181 return GBEAN_INFO; 182 } 183 }