content: /**
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.activemq.broker.jmx;
  
  import java.util.Hashtable;
  
  import javax.management.MalformedObjectNameException;
  import javax.management.ObjectName;
  
  import org.apache.activemq.broker.region.policy.AbortSlowConsumerStrategy;
  import org.apache.activemq.command.ActiveMQDestination;
  import org.apache.activemq.command.ConsumerInfo;
  import org.apache.activemq.command.ProducerInfo;
  import org.apache.activemq.transaction.XATransaction;
  import org.apache.activemq.util.JMXSupport;
  
  public class BrokerMBeanSupport {
  
      // MBean Name Creation
  
      public static ObjectName createBrokerObjectName(String jmxDomainName, String brokerName) throws MalformedObjectNameException  {
          String objectNameStr = jmxDomainName + ":type=Broker,brokerName=";
          objectNameStr += JMXSupport.encodeObjectNamePart(brokerName);
          return new ObjectName(objectNameStr);
      }
  
      public static ObjectName createDestinationName(ObjectName brokerObjectName, ActiveMQDestination destination) throws MalformedObjectNameException {
          return createDestinationName(brokerObjectName.toString(), destination);
      }
  
      public static ObjectName createDestinationName(String brokerObjectName, ActiveMQDestination destination) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += createDestinationProperties(destination);
          return new ObjectName(objectNameStr);
      }
  
      public static ObjectName createDestinationName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += createDestinationProperties(type, name);
          return new ObjectName(objectNameStr);
      }
  
      private static String createDestinationProperties(ActiveMQDestination destination){
          String result = "";
          if (destination != null){
              result = createDestinationProperties(destination.getDestinationTypeAsString(), destination.getPhysicalName());
          }
          return result;
      }
  
      private static String createDestinationProperties(String type, String name){
          return ",destinationType="+ JMXSupport.encodeObjectNamePart(type) +
                 ",destinationName=" + JMXSupport.encodeObjectNamePart(name);
      }
  
      public static ObjectName createSubscriptionName(ObjectName brokerObjectName, String connectionClientId, ConsumerInfo info) throws MalformedObjectNameException {
          return createSubscriptionName(brokerObjectName.toString(), connectionClientId, info);
      }
  
      public static ObjectName createSubscriptionName(String brokerObjectName, String connectionClientId, ConsumerInfo info) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += createDestinationProperties(info.getDestination()) + ",endpoint=Consumer";
          objectNameStr += ",clientId=" + JMXSupport.encodeObjectNamePart(connectionClientId);
          objectNameStr += ",consumerId=";
  
          if (info.isDurable()){
              objectNameStr += "Durable(" + JMXSupport.encodeObjectNamePart(connectionClientId + ":" + info.getSubscriptionName()) +")";
          } else {
              objectNameStr += JMXSupport.encodeObjectNamePart(info.getConsumerId().toString());
          }
  
          return new ObjectName(objectNameStr);
      }
  
      public static ObjectName createProducerName(ObjectName brokerObjectName, String connectionClientId, ProducerInfo info) throws MalformedObjectNameException {
          return createProducerName(brokerObjectName.toString(), connectionClientId, info);
      }
  
      public static ObjectName createProducerName(String brokerObjectName, String connectionClientId, ProducerInfo producerInfo) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
  
          if (producerInfo.getDestination() == null) {
              objectNameStr += ",endpoint=dynamicProducer";
          } else {
              objectNameStr += createDestinationProperties(producerInfo.getDestination()) + ",endpoint=Producer";
          }
  
          objectNameStr += ",clientId=" + JMXSupport.encodeObjectNamePart(connectionClientId);
          objectNameStr += ",producerId=" + JMXSupport.encodeObjectNamePart(producerInfo.getProducerId().toString());
  
          return new ObjectName(objectNameStr);
      }
  
      public static ObjectName createXATransactionName(ObjectName brokerObjectName, XATransaction transaction) throws MalformedObjectNameException {
          return createXATransactionName(brokerObjectName.toString(), transaction);
      }
  
      public static ObjectName createXATransactionName(String brokerObjectName, XATransaction transaction) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
  
          objectNameStr += "," + "transactionType=RecoveredXaTransaction";
          objectNameStr += "," + "xid=" + JMXSupport.encodeObjectNamePart(transaction.getTransactionId().toString());
  
          return new ObjectName(objectNameStr);
      }
  
      public static ObjectName createLog4JConfigViewName(String brokerObjectName) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
  
          objectNameStr += "," + "service=Log4JConfiguration";
  
          return new ObjectName(objectNameStr);
      }
  
      public static ObjectName createPersistenceAdapterName(String brokerObjectName, String name) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
  
          objectNameStr += "," + "service=PersistenceAdapter";
          objectNameStr += "," + "instanceName=" + JMXSupport.encodeObjectNamePart(name);
  
          return new ObjectName(objectNameStr);
      }
  
      public static ObjectName createAbortSlowConsumerStrategyName(ObjectName brokerObjectName, AbortSlowConsumerStrategy strategy) throws MalformedObjectNameException {
          return createAbortSlowConsumerStrategyName(brokerObjectName.toString(), strategy);
      }
  
      public static ObjectName createAbortSlowConsumerStrategyName(String brokerObjectName, AbortSlowConsumerStrategy strategy) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += ",service=SlowConsumerStrategy,instanceName="+ JMXSupport.encodeObjectNamePart(strategy.getName());
          ObjectName objectName = new ObjectName(objectNameStr);
          return objectName;
      }
  
      public static ObjectName createConnectorName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
          return createConnectorName(brokerObjectName.toString(), type, name);
      }
  
      public static ObjectName createConnectorName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += ",connector=" + type + ",connectorName="+ JMXSupport.encodeObjectNamePart(name);
          ObjectName objectName = new ObjectName(objectNameStr);
          return objectName;
      }
  
      public static ObjectName createNetworkConnectorName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
          return createNetworkConnectorName(brokerObjectName.toString(), type, name);
      }
  
      public static ObjectName createVirtualDestinationSelectorCacheName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName.toString();
          objectNameStr += ",service=" + type + ",virtualDestinationSelectoCache="+ JMXSupport.encodeObjectNamePart(name);
          ObjectName objectName = new ObjectName(objectNameStr);
          return objectName;
      }
  
      public static ObjectName createNetworkConnectorName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += ",connector=" + type + ",networkConnectorName="+ JMXSupport.encodeObjectNamePart(name);
          ObjectName objectName = new ObjectName(objectNameStr);
          return objectName;
      }
  
      public static ObjectName createConnectionViewByType(ObjectName connectorName, String type, String name) throws MalformedObjectNameException {
          String objectNameStr = connectorName.toString();
          objectNameStr += ",connectionViewType=" + JMXSupport.encodeObjectNamePart(type);
          objectNameStr += ",connectionName="+ JMXSupport.encodeObjectNamePart(name);
          return new ObjectName(objectNameStr);
      }
  
      public static ObjectName createNetworkBridgeObjectName(ObjectName connectorName, String remoteAddress) throws MalformedObjectNameException {
          Hashtable<String, String> map = new Hashtable<String, String>(connectorName.getKeyPropertyList());
          map.put("networkBridge", JMXSupport.encodeObjectNamePart(remoteAddress));
          return new ObjectName(connectorName.getDomain(), map);
      }
  
      public static ObjectName createNetworkOutBoundDestinationObjectName(ObjectName networkName, ActiveMQDestination destination) throws MalformedObjectNameException {
          String str = networkName.toString();
          str += ",direction=outbound" + createDestinationProperties(destination);
          return new ObjectName(str);
  
      }
  
      public static ObjectName createNetworkInBoundDestinationObjectName(ObjectName networkName, ActiveMQDestination destination) throws MalformedObjectNameException {
          String str = networkName.toString();
          str += ",direction=inbound" + createDestinationProperties(destination);
          return new ObjectName(str);
  
      }
  
  
      public static ObjectName createProxyConnectorName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
          return createProxyConnectorName(brokerObjectName.toString(), type, name);
      }
  
      public static ObjectName createProxyConnectorName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += ",connector=" + type + ",proxyConnectorName="+ JMXSupport.encodeObjectNamePart(name);
          ObjectName objectName = new ObjectName(objectNameStr);
          return objectName;
      }
  
      public static ObjectName createJmsConnectorName(ObjectName brokerObjectName, String type, String name) throws MalformedObjectNameException {
          return createJmsConnectorName(brokerObjectName.toString(), type, name);
      }
  
      public static ObjectName createJmsConnectorName(String brokerObjectName, String type, String name) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += ",connector=" + type + ",jmsConnectors="+ JMXSupport.encodeObjectNamePart(name);
          ObjectName objectName = new ObjectName(objectNameStr);
          return objectName;
      }
  
      public static ObjectName createJobSchedulerServiceName(ObjectName brokerObjectName) throws MalformedObjectNameException {
          return createJobSchedulerServiceName(brokerObjectName.toString());
      }
  
      public static ObjectName createJobSchedulerServiceName(String brokerObjectName) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += ",service=JobScheduler,name=JMS";
          ObjectName objectName = new ObjectName(objectNameStr);
          return objectName;
      }
  
      public static ObjectName createHealthServiceName(ObjectName brokerObjectName) throws MalformedObjectNameException {
          return createHealthServiceName(brokerObjectName.toString());
      }
  
      public static ObjectName createHealthServiceName(String brokerObjectName) throws MalformedObjectNameException {
          String objectNameStr = brokerObjectName;
          objectNameStr += ",service=Health";
          ObjectName objectName = new ObjectName(objectNameStr);
          return objectName;
      }
  
      // MBean Query Creation
  
      public static ObjectName createConnectionQuery(String jmxDomainName, String brokerName, String name) throws MalformedObjectNameException {
          ObjectName brokerMBeanName = createBrokerObjectName(jmxDomainName, brokerName);
          return createConnectionQuery(brokerMBeanName.toString(), name);
      }
  
      public static ObjectName createConnectionQuery(String brokerMBeanName, String name) throws MalformedObjectNameException {
          return new ObjectName(brokerMBeanName + ","
                                + "connector=*," + "connectorName=*," + "connectionViewType=*,"
                                + "connectionName=" + JMXSupport.encodeObjectNamePart(name));
      }
  
      public static ObjectName createQueueQuery(String brokerMBeanName) throws MalformedObjectNameException {
          return createConnectionQuery(brokerMBeanName, "*");
      }
  
      public static ObjectName createQueueQuery(String brokerMBeanName, String destinationName) throws MalformedObjectNameException {
          return new ObjectName(brokerMBeanName + ","
                                + "destinationType=Queue,"
                                + "destinationName=" + JMXSupport.encodeObjectNamePart(destinationName));
      }
  
      public static ObjectName createTopicQuery(String brokerMBeanName) throws MalformedObjectNameException {
          return createConnectionQuery(brokerMBeanName, "*");
      }
  
      public static ObjectName createTopicQuery(String brokerMBeanName, String destinationName) throws MalformedObjectNameException {
          return new ObjectName(brokerMBeanName + ","
                                + "destinationType=Topic,"
                                + "destinationName=" + JMXSupport.encodeObjectNamePart(destinationName));
      }
  
      public static ObjectName createConsumerQueury(String jmxDomainName, String clientId) throws MalformedObjectNameException {
          return createConsumerQueury(jmxDomainName, null, clientId);
      }
  
      public static ObjectName createConsumerQueury(String jmxDomainName, String brokerName, String clientId) throws MalformedObjectNameException {
          return new ObjectName(jmxDomainName + ":type=Broker,brokerName="
                                + (brokerName != null ? brokerName : "*") + ","
                                + "destinationType=*,destinationName=*,"
                                + "endpoint=Consumer,"
                                + "clientId=" + JMXSupport.encodeObjectNamePart(clientId) + ","
                                + "consumerId=*");
      }
  
      public static ObjectName createProducerQueury(String jmxDomainName, String clientId) throws MalformedObjectNameException {
          return createProducerQueury(jmxDomainName, null, clientId);
      }
  
      public static ObjectName createProducerQueury(String jmxDomainName, String brokerName, String clientId) throws MalformedObjectNameException {
          return new ObjectName(jmxDomainName + ":type=Broker,brokerName="
                  + (brokerName != null ? brokerName : "*") + ","
                  + "destinationType=*,destinationName=*,"
                  + "endpoint=Producer,"
                  + "clientId=" + JMXSupport.encodeObjectNamePart(clientId) + ","
                  + "producerId=*");
      }
  
  }
  