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 */ 017package org.apache.activemq.web; 018 019import java.util.ArrayList; 020import java.util.Collection; 021import java.util.Collections; 022import java.util.Iterator; 023import java.util.List; 024import java.util.Set; 025 026import javax.management.ObjectName; 027import javax.management.QueryExp; 028import javax.management.openmbean.CompositeData; 029import javax.management.openmbean.TabularData; 030 031import org.apache.activemq.broker.jmx.BrokerViewMBean; 032import org.apache.activemq.broker.jmx.ConnectionViewMBean; 033import org.apache.activemq.broker.jmx.ConnectorViewMBean; 034import org.apache.activemq.broker.jmx.DestinationViewMBean; 035import org.apache.activemq.broker.jmx.DurableSubscriptionViewMBean; 036import org.apache.activemq.broker.jmx.JobSchedulerViewMBean; 037import org.apache.activemq.broker.jmx.ManagementContext; 038import org.apache.activemq.broker.jmx.NetworkBridgeViewMBean; 039import org.apache.activemq.broker.jmx.NetworkConnectorViewMBean; 040import org.apache.activemq.broker.jmx.QueueViewMBean; 041import org.apache.activemq.broker.jmx.SubscriptionViewMBean; 042import org.apache.activemq.broker.jmx.ProducerViewMBean; 043import org.apache.activemq.broker.jmx.TopicViewMBean; 044import org.springframework.util.StringUtils; 045 046/** 047 * A useful base class for an implementation of {@link BrokerFacade} 048 * 049 * 050 */ 051public abstract class BrokerFacadeSupport implements BrokerFacade { 052 public abstract ManagementContext getManagementContext(); 053 public abstract Set queryNames(ObjectName name, QueryExp query) throws Exception; 054 public abstract Object newProxyInstance( ObjectName objectName, Class interfaceClass, boolean notificationBroadcaster) throws Exception; 055 056 @Override 057 public Collection<QueueViewMBean> getQueues() throws Exception { 058 BrokerViewMBean broker = getBrokerAdmin(); 059 if (broker == null) { 060 return Collections.EMPTY_LIST; 061 } 062 ObjectName[] queues = broker.getQueues(); 063 return getManagedObjects(queues, QueueViewMBean.class); 064 } 065 066 @Override 067 public Collection<TopicViewMBean> getTopics() throws Exception { 068 BrokerViewMBean broker = getBrokerAdmin(); 069 if (broker == null) { 070 return Collections.EMPTY_LIST; 071 } 072 ObjectName[] topics = broker.getTopics(); 073 return getManagedObjects(topics, TopicViewMBean.class); 074 } 075 076 @Override 077 public Collection<SubscriptionViewMBean> getTopicSubscribers(String topicName) throws Exception { 078 String brokerName = getBrokerName(); 079 topicName = StringUtils.replace(topicName, "\"", "_"); 080 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName 081 + ",destinationType=Topic,destinationName=" + topicName + ",endpoint=Consumer,*"); 082 Set<ObjectName> queryResult = queryNames(query, null); 083 return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), SubscriptionViewMBean.class); 084 } 085 086 @Override 087 public Collection<SubscriptionViewMBean> getNonDurableTopicSubscribers() throws Exception { 088 BrokerViewMBean broker = getBrokerAdmin(); 089 if (broker == null) { 090 return Collections.EMPTY_LIST; 091 } 092 ObjectName[] subscribers = broker.getTopicSubscribers(); 093 return getManagedObjects(subscribers, SubscriptionViewMBean.class); 094 } 095 096 @Override 097 public Collection<DurableSubscriptionViewMBean> getDurableTopicSubscribers() throws Exception { 098 BrokerViewMBean broker = getBrokerAdmin(); 099 if (broker == null) { 100 return Collections.EMPTY_LIST; 101 } 102 ObjectName[] subscribers = broker.getDurableTopicSubscribers(); 103 return getManagedObjects(subscribers, DurableSubscriptionViewMBean.class); 104 } 105 106 @Override 107 public Collection<DurableSubscriptionViewMBean> getInactiveDurableTopicSubscribers() throws Exception { 108 BrokerViewMBean broker = getBrokerAdmin(); 109 if (broker == null) { 110 return Collections.EMPTY_LIST; 111 } 112 ObjectName[] subscribers = broker.getInactiveDurableTopicSubscribers(); 113 return getManagedObjects(subscribers, DurableSubscriptionViewMBean.class); 114 } 115 116 @Override 117 public QueueViewMBean getQueue(String name) throws Exception { 118 return (QueueViewMBean) getDestinationByName(getQueues(), name); 119 } 120 121 @Override 122 public TopicViewMBean getTopic(String name) throws Exception { 123 return (TopicViewMBean) getDestinationByName(getTopics(), name); 124 } 125 126 protected DestinationViewMBean getDestinationByName(Collection<? extends DestinationViewMBean> collection, 127 String name) { 128 Iterator<? extends DestinationViewMBean> iter = collection.iterator(); 129 while (iter.hasNext()) { 130 DestinationViewMBean destinationViewMBean = iter.next(); 131 if (name.equals(destinationViewMBean.getName())) { 132 return destinationViewMBean; 133 } 134 } 135 return null; 136 } 137 138 @SuppressWarnings("unchecked") 139 protected <T> Collection<T> getManagedObjects(ObjectName[] names, Class<T> type) throws Exception { 140 List<T> answer = new ArrayList<T>(); 141 for (int i = 0; i < names.length; i++) { 142 ObjectName name = names[i]; 143 T value = (T) newProxyInstance(name, type, true); 144 if (value != null) { 145 answer.add(value); 146 } 147 } 148 return answer; 149 } 150 151 @Override 152 @SuppressWarnings("unchecked") 153 public Collection<ConnectionViewMBean> getConnections() throws Exception { 154 String brokerName = getBrokerName(); 155 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName + ",connector=clientConnectors,connectorName=*,connectionName=*"); 156 157 Set<ObjectName> queryResult = queryNames(query, null); 158 return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), ConnectionViewMBean.class); 159 } 160 161 @Override 162 @SuppressWarnings("unchecked") 163 public Collection<String> getConnections(String connectorName) throws Exception { 164 String brokerName = getBrokerName(); 165 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName 166 + ",connector=clientConnectors,connectorName=" + connectorName + ",connectionViewType=clientId" + ",connectionName=*"); Set<ObjectName> queryResult = queryNames(query, null); 167 Collection<String> result = new ArrayList<String>(queryResult.size()); 168 for (ObjectName on : queryResult) { 169 String name = StringUtils.replace(on.getKeyProperty("connectionName"), "_", ":"); 170 result.add(name); 171 } 172 return result; 173 } 174 175 @Override 176 @SuppressWarnings("unchecked") 177 public ConnectionViewMBean getConnection(String connectionName) throws Exception { 178 connectionName = StringUtils.replace(connectionName, ":", "_"); 179 String brokerName = getBrokerName(); 180 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName 181 + ",connector=clientConnectors,*,connectionName=" + connectionName); 182 Set<ObjectName> queryResult = queryNames(query, null); 183 if (queryResult.size() == 0) 184 return null; 185 ObjectName objectName = queryResult.iterator().next(); 186 return (ConnectionViewMBean) newProxyInstance(objectName, ConnectionViewMBean.class, 187 true); 188 } 189 190 @Override 191 @SuppressWarnings("unchecked") 192 public Collection<String> getConnectors() throws Exception { 193 String brokerName = getBrokerName(); 194 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName + ",connector=clientConnectors,connectorName=*"); 195 Set<ObjectName> queryResult = queryNames(query, null); 196 Collection<String> result = new ArrayList<String>(queryResult.size()); 197 for (ObjectName on : queryResult) 198 result.add(on.getKeyProperty("connectorName")); 199 return result; 200 } 201 202 @Override 203 public ConnectorViewMBean getConnector(String name) throws Exception { 204 String brokerName = getBrokerName(); 205 ObjectName objectName = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName 206 + ",connector=clientConnectors,connectorName=" + name); 207 return (ConnectorViewMBean) newProxyInstance(objectName, ConnectorViewMBean.class, true); 208 } 209 210 @Override 211 @SuppressWarnings("unchecked") 212 public Collection<NetworkConnectorViewMBean> getNetworkConnectors() throws Exception { 213 String brokerName = getBrokerName(); 214 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName + ",connector=networkConnectors,networkConnectorName=*"); 215 Set<ObjectName> queryResult = queryNames(query, null); 216 return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), 217 NetworkConnectorViewMBean.class); 218 } 219 220 @Override 221 public Collection<NetworkBridgeViewMBean> getNetworkBridges() throws Exception { 222 String brokerName = getBrokerName(); 223 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName + ",connector=networkConnectors,networkConnectorName=*,networkBridge=*"); 224 Set<ObjectName> queryResult = queryNames(query, null); 225 return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), 226 NetworkBridgeViewMBean.class); 227 } 228 229 @Override 230 @SuppressWarnings("unchecked") 231 public Collection<SubscriptionViewMBean> getQueueConsumers(String queueName) throws Exception { 232 String brokerName = getBrokerName(); 233 queueName = StringUtils.replace(queueName, "\"", "_"); 234 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName 235 + ",destinationType=Queue,destinationName=" + queueName + ",endpoint=Consumer,*"); 236 Set<ObjectName> queryResult = queryNames(query, null); 237 return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), SubscriptionViewMBean.class); 238 } 239 240 @Override 241 @SuppressWarnings("unchecked") 242 public Collection<ProducerViewMBean> getQueueProducers(String queueName) throws Exception { 243 String brokerName = getBrokerName(); 244 queueName = StringUtils.replace(queueName, "\"", "_"); 245 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName 246 + ",destinationType=Queue,destinationName=" + queueName + ",endpoint=Producer,*"); 247 Set<ObjectName> queryResult = queryNames(query, null); 248 return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), ProducerViewMBean.class); 249 } 250 251 @Override 252 @SuppressWarnings("unchecked") 253 public Collection<ProducerViewMBean> getTopicProducers(String topicName) throws Exception { 254 String brokerName = getBrokerName(); 255 topicName = StringUtils.replace(topicName, "\"", "_"); 256 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName 257 + ",destinationType=Topic,destinationName=" + topicName + ",endpoint=Producer,*"); 258 Set<ObjectName> queryResult = queryNames(query, null); 259 return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), ProducerViewMBean.class); 260 } 261 262 @Override 263 @SuppressWarnings("unchecked") 264 public Collection<SubscriptionViewMBean> getConsumersOnConnection(String connectionName) throws Exception { 265 connectionName = StringUtils.replace(connectionName, ":", "_"); 266 String brokerName = getBrokerName(); 267 ObjectName query = new ObjectName("org.apache.activemq:type=Broker,brokerName=" + brokerName 268 + ",*,endpoint=Consumer,clientId=" + connectionName); 269 Set<ObjectName> queryResult = queryNames(query, null); 270 return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), SubscriptionViewMBean.class); 271 } 272 273 @Override 274 public JobSchedulerViewMBean getJobScheduler() throws Exception { 275 ObjectName name = getBrokerAdmin().getJMSJobScheduler(); 276 return (JobSchedulerViewMBean) newProxyInstance(name, JobSchedulerViewMBean.class, true); 277 } 278 279 @Override 280 public Collection<JobFacade> getScheduledJobs() throws Exception { 281 JobSchedulerViewMBean jobScheduler = getJobScheduler(); 282 List<JobFacade> result = new ArrayList<JobFacade>(); 283 TabularData table = jobScheduler.getAllJobs(); 284 for (Object object : table.values()) { 285 CompositeData cd = (CompositeData) object; 286 JobFacade jf = new JobFacade(cd); 287 result.add(jf); 288 } 289 return result; 290 } 291 292 293 @Override 294 public boolean isJobSchedulerStarted() { 295 try { 296 JobSchedulerViewMBean jobScheduler = getJobScheduler(); 297 return true; 298 } catch (Exception e) { 299 return false; 300 } 301 } 302}