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.broker.jmx;
018
019import java.util.Hashtable;
020
021import javax.management.MalformedObjectNameException;
022import javax.management.ObjectName;
023
024import org.apache.activemq.broker.region.policy.AbortSlowConsumerStrategy;
025import org.apache.activemq.command.ActiveMQDestination;
026import org.apache.activemq.command.ConsumerInfo;
027import org.apache.activemq.command.ProducerInfo;
028import org.apache.activemq.transaction.XATransaction;
029import org.apache.activemq.util.JMXSupport;
030
031public class BrokerMBeanSupport {
032
033    // MBean Name Creation
034
035    public static ObjectName createBrokerObjectName(String jmxDomainName, String brokerName) throws MalformedObjectNameException  {
036        String objectNameStr = jmxDomainName + ":type=Broker,brokerName=";
037        objectNameStr += JMXSupport.encodeObjectNamePart(brokerName);
038        return new ObjectName(objectNameStr);
039    }
040
041    public static ObjectName createDestinationName(ObjectName brokerObjectName, ActiveMQDestination destination) throws MalformedObjectNameException {
042        return createDestinationName(brokerObjectName.toString(), destination);
043    }
044
045    public static ObjectName createDestinationName(String brokerObjectName, ActiveMQDestination destination) throws MalformedObjectNameException {
046        String objectNameStr = brokerObjectName;
047        objectNameStr += createDestinationProperties(destination);
048        return new ObjectName(objectNameStr);
049    }
050
051    public static ObjectName createDestinationName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
052        String objectNameStr = brokerObjectName;
053        objectNameStr += createDestinationProperties(type, name);
054        return new ObjectName(objectNameStr);
055    }
056
057    private static String createDestinationProperties(ActiveMQDestination destination){
058        String result = "";
059        if (destination != null){
060            result = createDestinationProperties(destination.getDestinationTypeAsString(), destination.getPhysicalName());
061        }
062        return result;
063    }
064
065    private static String createDestinationProperties(String type, String name){
066        return ",destinationType="+ JMXSupport.encodeObjectNamePart(type) +
067               ",destinationName=" + JMXSupport.encodeObjectNamePart(name);
068    }
069
070    public static ObjectName createSubscriptionName(ObjectName brokerObjectName, String connectionClientId, ConsumerInfo info) throws MalformedObjectNameException {
071        return createSubscriptionName(brokerObjectName.toString(), connectionClientId, info);
072    }
073
074    public static ObjectName createSubscriptionName(String brokerObjectName, String connectionClientId, ConsumerInfo info) throws MalformedObjectNameException {
075        String objectNameStr = brokerObjectName;
076        objectNameStr += createDestinationProperties(info.getDestination()) + ",endpoint=Consumer";
077        objectNameStr += ",clientId=" + JMXSupport.encodeObjectNamePart(connectionClientId);
078        objectNameStr += ",consumerId=";
079
080        if (info.isDurable()){
081            objectNameStr += "Durable(" + JMXSupport.encodeObjectNamePart(connectionClientId + ":" + info.getSubscriptionName()) +")";
082        } else {
083            objectNameStr += JMXSupport.encodeObjectNamePart(info.getConsumerId().toString());
084        }
085
086        return new ObjectName(objectNameStr);
087    }
088
089    public static ObjectName createProducerName(ObjectName brokerObjectName, String connectionClientId, ProducerInfo info) throws MalformedObjectNameException {
090        return createProducerName(brokerObjectName.toString(), connectionClientId, info);
091    }
092
093    public static ObjectName createProducerName(String brokerObjectName, String connectionClientId, ProducerInfo producerInfo) throws MalformedObjectNameException {
094        String objectNameStr = brokerObjectName;
095
096        if (producerInfo.getDestination() == null) {
097            objectNameStr += ",endpoint=dynamicProducer";
098        } else {
099            objectNameStr += createDestinationProperties(producerInfo.getDestination()) + ",endpoint=Producer";
100        }
101
102        objectNameStr += ",clientId=" + JMXSupport.encodeObjectNamePart(connectionClientId);
103        objectNameStr += ",producerId=" + JMXSupport.encodeObjectNamePart(producerInfo.getProducerId().toString());
104
105        return new ObjectName(objectNameStr);
106    }
107
108    public static ObjectName createXATransactionName(ObjectName brokerObjectName, XATransaction transaction) throws MalformedObjectNameException {
109        return createXATransactionName(brokerObjectName.toString(), transaction);
110    }
111
112    public static ObjectName createXATransactionName(String brokerObjectName, XATransaction transaction) throws MalformedObjectNameException {
113        String objectNameStr = brokerObjectName;
114
115        objectNameStr += "," + "transactionType=RecoveredXaTransaction";
116        objectNameStr += "," + "xid=" + JMXSupport.encodeObjectNamePart(transaction.getTransactionId().toString());
117
118        return new ObjectName(objectNameStr);
119    }
120
121    public static ObjectName createLog4JConfigViewName(String brokerObjectName) throws MalformedObjectNameException {
122        String objectNameStr = brokerObjectName;
123
124        objectNameStr += "," + "service=Log4JConfiguration";
125
126        return new ObjectName(objectNameStr);
127    }
128
129    public static ObjectName createPersistenceAdapterName(String brokerObjectName, String name) throws MalformedObjectNameException {
130        String objectNameStr = brokerObjectName;
131
132        objectNameStr += "," + "service=PersistenceAdapter";
133        objectNameStr += "," + "instanceName=" + JMXSupport.encodeObjectNamePart(name);
134
135        return new ObjectName(objectNameStr);
136    }
137
138    public static ObjectName createAbortSlowConsumerStrategyName(ObjectName brokerObjectName, AbortSlowConsumerStrategy strategy) throws MalformedObjectNameException {
139        return createAbortSlowConsumerStrategyName(brokerObjectName.toString(), strategy);
140    }
141
142    public static ObjectName createAbortSlowConsumerStrategyName(String brokerObjectName, AbortSlowConsumerStrategy strategy) throws MalformedObjectNameException {
143        String objectNameStr = brokerObjectName;
144        objectNameStr += ",service=SlowConsumerStrategy,instanceName="+ JMXSupport.encodeObjectNamePart(strategy.getName());
145        ObjectName objectName = new ObjectName(objectNameStr);
146        return objectName;
147    }
148
149    public static ObjectName createConnectorName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
150        return createConnectorName(brokerObjectName.toString(), type, name);
151    }
152
153    public static ObjectName createConnectorName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
154        String objectNameStr = brokerObjectName;
155        objectNameStr += ",connector=" + type + ",connectorName="+ JMXSupport.encodeObjectNamePart(name);
156        ObjectName objectName = new ObjectName(objectNameStr);
157        return objectName;
158    }
159
160    public static ObjectName createNetworkConnectorName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
161        return createNetworkConnectorName(brokerObjectName.toString(), type, name);
162    }
163
164    public static ObjectName createVirtualDestinationSelectorCacheName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
165        String objectNameStr = brokerObjectName.toString();
166        objectNameStr += ",service=" + type + ",virtualDestinationSelectoCache="+ JMXSupport.encodeObjectNamePart(name);
167        ObjectName objectName = new ObjectName(objectNameStr);
168        return objectName;
169    }
170
171    public static ObjectName createNetworkConnectorName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
172        String objectNameStr = brokerObjectName;
173        objectNameStr += ",connector=" + type + ",networkConnectorName="+ JMXSupport.encodeObjectNamePart(name);
174        ObjectName objectName = new ObjectName(objectNameStr);
175        return objectName;
176    }
177
178    public static ObjectName createConnectionViewByType(ObjectName connectorName, String type, String name) throws MalformedObjectNameException {
179        String objectNameStr = connectorName.toString();
180        objectNameStr += ",connectionViewType=" + JMXSupport.encodeObjectNamePart(type);
181        objectNameStr += ",connectionName="+ JMXSupport.encodeObjectNamePart(name);
182        return new ObjectName(objectNameStr);
183    }
184
185    public static ObjectName createNetworkBridgeObjectName(ObjectName connectorName, String remoteAddress) throws MalformedObjectNameException {
186        Hashtable<String, String> map = new Hashtable<String, String>(connectorName.getKeyPropertyList());
187        map.put("networkBridge", JMXSupport.encodeObjectNamePart(remoteAddress));
188        return new ObjectName(connectorName.getDomain(), map);
189    }
190
191    public static ObjectName createNetworkOutBoundDestinationObjectName(ObjectName networkName, ActiveMQDestination destination) throws MalformedObjectNameException {
192        String str = networkName.toString();
193        str += ",direction=outbound" + createDestinationProperties(destination);
194        return new ObjectName(str);
195
196    }
197
198    public static ObjectName createNetworkInBoundDestinationObjectName(ObjectName networkName, ActiveMQDestination destination) throws MalformedObjectNameException {
199        String str = networkName.toString();
200        str += ",direction=inbound" + createDestinationProperties(destination);
201        return new ObjectName(str);
202
203    }
204
205
206    public static ObjectName createProxyConnectorName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
207        return createProxyConnectorName(brokerObjectName.toString(), type, name);
208    }
209
210    public static ObjectName createProxyConnectorName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
211        String objectNameStr = brokerObjectName;
212        objectNameStr += ",connector=" + type + ",proxyConnectorName="+ JMXSupport.encodeObjectNamePart(name);
213        ObjectName objectName = new ObjectName(objectNameStr);
214        return objectName;
215    }
216
217    public static ObjectName createJmsConnectorName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
218        return createJmsConnectorName(brokerObjectName.toString(), type, name);
219    }
220
221    public static ObjectName createJmsConnectorName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
222        String objectNameStr = brokerObjectName;
223        objectNameStr += ",connector=" + type + ",jmsConnectors="+ JMXSupport.encodeObjectNamePart(name);
224        ObjectName objectName = new ObjectName(objectNameStr);
225        return objectName;
226    }
227
228    public static ObjectName createJobSchedulerServiceName(ObjectName brokerObjectName) throws MalformedObjectNameException {
229        return createJobSchedulerServiceName(brokerObjectName.toString());
230    }
231
232    public static ObjectName createJobSchedulerServiceName(String brokerObjectName) throws MalformedObjectNameException {
233        String objectNameStr = brokerObjectName;
234        objectNameStr += ",service=JobScheduler,name=JMS";
235        ObjectName objectName = new ObjectName(objectNameStr);
236        return objectName;
237    }
238
239    public static ObjectName createHealthServiceName(ObjectName brokerObjectName) throws MalformedObjectNameException {
240        return createHealthServiceName(brokerObjectName.toString());
241    }
242
243    public static ObjectName createHealthServiceName(String brokerObjectName) throws MalformedObjectNameException {
244        String objectNameStr = brokerObjectName;
245        objectNameStr += ",service=Health";
246        ObjectName objectName = new ObjectName(objectNameStr);
247        return objectName;
248    }
249
250    // MBean Query Creation
251
252    public static ObjectName createConnectionQuery(String jmxDomainName, String brokerName, String name) throws MalformedObjectNameException {
253        ObjectName brokerMBeanName = createBrokerObjectName(jmxDomainName, brokerName);
254        return createConnectionQuery(brokerMBeanName.toString(), name);
255    }
256
257    public static ObjectName createConnectionQuery(String brokerMBeanName, String name) throws MalformedObjectNameException {
258        return new ObjectName(brokerMBeanName + ","
259                              + "connector=*," + "connectorName=*," + "connectionViewType=*,"
260                              + "connectionName=" + JMXSupport.encodeObjectNamePart(name));
261    }
262
263    public static ObjectName createQueueQuery(String brokerMBeanName) throws MalformedObjectNameException {
264        return createConnectionQuery(brokerMBeanName, "*");
265    }
266
267    public static ObjectName createQueueQuery(String brokerMBeanName, String destinationName) throws MalformedObjectNameException {
268        return new ObjectName(brokerMBeanName + ","
269                              + "destinationType=Queue,"
270                              + "destinationName=" + JMXSupport.encodeObjectNamePart(destinationName));
271    }
272
273    public static ObjectName createTopicQuery(String brokerMBeanName) throws MalformedObjectNameException {
274        return createConnectionQuery(brokerMBeanName, "*");
275    }
276
277    public static ObjectName createTopicQuery(String brokerMBeanName, String destinationName) throws MalformedObjectNameException {
278        return new ObjectName(brokerMBeanName + ","
279                              + "destinationType=Topic,"
280                              + "destinationName=" + JMXSupport.encodeObjectNamePart(destinationName));
281    }
282
283    public static ObjectName createConsumerQueury(String jmxDomainName, String clientId) throws MalformedObjectNameException {
284        return createConsumerQueury(jmxDomainName, null, clientId);
285    }
286
287    public static ObjectName createConsumerQueury(String jmxDomainName, String brokerName, String clientId) throws MalformedObjectNameException {
288        return new ObjectName(jmxDomainName + ":type=Broker,brokerName="
289                              + (brokerName != null ? brokerName : "*") + ","
290                              + "destinationType=*,destinationName=*,"
291                              + "endpoint=Consumer,"
292                              + "clientId=" + JMXSupport.encodeObjectNamePart(clientId) + ","
293                              + "consumerId=*");
294    }
295
296    public static ObjectName createProducerQueury(String jmxDomainName, String clientId) throws MalformedObjectNameException {
297        return createProducerQueury(jmxDomainName, null, clientId);
298    }
299
300    public static ObjectName createProducerQueury(String jmxDomainName, String brokerName, String clientId) throws MalformedObjectNameException {
301        return new ObjectName(jmxDomainName + ":type=Broker,brokerName="
302                + (brokerName != null ? brokerName : "*") + ","
303                + "destinationType=*,destinationName=*,"
304                + "endpoint=Producer,"
305                + "clientId=" + JMXSupport.encodeObjectNamePart(clientId) + ","
306                + "producerId=*");
307    }
308
309}