View Javadoc

1   package ch.qos.logback.classic.joran.action;
2   
3   import java.lang.management.ManagementFactory;
4   
5   import javax.management.MBeanServer;
6   import javax.management.ObjectName;
7   
8   import org.xml.sax.Attributes;
9   
10  import ch.qos.logback.classic.LoggerContext;
11  import ch.qos.logback.classic.jmx.JMXConfigurator;
12  import ch.qos.logback.classic.jmx.MBeanUtil;
13  import ch.qos.logback.core.joran.action.Action;
14  import ch.qos.logback.core.joran.spi.ActionException;
15  import ch.qos.logback.core.joran.spi.InterpretationContext;
16  import ch.qos.logback.core.util.OptionHelper;
17  
18  public class JMXConfiguratorAction extends Action {
19  
20    static final String OBJECT_NAME_ATTRIBUTE_NAME = "objectName";
21    static final String CONTEXT_NAME_ATTRIBUTE_NAME = "contextName";
22    static final char JMX_NAME_SEPARATOR = ',';
23    
24    @Override
25    public void begin(InterpretationContext ec, String name, Attributes attributes)
26        throws ActionException {
27      addInfo("begin");
28  
29  
30      String contextName = context.getName();
31      String contextNameAttributeVal = attributes
32      .getValue(CONTEXT_NAME_ATTRIBUTE_NAME);
33      if(!OptionHelper.isEmpty(contextNameAttributeVal)) {
34        contextName = contextNameAttributeVal;
35      }
36  
37      String objectNameAsStr;
38      String objectNameAttributeVal = attributes
39          .getValue(OBJECT_NAME_ATTRIBUTE_NAME);
40      if (OptionHelper.isEmpty(objectNameAttributeVal)) {
41        objectNameAsStr = MBeanUtil.getObjectNameFor(contextName,
42            JMXConfigurator.class);
43      } else {
44        objectNameAsStr = objectNameAttributeVal;
45      }
46  
47      ObjectName objectName = MBeanUtil.string2ObjectName(context, this,
48          objectNameAsStr);
49      if (objectName == null) {
50        addError("Failed to for ObjectName for ["+objectNameAsStr+"]");
51        return;
52      }
53      
54      MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
55      if(!MBeanUtil.isRegistered(mbs, objectName)) {
56        // register only of the named JMXConfigurator has not been previously
57        // registered. Unregistering an MBean within invocation of itself
58        // caused jconsole to throw an NPE. (This occurs when the reload* method
59        // unregisters the 
60        JMXConfigurator jmxConfigurator = new JMXConfigurator((LoggerContext) context, mbs,
61            objectName);
62        try {     
63          mbs.registerMBean(jmxConfigurator, objectName);
64        } catch (Exception e) {
65          addError("Failed to create mbean", e);
66        }
67      }
68  
69    }
70  
71    @Override
72    public void end(InterpretationContext ec, String name) throws ActionException {
73  
74    }
75  
76  }