1 /**
2 *
3 * Copyright 2005-2006 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.activemq.gbean;
18
19 import java.net.InetSocketAddress;
20 import java.net.URI;
21 import java.net.URISyntaxException;
22
23 import org.apache.activemq.broker.TransportConnector;
24 import org.apache.activemq.gbean.ActiveMQConnector;
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27 import org.apache.geronimo.gbean.GBeanInfo;
28 import org.apache.geronimo.gbean.GBeanInfoBuilder;
29 import org.apache.geronimo.gbean.GBeanLifecycle;
30 import org.apache.geronimo.gbean.GConstructorInfo;
31
32 /**
33 * Default implementation of the ActiveMQ connector
34 *
35 * @version $Revision: 437254 $
36 */
37 public class TransportConnectorGBeanImpl implements GBeanLifecycle, ActiveMQConnector {
38 private Log log = LogFactory.getLog(getClass().getName());
39
40 private TransportConnector transportConnector;
41 private BrokerServiceGBean brokerServiceGBean;
42
43 private String protocol;
44 private String host;
45 private int port;
46 private String path;
47 private String query;
48 private String urlAsStarted;
49 private ClassLoader classLoader;
50
51 public TransportConnectorGBeanImpl(BrokerServiceGBean brokerServiceGBean, String protocol, String host, int port) {
52 this.brokerServiceGBean = brokerServiceGBean;
53 this.protocol = protocol;
54 this.host = host;
55 this.port = port;
56 }
57
58 public String getProtocol() {
59 return protocol;
60 }
61
62 public void setProtocol(String protocol) {
63 this.protocol = protocol;
64 }
65
66 public String getHost() {
67 return host;
68 }
69
70 public void setHost(String host) {
71 this.host = host;
72 }
73
74 public int getPort() {
75 return port;
76 }
77
78 public void setPort(int port) {
79 this.port = port;
80 }
81
82 public String getPath() {
83 return path;
84 }
85
86 public void setPath(String path) {
87 this.path = path;
88 }
89
90 public String getQuery() {
91 return query;
92 }
93
94 public void setQuery(String query) {
95 this.query = query;
96 }
97
98 public String getUrl() {
99 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 }