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.management;
019
020 import java.util.ArrayList;
021 import java.util.Iterator;
022 import java.util.List;
023 import java.util.Set;
024
025 import org.apache.commons.logging.Log;
026 import org.apache.commons.logging.LogFactory;
027
028 import org.apache.geronimo.activemq.ActiveMQBroker;
029 import org.apache.geronimo.activemq.ActiveMQConnector;
030 import org.apache.geronimo.activemq.ActiveMQManager;
031 import org.apache.geronimo.activemq.TransportConnectorGBeanImpl;
032 import org.apache.geronimo.gbean.AbstractName;
033 import org.apache.geronimo.gbean.AbstractNameQuery;
034 import org.apache.geronimo.gbean.GBeanData;
035 import org.apache.geronimo.gbean.GBeanInfo;
036 import org.apache.geronimo.gbean.GBeanInfoBuilder;
037 import org.apache.geronimo.gbean.ReferencePatterns;
038 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
039 import org.apache.geronimo.kernel.GBeanNotFoundException;
040 import org.apache.geronimo.kernel.Kernel;
041 import org.apache.geronimo.kernel.config.ConfigurationUtil;
042 import org.apache.geronimo.kernel.config.EditableConfigurationManager;
043 import org.apache.geronimo.kernel.config.InvalidConfigException;
044 import org.apache.geronimo.kernel.proxy.ProxyManager;
045 import org.apache.geronimo.management.geronimo.JMSBroker;
046 import org.apache.geronimo.management.geronimo.JMSConnector;
047 import org.apache.geronimo.management.geronimo.NetworkConnector;
048
049 /**
050 * Implementation of the ActiveMQ management interface. These are the ActiveMQ
051 * management features available at runtime.
052 *
053 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
054 */
055 public class ActiveMQManagerGBean implements ActiveMQManager {
056 private static final Log log = LogFactory.getLog(ActiveMQManagerGBean.class.getName());
057 private Kernel kernel;
058 private String objectName;
059
060 public ActiveMQManagerGBean(Kernel kernel, String objectName) {
061 this.kernel = kernel;
062 this.objectName = objectName;
063 }
064
065 public String getProductName() {
066 return "ActiveMQ";
067 }
068
069 public String getObjectName() {
070 return objectName;
071 }
072
073 public boolean isEventProvider() {
074 return false;
075 }
076
077 public boolean isStateManageable() {
078 return true;
079 }
080
081 public boolean isStatisticsProvider() {
082 return false;
083 }
084
085 public Object[] getContainers() {
086 ProxyManager proxyManager = kernel.getProxyManager();
087 AbstractNameQuery query = new AbstractNameQuery(ActiveMQBroker.class.getName());
088 Set names = kernel.listGBeans(query);
089 ActiveMQBroker[] results = new ActiveMQBroker[names.size()];
090 int i=0;
091 for (Iterator it = names.iterator(); it.hasNext(); i++) {
092 AbstractName name = (AbstractName) it.next();
093 results[i] = (ActiveMQBroker) proxyManager.createProxy(name, ActiveMQBroker.class.getClassLoader());
094 }
095 return results;
096 }
097
098 public String[] getSupportedProtocols() {
099 // see files in modules/core/src/conf/META-INF/services/org/activemq/transport/server/
100 return new String[]{ "tcp", "stomp", "vm", "peer", "udp", "multicast", "failover"};
101 }
102
103 public NetworkConnector[] getConnectors() {
104 ProxyManager proxyManager = kernel.getProxyManager();
105 AbstractNameQuery query = new AbstractNameQuery(ActiveMQConnector.class.getName());
106 Set names = kernel.listGBeans(query);
107 ActiveMQConnector[] results = new ActiveMQConnector[names.size()];
108 int i=0;
109 for (Iterator it = names.iterator(); it.hasNext(); i++) {
110 AbstractName name = (AbstractName) it.next();
111 results[i] = (ActiveMQConnector) proxyManager.createProxy(name, ActiveMQConnector.class.getClassLoader());
112 }
113 return results;
114 }
115
116 public NetworkConnector[] getConnectors(String protocol) {
117 if(protocol == null) {
118 return getConnectors();
119 }
120 List result = new ArrayList();
121 ProxyManager proxyManager = kernel.getProxyManager();
122 AbstractNameQuery query = new AbstractNameQuery(ActiveMQConnector.class.getName());
123 Set names = kernel.listGBeans(query);
124 for (Iterator it = names.iterator(); it.hasNext();) {
125 AbstractName name = (AbstractName) it.next();
126 try {
127 if (kernel.getAttribute(name, "protocol").equals(protocol)) {
128 result.add(proxyManager.createProxy(name, ActiveMQConnector.class.getClassLoader()));
129 }
130 } catch (Exception e) {
131 log.error("Unable to check the protocol for a connector", e);
132 }
133 }
134 return (ActiveMQConnector[]) result.toArray(new ActiveMQConnector[names.size()]);
135 }
136
137 public NetworkConnector[] getConnectorsForContainer(Object broker) {
138 AbstractName containerName = kernel.getAbstractNameFor(broker);
139 ProxyManager mgr = kernel.getProxyManager();
140 try {
141 List results = new ArrayList();
142 AbstractNameQuery query = new AbstractNameQuery(ActiveMQConnector.class.getName());
143 Set set = kernel.listGBeans(query); // all Jetty connectors
144 for (Iterator it = set.iterator(); it.hasNext();) {
145 AbstractName name = (AbstractName) it.next(); // a single Jetty connector
146 GBeanData data = kernel.getGBeanData(name);
147 ReferencePatterns refs = data.getReferencePatterns("brokerService");
148 if (containerName.equals(refs.getAbstractName())) {
149 results.add(mgr.createProxy(name, ActiveMQConnector.class.getClassLoader()));
150 }
151 }
152 return (ActiveMQConnector[]) results.toArray(new ActiveMQConnector[results.size()]);
153 } catch (Exception e) {
154 throw (IllegalArgumentException) new IllegalArgumentException("Unable to look up connectors for ActiveMQ broker '"+containerName).initCause(e);
155 }
156 }
157
158 public NetworkConnector[] getConnectorsForContainer(Object broker, String protocol) {
159 if(protocol == null) {
160 return getConnectorsForContainer(broker);
161 }
162 AbstractName containerName = kernel.getAbstractNameFor(broker);
163 ProxyManager mgr = kernel.getProxyManager();
164 try {
165 List results = new ArrayList();
166 AbstractNameQuery query = new AbstractNameQuery(ActiveMQConnector.class.getName());
167 Set set = kernel.listGBeans(query); // all Jetty connectors
168 for (Iterator it = set.iterator(); it.hasNext();) {
169 AbstractName name = (AbstractName) it.next(); // a single Jetty connector
170 GBeanData data = kernel.getGBeanData(name);
171 ReferencePatterns refs = data.getReferencePatterns("brokerService");
172 if(containerName.equals(refs.getAbstractName())) {
173 try {
174 String testProtocol = (String) kernel.getAttribute(name, "protocol");
175 if(testProtocol != null && testProtocol.equals(protocol)) {
176 results.add(mgr.createProxy(name, ActiveMQConnector.class.getClassLoader()));
177 }
178 } catch (Exception e) {
179 log.error("Unable to look up protocol for connector '"+name+"'",e);
180 }
181 break;
182 }
183 }
184 return (ActiveMQConnector[]) results.toArray(new ActiveMQConnector[results.size()]);
185 } catch (Exception e) {
186 throw (IllegalArgumentException)new IllegalArgumentException("Unable to look up connectors for ActiveMQ broker '"+containerName +"': ").initCause(e);
187 }
188 }
189
190 /**
191 * Returns a new JMSConnector. Note that
192 * the connector may well require further customization before being fully
193 * functional (e.g. SSL settings for a secure connector).
194 */
195 public JMSConnector addConnector(JMSBroker broker, String uniqueName, String protocol, String host, int port) {
196 AbstractName brokerAbstractName = kernel.getAbstractNameFor(broker);
197 AbstractName name = kernel.getNaming().createChildName(brokerAbstractName, uniqueName, NameFactory.GERONIMO_SERVICE);
198 GBeanData connector = new GBeanData(name, TransportConnectorGBeanImpl.GBEAN_INFO);
199 //todo: if SSL is supported, need to add more properties or use a different GBean?
200 connector.setAttribute("protocol", protocol);
201 connector.setAttribute("host", host);
202 connector.setAttribute("port", new Integer(port));
203 connector.setReferencePattern("brokerService", brokerAbstractName);
204 EditableConfigurationManager mgr = ConfigurationUtil.getEditableConfigurationManager(kernel);
205 if(mgr != null) {
206 try {
207 mgr.addGBeanToConfiguration(brokerAbstractName.getArtifact(), connector, false);
208 return (JMSConnector) kernel.getProxyManager().createProxy(name, ActiveMQConnector.class.getClassLoader());
209 } catch (InvalidConfigException e) {
210 log.error("Unable to add GBean", e);
211 return null;
212 } finally {
213 ConfigurationUtil.releaseConfigurationManager(kernel, mgr);
214 }
215 } else {
216 log.warn("The ConfigurationManager in the kernel does not allow editing");
217 return null;
218 }
219 }
220
221 public void removeConnector(AbstractName connectorName) {
222 try {
223 GBeanInfo info = kernel.getGBeanInfo(connectorName);
224 boolean found = false;
225 Set intfs = info.getInterfaces();
226 for (Iterator it = intfs.iterator(); it.hasNext();) {
227 String intf = (String) it.next();
228 if (intf.equals(ActiveMQConnector.class.getName())) {
229 found = true;
230 }
231 }
232 if (!found) {
233 throw new GBeanNotFoundException(connectorName);
234 }
235 EditableConfigurationManager mgr = ConfigurationUtil.getEditableConfigurationManager(kernel);
236 if (mgr != null) {
237 try {
238 mgr.removeGBeanFromConfiguration(connectorName.getArtifact(), connectorName);
239 } catch (InvalidConfigException e) {
240 log.error("Unable to add GBean", e);
241 } finally {
242 ConfigurationUtil.releaseConfigurationManager(kernel, mgr);
243 }
244 } else {
245 log.warn("The ConfigurationManager in the kernel does not allow editing");
246 }
247 } catch (GBeanNotFoundException e) {
248 log.warn("No such GBean '" + connectorName + "'"); //todo: what if we want to remove a failed GBean?
249 } catch (Exception e) {
250 log.error(e);
251 }
252 }
253
254 public static final GBeanInfo GBEAN_INFO;
255
256 static {
257 GBeanInfoBuilder infoFactory = new GBeanInfoBuilder("ActiveMQ Manager", ActiveMQManagerGBean.class);
258 infoFactory.addAttribute("kernel", Kernel.class, false);
259 infoFactory.addAttribute("objectName", String.class, false);
260 infoFactory.addInterface(ActiveMQManager.class);
261 infoFactory.setConstructor(new String[]{"kernel", "objectName"});
262 GBEAN_INFO = infoFactory.getBeanInfo();
263 }
264
265 public static GBeanInfo getGBeanInfo() {
266 return GBEAN_INFO;
267 }
268 }