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
22
23
24
25
26
27 public class JMXLogCategories implements ILogCategories, JMXLogCategoriesMBean {
28
29
30
31
32 protected ILogCategories logCategories;
33
34
35
36
37 protected MBeanServer mBeanServer;
38
39
40
41
42 protected ObjectName objectName = null;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
72
73
74
75
76
77
78
79
80
81
82 @Override
83 public synchronized LogCategory getCategory(String name) {
84 if (hasCategory(name)) {
85 return logCategories.getCategory(name);
86 } else {
87
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
151
152
153
154 public static ObjectName getJMXLogCategoriesName(ObjectName parent) throws PogamutJMXNameException{
155 return PogamutJMX.getObjectName(parent, PogamutJMX.LOGCATEGORIES_NAME);
156 }
157
158 }