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}