001 /** 002 * 003 * Copyright 2005-2006 The Apache Software Foundation 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * 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 package org.apache.activemq.gbean; 018 019 import java.net.InetSocketAddress; 020 import java.net.URI; 021 import java.net.URISyntaxException; 022 023 import org.apache.activemq.broker.TransportConnector; 024 import org.apache.activemq.gbean.ActiveMQConnector; 025 import org.apache.commons.logging.Log; 026 import org.apache.commons.logging.LogFactory; 027 import org.apache.geronimo.gbean.GBeanInfo; 028 import org.apache.geronimo.gbean.GBeanInfoBuilder; 029 import org.apache.geronimo.gbean.GBeanLifecycle; 030 import org.apache.geronimo.gbean.GConstructorInfo; 031 032 /** 033 * Default implementation of the ActiveMQ connector 034 * 035 * @version $Revision: 437254 $ 036 */ 037 public class TransportConnectorGBeanImpl implements GBeanLifecycle, ActiveMQConnector { 038 private Log log = LogFactory.getLog(getClass().getName()); 039 040 private TransportConnector transportConnector; 041 private BrokerServiceGBean brokerServiceGBean; 042 043 private String protocol; 044 private String host; 045 private int port; 046 private String path; 047 private String query; 048 private String urlAsStarted; 049 private ClassLoader classLoader; 050 051 public TransportConnectorGBeanImpl(BrokerServiceGBean brokerServiceGBean, String protocol, String host, int port) { 052 this.brokerServiceGBean = brokerServiceGBean; 053 this.protocol = protocol; 054 this.host = host; 055 this.port = port; 056 } 057 058 public String getProtocol() { 059 return protocol; 060 } 061 062 public void setProtocol(String protocol) { 063 this.protocol = protocol; 064 } 065 066 public String getHost() { 067 return host; 068 } 069 070 public void setHost(String host) { 071 this.host = host; 072 } 073 074 public int getPort() { 075 return port; 076 } 077 078 public void setPort(int port) { 079 this.port = port; 080 } 081 082 public String getPath() { 083 return path; 084 } 085 086 public void setPath(String path) { 087 this.path = path; 088 } 089 090 public String getQuery() { 091 return query; 092 } 093 094 public void setQuery(String query) { 095 this.query = query; 096 } 097 098 public String getUrl() { 099 try { 100 return new URI(protocol, null, host, port, path, query, null).toString(); 101 } catch (URISyntaxException e) { 102 throw new IllegalStateException("Attributes don't form a valid URI: "+protocol+"://"+host+":"+port+"/"+path+"?"+query); 103 } 104 } 105 106 public InetSocketAddress getListenAddress() { 107 try { 108 return transportConnector.getServer().getSocketAddress(); 109 } catch (Throwable e) { 110 log.debug("Failure to determine ListenAddress: "+e,e); 111 return null; 112 } 113 } 114 115 public synchronized void doStart() throws Exception { 116 ClassLoader old = Thread.currentThread().getContextClassLoader(); 117 Thread.currentThread().setContextClassLoader(getClassLoader()); 118 try { 119 if (transportConnector == null) { 120 urlAsStarted = getUrl(); 121 transportConnector = createBrokerConnector(urlAsStarted); 122 transportConnector.start(); 123 } 124 } finally { 125 Thread.currentThread().setContextClassLoader(old); 126 } 127 } 128 129 public synchronized void doStop() throws Exception { 130 if (transportConnector != null) { 131 TransportConnector temp = transportConnector; 132 transportConnector = null; 133 temp.stop(); 134 } 135 } 136 137 public synchronized void doFail() { 138 if (transportConnector != null) { 139 TransportConnector temp = transportConnector; 140 transportConnector = null; 141 try { 142 temp.stop(); 143 } 144 catch (Exception e) { 145 log.info("Caught while closing due to failure: " + e, e); 146 } 147 } 148 } 149 150 protected TransportConnector createBrokerConnector(String url) throws Exception { 151 return brokerServiceGBean.getBrokerContainer().addConnector(url); 152 } 153 154 public ClassLoader getClassLoader() { 155 if( classLoader == null ) { 156 classLoader = this.getClass().getClassLoader(); 157 } 158 return classLoader; 159 } 160 161 public void setClassLoader(ClassLoader classLoader) { 162 this.classLoader = classLoader; 163 } 164 165 public static final GBeanInfo GBEAN_INFO; 166 167 static { 168 GBeanInfoBuilder infoBuilder = new GBeanInfoBuilder("ActiveMQ Transport Connector", TransportConnectorGBeanImpl.class, CONNECTOR_J2EE_TYPE); 169 infoBuilder.addAttribute("classLoader", ClassLoader.class, false); 170 infoBuilder.addAttribute("url", String.class.getName(), false); 171 infoBuilder.addReference("brokerService", BrokerServiceGBean.class); 172 infoBuilder.addInterface(ActiveMQConnector.class, new String[]{"host","port","protocol","path","query"}, 173 new String[]{"host","port"}); 174 infoBuilder.setConstructor(new GConstructorInfo(new String[]{"brokerService", "protocol", "host", "port"})); 175 GBEAN_INFO = infoBuilder.getBeanInfo(); 176 } 177 178 public static GBeanInfo getGBeanInfo() { 179 return GBEAN_INFO; 180 } 181 }