Package org.apache.geronimo.activemq.management

Source Code of org.apache.geronimo.activemq.management.ActiveMQManagerGBean

/**
*   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.geronimo.activemq.management;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.activemq.broker.TransportConnector;
import org.apache.geronimo.activemq.ActiveMQBroker;
import org.apache.geronimo.activemq.ActiveMQManager;
import org.apache.geronimo.activemq.BrokerServiceGBean;
import org.apache.geronimo.gbean.AbstractName;
import org.apache.geronimo.gbean.AbstractNameQuery;
import org.apache.geronimo.gbean.GBeanData;
import org.apache.geronimo.gbean.annotation.GBean;
import org.apache.geronimo.gbean.annotation.ParamSpecial;
import org.apache.geronimo.gbean.annotation.SpecialAttributeType;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.KernelException;
import org.apache.geronimo.kernel.config.ConfigurationUtil;
import org.apache.geronimo.kernel.config.EditableConfigurationManager;
import org.apache.geronimo.kernel.config.InvalidConfigException;
import org.apache.geronimo.management.geronimo.JMSBroker;
import org.apache.geronimo.management.geronimo.JMSConnector;
import org.apache.geronimo.management.geronimo.NetworkConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Implementation of the ActiveMQ management interface.  These are the ActiveMQ
* management features available at runtime.
*
* @version $Rev: 736391 $ $Date: 2009-01-21 11:47:28 -0800 (Wed, 21 Jan 2009) $
*/
@GBean
public class ActiveMQManagerGBean implements ActiveMQManager {
    private static final Logger log = LoggerFactory.getLogger(ActiveMQManagerGBean.class);
    private Kernel kernel;
    private String objectName;

    public ActiveMQManagerGBean(@ParamSpecial(type= SpecialAttributeType.kernel) Kernel kernel,
                                @ParamSpecial(type = SpecialAttributeType.objectName) String objectName) {
        this.kernel = kernel;
        this.objectName = objectName;
    }

    public String getProductName() {
        return "ActiveMQ";
    }

    public String getObjectName() {
        return objectName;
    }

    public boolean isEventProvider() {
        return false;
    }

    public boolean isStateManageable() {
        return true;
    }

    public boolean isStatisticsProvider() {
        return false;
    }
   
    /*
     * Only running JMS brokers are returned.
     */
    public Object[] getContainers() {
        AbstractNameQuery query = new AbstractNameQuery(ActiveMQBroker.class.getName());
        Set<AbstractName> names = kernel.listGBeans(query);
        List<ActiveMQBroker> results = new ArrayList<ActiveMQBroker>(names.size());
        for (AbstractName name : names) {
            try {
                if (kernel.isRunning(name)) {
                    results.add((ActiveMQBroker)kernel.getGBean(name));
                }
            } catch (GBeanNotFoundException e) {
                log.info("broker not found", e);
            }
        }
        return results.toArray(new ActiveMQBroker[]{});
    }

    public String[] getSupportedProtocols() {
        // see files in modules/core/src/conf/META-INF/services/org/activemq/transport/server/
        //TODO No sure how to list the files in the classpath, temporary hard coded the supported protocols in the code
        return new String[] { "tcp", "stomp", "vm", "peer", "udp", "multicast", "failover", "stomp+ssl", "nio", "mock",
                "fanout", "discovery" };
    }

    public NetworkConnector[] getConnectors() {
        List<NetworkConnector> connectors = getConnectorsList();
        return connectors.toArray(new NetworkConnector[] {});
    }

    private List<NetworkConnector> getConnectorsList() {
        List<NetworkConnector> connectors = new ArrayList<NetworkConnector>();
        ActiveMQBroker[] brokers = (ActiveMQBroker[]) getContainers();
        for (ActiveMQBroker broker: brokers) {
            connectors.addAll(getConnectorListForContainer((BrokerServiceGBean) broker));
        }
        return connectors;
    }

    public NetworkConnector[] getConnectors(String protocol) {
        if(protocol == null) {
            return getConnectors();
        }
        List<NetworkConnector> connectors = getConnectorsList();
        filterConnectorsByProtocol(protocol, connectors);
        return connectors.toArray(new NetworkConnector[] {});
    }

    private void filterConnectorsByProtocol(String protocol, List<NetworkConnector> connectors) {
        for (Iterator<NetworkConnector> connectorIterator = connectors.iterator(); connectorIterator.hasNext();) {
            if (!protocol.equals(connectorIterator.next().getProtocol())) {
                connectorIterator.remove();
            }
        }
    }

    public NetworkConnector[] getConnectorsForContainer(Object genericBroker) {

        return getConnectorListForContainer((BrokerServiceGBean) genericBroker).toArray(new NetworkConnector[] {});
    }

    private List<NetworkConnector> getConnectorListForContainer(BrokerServiceGBean broker) {
        List<TransportConnector> transportConnectors = broker.getBrokerContainer().getTransportConnectors();
        List<NetworkConnector> connectors = new ArrayList<NetworkConnector>();
        for (TransportConnector transportConnector: transportConnectors) {
            connectors.add(new ActiveMQTransportConnector(transportConnector));
        }
        return connectors;
    }

    public NetworkConnector[] getConnectorsForContainer(Object broker, String protocol) {
        if(protocol == null) {
            return getConnectorsForContainer(broker);
        }
        List<NetworkConnector> connectors = getConnectorListForContainer((BrokerServiceGBean) broker);
        filterConnectorsByProtocol(protocol, connectors);
        return connectors.toArray(new NetworkConnector[] {});
    }

    /**
     * Returns a new JMSConnector.  Note that
     * the connector may well require further customization before being fully
     * functional (e.g. SSL settings for a secure connector).
     */
    public JMSConnector addConnector(JMSBroker broker, String uniqueName, String protocol, String host, int port) {
        throw new RuntimeException("not implemented");
    }

    public void removeConnector(AbstractName connectorName) {
        throw new RuntimeException("not implemented");
   }
   
    public JMSBroker addBroker(String brokerName, GBeanData brokerGBeanData) throws KernelException,
            InvalidConfigException {
        EditableConfigurationManager mgr = ConfigurationUtil.getEditableConfigurationManager(kernel);
        if (mgr != null) {
            AbstractName brokerAbstractName = null;
            try {
                mgr.addGBeanToConfiguration(kernel.getAbstractNameFor(this).getArtifact(), brokerGBeanData, false);
                brokerAbstractName = brokerGBeanData.getAbstractName();
                return (JMSBroker) kernel.getProxyManager().createProxy(brokerAbstractName,
                        ActiveMQBroker.class.getClassLoader());
            } catch (InvalidConfigException e) {
                log.error("Unable to add ActiveMQ broker [" + brokerName + "]", e);
                throw e;
            } finally {
                ConfigurationUtil.releaseConfigurationManager(kernel, mgr);
            }
        } else {
            log.warn("The ConfigurationManager in the kernel does not allow editing");
            return null;
        }
    }

    public void removeBroker(AbstractName brokerAbstractName) throws KernelException, InvalidConfigException {
        EditableConfigurationManager mgr = ConfigurationUtil.getEditableConfigurationManager(kernel);
        if (mgr != null) {
            try {
                mgr.removeGBeanFromConfiguration(brokerAbstractName.getArtifact(), brokerAbstractName);
            } catch (InvalidConfigException e) {
                log.error("Unable to remove ActiveMQ broker [" + brokerAbstractName + "]", e);
                throw e;
            } catch (GBeanNotFoundException e) {
                log.error("Fail to get ActiveMQ broker from kernel [" + brokerAbstractName + "]");
                throw e;
            } finally {
                ConfigurationUtil.releaseConfigurationManager(kernel, mgr);
            }
        } else {
            log.warn("The ConfigurationManager in the kernel does not allow editing");
        }
    }
}
TOP

Related Classes of org.apache.geronimo.activemq.management.ActiveMQManagerGBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.