View Javadoc

1   package cz.cuni.amis.pogamut.base.utils.logging.jmx;
2   
3   import java.util.Map;
4   import java.util.logging.Level;
5   
6   import javax.management.InstanceAlreadyExistsException;
7   import javax.management.MBeanRegistrationException;
8   import javax.management.MBeanServer;
9   import javax.management.MalformedObjectNameException;
10  import javax.management.NotCompliantMBeanException;
11  import javax.management.ObjectName;
12  
13  
14  import cz.cuni.amis.pogamut.base.utils.exception.PogamutJMXNameException;
15  import cz.cuni.amis.pogamut.base.utils.jmx.PogamutJMX;
16  import cz.cuni.amis.pogamut.base.utils.logging.ILogCategories;
17  import cz.cuni.amis.pogamut.base.utils.logging.LogCategory;
18  import cz.cuni.amis.utils.exception.PogamutException;
19  
20  /**
21   * JMX decorator for ILogCategories. Every new log category will implicitly have 
22   * handler with JMXLogPublisher attached.
23   * 
24   * @author Jimmy
25   */
26  
27  public class JMXLogCategories implements ILogCategories, JMXLogCategoriesMBean {	
28  	
29  	/**
30  	 * Wrapped categories we're decorating.
31  	 */
32  	protected ILogCategories logCategories;
33  	
34  	/**
35  	 * MBean server for the log categories.
36  	 */
37  	protected MBeanServer mBeanServer;
38  	
39      /**
40       * Id of the MBean.
41       */
42      protected ObjectName objectName = null;
43  
44  	/**
45  	 * JMXLogCategories differs from LogCategories by implicit handler with JMXLogPublisher in every 
46  	 * log category it produces.
47  	 * <p><p>
48  	 * Can't be instantiated twice for one (JMX Domain,mBeanServer)!
49  	 * 
50  	 * @param logCategories
51  	 * @param mBeanServer
52  	 * @param parent
53  	 * @throws InstanceAlreadyExistsException raised if instantiated twice for one jmx domain
54  	 * @throws MBeanRegistrationException
55  	 * @throws NotCompliantMBeanException
56  	 * @throws MalformedObjectNameException
57  	 * @throws NullPointerException
58  	 */
59  	public JMXLogCategories(ILogCategories logCategories, MBeanServer mBeanServer, ObjectName parent) throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, MalformedObjectNameException, NullPointerException {
60  		this.logCategories = logCategories;
61  		this.mBeanServer = mBeanServer;
62  		
63          objectName = ObjectName.getInstance(getJMXLogCategoriesName(parent));
64          mBeanServer.registerMBean(this, objectName);
65          for (LogCategory category : getCategories().values()) {
66  			category.addHandler(newJMXLogPublisher(category.getName()));
67  		}		
68  	}
69  	
70  	/**
71  	 * Returns existing category by the name or adds new one.
72  	 * <p><p>
73  	 * Contains handler with JMXLogPublisher attached.
74  	 * <p><p>
75  	 * If you wish to add another handler do:
76  	 * LogCategory myCategory = categories.getCategory("my log"); // create new category
77  	 * myCategory.newHandler(new LogPublisher.ConsolePublisher()); // add new handler with output to the console
78  	 * 
79  	 * @param name
80  	 * @return
81  	 */
82      @Override
83  	public synchronized LogCategory getCategory(String name) {
84  		if (hasCategory(name)) {
85  			return logCategories.getCategory(name);
86  		} else {
87  			// creating new category
88  			LogCategory newCategory = logCategories.getCategory(name);
89  			newCategory.addHandler(newJMXLogPublisher(name));		
90  			return newCategory;
91  		}
92  	}
93  	
94  	private JMXLogPublisher newJMXLogPublisher(String name) {
95          try {
96              ObjectName categoryObjName = ObjectName.getInstance(getJMXLogCategoryName(name));
97              JMXLogPublisher logPublisher = new JMXLogPublisher(categoryObjName, name);
98              mBeanServer.registerMBean(logPublisher, categoryObjName);
99              return logPublisher;
100         } catch (Exception e) {
101         	throw new PogamutException("Can't register JMXLogPublisher with name " + getJMXLogCategoryName(objectName, name) + ".", e, this);
102         }
103 	}
104 
105    	@Override
106 	public Map<String, LogCategory> getCategories() {
107 		return logCategories.getCategories();
108 	}
109 
110 	@Override
111 	public String[] getCategoryNames() {
112 		return logCategories.getCategoryNames();
113 	}
114 
115 	@Override
116 	public String[] getCategoryNamesSorted() {
117 		return logCategories.getCategoryNamesSorted();
118 	}
119 
120 	@Override
121 	public boolean hasCategory(String name) {		
122 		return logCategories.hasCategory(name);
123 	}
124 
125 	@Override
126 	public void setLevel(Level newLevel) {
127 		logCategories.setLevel(newLevel);
128 	}
129 
130 	@Override
131 	public void addLogCategory(String name, LogCategory category) {
132 		logCategories.addLogCategory(name, category);
133 	}
134 	
135 	@Override
136     public ObjectName getJMXLogCategoryName(String categoryName) throws PogamutJMXNameException {
137         return getJMXLogCategoryName(objectName, categoryName);
138     }
139 
140 	public static ObjectName getJMXLogCategoryName(ObjectName parent, String categoryName) throws PogamutJMXNameException {
141         return PogamutJMX.getObjectName(parent, categoryName);
142 	}
143 	
144 	@Override
145 	public ObjectName getJMXLogCategoriesName() {
146 		return objectName;
147 	}
148 	
149 	/**
150      * Gets LogCategories's object name given parent's name.
151      * @param parent
152      * @return
153      */
154     public static ObjectName getJMXLogCategoriesName(ObjectName parent) throws PogamutJMXNameException{
155         return PogamutJMX.getObjectName(parent, PogamutJMX.LOGCATEGORIES_NAME);
156     }
157 
158 }