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    package org.apache.activemq.web;
018    
019    import org.apache.activemq.broker.jmx.BrokerViewMBean;
020    import org.apache.activemq.broker.jmx.ConnectionViewMBean;
021    import org.apache.activemq.broker.jmx.ConnectorViewMBean;
022    import org.apache.activemq.broker.jmx.DestinationViewMBean;
023    import org.apache.activemq.broker.jmx.DurableSubscriptionViewMBean;
024    import org.apache.activemq.broker.jmx.ManagementContext;
025    import org.apache.activemq.broker.jmx.NetworkConnectorViewMBean;
026    import org.apache.activemq.broker.jmx.QueueViewMBean;
027    import org.apache.activemq.broker.jmx.SubscriptionViewMBean;
028    import org.apache.activemq.broker.jmx.TopicViewMBean;
029    import org.springframework.util.StringUtils;
030    import java.util.ArrayList;
031    import java.util.Collection;
032    import java.util.Collections;
033    import java.util.Iterator;
034    import java.util.List;
035    import java.util.Set;
036    import javax.management.ObjectName;
037    /**
038     * A useful base class for an implementation of {@link BrokerFacade}
039     * 
040     * @version $Revision: 915387 $
041     */
042    public abstract class BrokerFacadeSupport implements BrokerFacade {
043        public abstract ManagementContext getManagementContext();
044    
045        public Collection<QueueViewMBean> getQueues() throws Exception {
046            BrokerViewMBean broker = getBrokerAdmin();
047            if (broker == null) {
048                return Collections.EMPTY_LIST;
049            }
050            ObjectName[] queues = broker.getQueues();
051            return getManagedObjects(queues, QueueViewMBean.class);
052        }
053    
054        public Collection<TopicViewMBean> getTopics() throws Exception {
055            BrokerViewMBean broker = getBrokerAdmin();
056            if (broker == null) {
057                return Collections.EMPTY_LIST;
058            }
059            ObjectName[] queues = broker.getTopics();
060            return getManagedObjects(queues, TopicViewMBean.class);
061        }
062    
063        public Collection<DurableSubscriptionViewMBean> getDurableTopicSubscribers() throws Exception {
064            BrokerViewMBean broker = getBrokerAdmin();
065            if (broker == null) {
066                return Collections.EMPTY_LIST;
067            }
068            ObjectName[] queues = broker.getDurableTopicSubscribers();
069            return getManagedObjects(queues, DurableSubscriptionViewMBean.class);
070        }
071    
072        public QueueViewMBean getQueue(String name) throws Exception {
073            return (QueueViewMBean) getDestinationByName(getQueues(), name);
074        }
075    
076        public TopicViewMBean getTopic(String name) throws Exception {
077            return (TopicViewMBean) getDestinationByName(getTopics(), name);
078        }
079    
080        protected DestinationViewMBean getDestinationByName(Collection<? extends DestinationViewMBean> collection,
081                String name) {
082            Iterator<? extends DestinationViewMBean> iter = collection.iterator();
083            while (iter.hasNext()) {
084                DestinationViewMBean destinationViewMBean = iter.next();
085                if (name.equals(destinationViewMBean.getName())) {
086                    return destinationViewMBean;
087                }
088            }
089            return null;
090        }
091    
092        @SuppressWarnings("unchecked")
093        protected <T> Collection<T> getManagedObjects(ObjectName[] names, Class<T> type) {
094            List<T> answer = new ArrayList<T>();
095            for (int i = 0; i < names.length; i++) {
096                ObjectName name = names[i];
097                T value = (T) getManagementContext().newProxyInstance(name, type, true);
098                if (value != null) {
099                    answer.add(value);
100                }
101            }
102            return answer;
103        }
104    
105       
106    
107        @SuppressWarnings("unchecked")
108        public Collection<ConnectionViewMBean> getConnections() throws Exception {
109            String brokerName = getBrokerName();
110            ObjectName query = new ObjectName("org.apache.activemq:BrokerName=" + brokerName + ",Type=Connection,*");
111            System.out.println(query);
112            Set<ObjectName> queryResult = getManagementContext().queryNames(query, null);
113            return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), ConnectionViewMBean.class);
114        }
115    
116        @SuppressWarnings("unchecked")
117        public Collection<String> getConnections(String connectorName) throws Exception {
118            String brokerName = getBrokerName();
119            ObjectName query = new ObjectName("org.apache.activemq:BrokerName=" + brokerName
120                    + ",Type=Connection,ConnectorName=" + connectorName + ",*");
121            Set<ObjectName> queryResult = getManagementContext().queryNames(query, null);
122            Collection<String> result = new ArrayList<String>(queryResult.size());
123            for (ObjectName on : queryResult) {
124                String name = StringUtils.replace(on.getKeyProperty("Connection"), "_", ":");
125                result.add(name);
126            }
127            return result;
128        }
129    
130        @SuppressWarnings("unchecked")
131        public ConnectionViewMBean getConnection(String connectionName) throws Exception {
132            connectionName = StringUtils.replace(connectionName, ":", "_");
133            String brokerName = getBrokerName();
134            ObjectName query = new ObjectName("org.apache.activemq:BrokerName=" + brokerName
135                    + ",Type=Connection,*,Connection=" + connectionName);
136            Set<ObjectName> queryResult = getManagementContext().queryNames(query, null);
137            if (queryResult.size() == 0)
138                return null;
139            ObjectName objectName = queryResult.iterator().next();
140            return (ConnectionViewMBean) getManagementContext().newProxyInstance(objectName,
141                    ConnectionViewMBean.class, true);
142        }
143    
144        @SuppressWarnings("unchecked")
145        public Collection<String> getConnectors() throws Exception {
146            String brokerName = getBrokerName();
147            ObjectName query = new ObjectName("org.apache.activemq:BrokerName=" + brokerName + ",Type=Connector,*");
148            Set<ObjectName> queryResult = getManagementContext().queryNames(query, null);
149            Collection<String> result = new ArrayList<String>(queryResult.size());
150            for (ObjectName on : queryResult)
151                result.add(on.getKeyProperty("ConnectorName"));
152            return result;
153        }
154    
155        public ConnectorViewMBean getConnector(String name) throws Exception {
156            String brokerName = getBrokerName();
157            ObjectName objectName = new ObjectName("org.apache.activemq:BrokerName=" + brokerName
158                    + ",Type=Connector,ConnectorName=" + name);
159            return (ConnectorViewMBean) getManagementContext().newProxyInstance(objectName,
160                    ConnectorViewMBean.class, true);
161        }
162    
163        @SuppressWarnings("unchecked")
164        public Collection<NetworkConnectorViewMBean> getNetworkConnectors() throws Exception {
165            String brokerName = getBrokerName();
166            ObjectName query = new ObjectName("org.apache.activemq:BrokerName=" + brokerName + ",Type=NetworkConnector,*");
167            Set<ObjectName> queryResult = getManagementContext().queryNames(query, null);
168            return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]),
169                    NetworkConnectorViewMBean.class);
170        }
171    
172        @SuppressWarnings("unchecked")
173        public Collection<SubscriptionViewMBean> getQueueConsumers(String queueName) throws Exception {
174            String brokerName = getBrokerName();
175            queueName = StringUtils.replace(queueName, "\"", "_");
176            ObjectName query = new ObjectName("org.apache.activemq:BrokerName=" + brokerName
177                    + ",Type=Subscription,destinationType=Queue,destinationName=" + queueName + ",*");
178            Set<ObjectName> queryResult = getManagementContext().queryNames(query, null);
179            return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), SubscriptionViewMBean.class);
180        }
181    
182        @SuppressWarnings("unchecked")
183        public Collection<SubscriptionViewMBean> getConsumersOnConnection(String connectionName) throws Exception {
184            connectionName = StringUtils.replace(connectionName, ":", "_");
185            String brokerName = getBrokerName();
186            ObjectName query = new ObjectName("org.apache.activemq:BrokerName=" + brokerName
187                    + ",Type=Subscription,clientId=" + connectionName + ",*");
188            Set<ObjectName> queryResult = getManagementContext().queryNames(query, null);
189            return getManagedObjects(queryResult.toArray(new ObjectName[queryResult.size()]), SubscriptionViewMBean.class);
190        }
191    }