/** * 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.transport; import java.lang.ref.WeakReference; import java.util.Collections; import java.util.HashSet; import java.util.Set; import javax.management.ObjectName; import org.apache.activemq.broker.jmx.AnnotatedMBean; import org.apache.activemq.broker.jmx.ManagementContext; import org.apache.activemq.util.JMXSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Class implementing the TransportLoggerViewMBean interface. * When an object of this class is created, it registers itself in * the MBeanServer of the management context provided. * When a TransportLogger object is finalized because the Transport Stack * where it resides is no longer in use, the method unregister() will be called. * * @author David Martin Clavo david(dot)martin(dot)clavo(at)gmail.com * * @see TransportLoggerViewMBean */ public class TransportLoggerView implements TransportLoggerViewMBean { private static final Logger log = LoggerFactory.getLogger(TransportLoggerView.class); /** * Set with the TransportLoggerViews objects created. * Used by the methods enableAllTransportLoggers and diablellTransportLoggers. * The method unregister() removes objects from this set. */ private static Set<TransportLoggerView> transportLoggerViews = Collections.synchronizedSet(new HashSet<TransportLoggerView>()); private final WeakReference<TransportLogger> transportLogger; private final String nextTransportName; private final int id; private final ManagementContext managementContext; private final ObjectName name; /** * Constructor. * @param transportLogger The TransportLogger object which is to be managed by this MBean. * @param nextTransportName The name of the next TransportLayer. This is used to give a unique * name for each MBean of the TransportLoggerView class. * @param id The id of the TransportLogger to be watched. * @param managementContext The management context who has the MBeanServer where this MBean will be registered. */ public TransportLoggerView (TransportLogger transportLogger, String nextTransportName, int id, ManagementContext managementContext) { this.transportLogger = new WeakReference<TransportLogger>(transportLogger); this.nextTransportName = nextTransportName; this.id = id; this.managementContext = managementContext; this.name = this.createTransportLoggerObjectName(); TransportLoggerView.transportLoggerViews.add(this); this.register(); } /** * Enable logging for all Transport Loggers at once. */ public static void enableAllTransportLoggers() { for (TransportLoggerView view : transportLoggerViews) { view.enableLogging(); } } /** * Disable logging for all Transport Loggers at once. */ public static void disableAllTransportLoggers() { for (TransportLoggerView view : transportLoggerViews) { view.disableLogging(); } } // doc comment inherited from TransportLoggerViewMBean public void enableLogging() { this.setLogging(true); } // doc comment inherited from TransportLoggerViewMBean public void disableLogging() { this.setLogging(false); } // doc comment inherited from TransportLoggerViewMBean public boolean isLogging() { return transportLogger.get().isLogging(); } // doc comment inherited from TransportLoggerViewMBean public void setLogging(boolean logging) { transportLogger.get().setLogging(logging); } /** * Registers this MBean in the MBeanServer of the management context * provided at creation time. This method is only called by the constructor. */ private void register() { try { AnnotatedMBean.registerMBean(this.managementContext, this, this.name); } catch (Exception e) { log.error("Could not register MBean for TransportLoggerView " + id + "with name " + this.name.toString() + ", reason: " + e, e); } } /** * Unregisters the MBean from the MBeanServer of the management context * provided at creation time. * This method is called by the TransportLogger object being managed when * the TransportLogger object is finalized, to avoid the memory leak that * would be caused if MBeans were not unregistered. */ public void unregister() { TransportLoggerView.transportLoggerViews.remove(this); try { this.managementContext.unregisterMBean(this.name); } catch (Exception e) { log.error("Could not unregister MBean for TransportLoggerView " + id + "with name " + this.name.toString() + ", reason: " + e, e); } } /** * Creates the ObjectName to be used when registering the MBean. * @return the ObjectName to be used when registering the MBean. */ private ObjectName createTransportLoggerObjectName() { try { return new ObjectName( createTransportLoggerObjectNameRoot(this.managementContext) + JMXSupport.encodeObjectNamePart(TransportLogger.class.getSimpleName() + " " + this.id + ";" + this.nextTransportName)); } catch (Exception e) { log.error("Could not create ObjectName for TransportLoggerView " + id + ", reason: " + e, e); return null; } } /** * Creates the part of the ObjectName that will be used by all MBeans. * This method is public so it can be used by the TransportLoggerControl class. * @param managementContext * @return A String with the part of the ObjectName common to all the TransportLoggerView MBeans. */ public static String createTransportLoggerObjectNameRoot(ManagementContext managementContext) { return managementContext.getJmxDomainName()+":"+"Type=TransportLogger,"+"TransportLoggerName="; } }