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