KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > panoptes > component > jmx > model > MBeanServerNode


1 package net.sf.panoptes.component.jmx.model;
2
3 import java.io.IOException JavaDoc;
4 import java.rmi.ConnectException JavaDoc;
5 import java.util.ArrayList JavaDoc;
6 import java.util.Collection JavaDoc;
7 import java.util.HashMap JavaDoc;
8 import java.util.HashSet JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11 import java.util.Map JavaDoc;
12 import java.util.Properties JavaDoc;
13 import java.util.Set JavaDoc;
14
15 import javax.management.InstanceNotFoundException JavaDoc;
16 import javax.management.IntrospectionException JavaDoc;
17 import javax.management.MBeanServerConnection JavaDoc;
18 import javax.management.Notification JavaDoc;
19 import javax.management.NotificationListener JavaDoc;
20 import javax.management.ObjectName JavaDoc;
21 import javax.management.QueryExp JavaDoc;
22 import javax.management.ReflectionException JavaDoc;
23
24 import net.sf.panoptes.component.jmx.connector.MBeanServerConnector;
25 import net.sf.panoptes.model.node.GroupNode;
26 import net.sf.panoptes.model.node.Node;
27 import net.sf.panoptes.model.node.NodeDescriptor;
28 import net.sf.panoptes.model.node.NodeSupport;
29 import net.sf.panoptes.swing.Operation;
30 import net.sf.panoptes.swing.OperationFactory;
31
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34
35 /**
36  * MBeanServerComponent.java
37  *
38  * Wraps a <code>MBeanServerConnection</code>. No uniform way to identify or
39  * id such connections exist since there are various connector types and
40  * protocols, but to give earch connection a <code>ComponentName</code>, we
41  * require a hostname and a id for each component. These two combined must be
42  * unique. It would be possible to generate a unique ID (e.g and GUID) instead,
43  * but this would break the possibility to store configuration settings for a
44  * specific MBeanServer from session to session.
45  *
46  * All domains and MBeans that belongs to a MBeanServer will inherit the
47  * attributes identifying the server instance so that domains and MBeans can be
48  * queried. (This class is really just a <code>ComponentQuery</code> that
49  * returns all domains matching the server's attribtues).
50  *
51  * @author Dag Liodden
52  * @version 0.1
53  * @jmx.mbean
54  */

55 public class MBeanServerNode
56     extends GroupNode
57     implements NotificationListener JavaDoc, MBeanServerNodeMBean {
58
59     private String JavaDoc id;
60     private String JavaDoc hostName;
61     private MBeanServerConnection JavaDoc serverConnection = null;
62     private HashMap JavaDoc mBeans = new HashMap JavaDoc();
63     private Map JavaDoc domains = new HashMap JavaDoc();
64     private MBeanServerConnector connector;
65     private Log log = LogFactory.getLog(getClass());
66     private GroupNode viewGroup;
67
68     public static final String JavaDoc MBEANSERVERNODE_KEY = "serverNode";
69     private Properties JavaDoc connectionProperties;
70
71     /**
72      * Constructor for MBeanServerComponent.
73      */

74     public MBeanServerNode(NodeSupport parent, MBeanServerConnector connector) {
75         super(parent);
76         this.connector = connector;
77         getConfigDescriptor().setIconName(Node.ICON_SERVER);
78         getContext().put(MBEANSERVERNODE_KEY, this);
79         viewGroup = new GroupNode(this, "Views", "Attached views");
80     }
81
82     /**
83      *
84      * @jmx.managed-attribute
85      */

86     public MBeanServerConnector getConnector() {
87         return connector;
88     }
89     
90     public void setProperties(Properties JavaDoc properties) {
91         this.connectionProperties = properties;
92     }
93     
94
95     /**
96      *
97      * @jmx.managed-operation
98      */

99     public void startListening() {
100         try {
101             serverConnection.addNotificationListener(
102                 new ObjectName JavaDoc("JMImplementation:type=MBeanServerDelegate"),
103                 this,
104                 null,
105                 new Object JavaDoc());
106         } catch (Exception JavaDoc e) {
107             log.error("Unable add listener. Notifications will not be received.", e);
108         }
109     }
110
111     /**
112      *
113      * @jmx.managed-operation
114      */

115     public void connect() throws Exception JavaDoc {
116         Operation connectOp =
117             OperationFactory.getFactory().createOperation("Connecting to JMX Server");
118         connectOp.setIndefinite(true);
119         try {
120             connectOp.newTask("Establishing connection");
121             setServer(connector.createConnection(connectionProperties));
122             connectOp.newTask("Registeringing with MBeanDelegate");
123             startListening();
124             connectOp.newTask("Loading MBeans and Domains");
125             initDomains();
126             OperationFactory.getFactory().createStatusMessage("Connected to JMX Server");
127         } finally {
128             connectOp.operationFinished();
129         }
130     }
131
132     protected void setServer(MBeanServerConnection JavaDoc connection) {
133         this.serverConnection = connection;
134     }
135
136     /**
137      * Returns the host.
138      *
139      * @return String @jmx.managed-attribute
140      */

141     public String JavaDoc getHostName() {
142         return hostName;
143     }
144
145     /**
146      * Returns the id.
147      *
148      * @return String @jmx.managed-attribute
149      */

150     public String JavaDoc getId() {
151         return id;
152     }
153
154     /**
155      * Sets the host.
156      *
157      * @param host
158      * The host to set @jmx.managed-attribute
159      */

160     public void setHostName(String JavaDoc host) {
161         this.hostName = host;
162     }
163
164     /**
165      * Sets the id.
166      *
167      * @param id
168      * The id to set @jmx.managed-attribute
169      */

170     public void setId(String JavaDoc name) {
171         this.id = name;
172     }
173
174     /**
175      * Returns the server.
176      *
177      * @return MBeanServerConnection @jmx.managed-attribute
178      */

179     public MBeanServerConnection JavaDoc getServerConnection() {
180         return serverConnection;
181     }
182
183     private void addPossibleDomain(ObjectName JavaDoc objectName) throws Exception JavaDoc {
184         DomainNode domain;
185         String JavaDoc domainName = objectName.getDomain();
186         if (!domains.containsKey(domainName)) {
187
188             // Create the domain component
189
domain = new DomainNode(this, domainName, this);
190
191             // Cache it
192
domains.put(domainName, domain);
193         }
194     }
195
196     public void refresh() {
197     }
198
199     /**
200      * @see com.gllt.troodon.console.NodeSupport#getConfigDescriptor()
201      * @jmx.managed-attribute
202      */

203     public NodeDescriptor getConfigDescriptor() {
204         return new NodeDescriptor(
205             id,
206             "Connection to " + getHostName() + " on host " + getHostName(),
207             Node.ICON_SERVER);
208     }
209
210     public void handleNotification(Notification JavaDoc n, Object JavaDoc handback) {
211         log.info("Notification received: " + n.toString());
212     }
213
214     private void removeMBean(ObjectName JavaDoc objectName) {
215         mBeans.remove(objectName);
216     }
217
218     /*
219      * (non-Javadoc)
220      *
221      * @see net.sf.panoptes.model.node.NodeSupport#getChildren()
222      */

223     public List JavaDoc getChildren() {
224         List JavaDoc l = new ArrayList JavaDoc();
225         l.addAll(super.getChildren());
226         l.addAll(getDomains());
227         l.add(viewGroup);
228         return l;
229     }
230
231     /**
232      * @return @jmx.managed-operation
233      */

234     private void initDomains() {
235         try {
236             Set JavaDoc s = serverConnection.queryNames(new ObjectName JavaDoc("*:*"), null);
237             Iterator JavaDoc it = s.iterator();
238             int i = 0;
239             while (it.hasNext()) {
240                 ObjectName JavaDoc objectName = (ObjectName JavaDoc) it.next();
241                 addPossibleDomain(objectName);
242             }
243         } catch (Exception JavaDoc e) {
244             e.printStackTrace();
245         }
246     }
247
248     public Collection JavaDoc getDomains() {
249         return domains.values();
250     }
251
252     public int hashCode() {
253         return getId().hashCode();
254     }
255
256     public String JavaDoc toString() {
257         return "(MBeanServerNode) host=" + getHostName() + ", id=" + getId();
258     }
259
260     /**
261      *
262      * @jmx.managed-operation
263      */

264     public void disconnect() throws Exception JavaDoc {
265         for (Iterator JavaDoc i = mBeans.keySet().iterator(); i.hasNext();) {
266             removeMBean((ObjectName JavaDoc) i.next());
267         }
268         getConnector().disconnect(serverConnection);
269     }
270
271     public Collection JavaDoc queryMBeans(
272         ObjectName JavaDoc name,
273         QueryExp JavaDoc query,
274         Node parent,
275         NodeFactory linkFactory)
276         throws InstanceNotFoundException JavaDoc, IntrospectionException JavaDoc, ReflectionException JavaDoc, IOException JavaDoc {
277         try {
278             if (!name.isPattern() && query == null) {
279                 ArrayList JavaDoc a = new ArrayList JavaDoc();
280                 a.add(linkFactory.createNode(parent, name));
281             }
282
283             MBeanServerConnection JavaDoc conn = getServerConnection();
284             Set JavaDoc s = conn.queryNames(name, query);
285
286             Set JavaDoc mbeanNodes = new HashSet JavaDoc(s.size());
287
288             for (Iterator JavaDoc i2 = s.iterator(); i2.hasNext();) {
289                 ObjectName JavaDoc on = (ObjectName JavaDoc) i2.next();
290                 mbeanNodes.add(linkFactory.createNode(parent, on));
291             }
292             Collection JavaDoc c;
293             return mbeanNodes;
294         } catch (ConnectException JavaDoc e) {
295             log.info("Server disconnected");
296             try {
297                 disconnect();
298             } catch (Exception JavaDoc e1) {
299             }
300             throw e;
301         }
302
303     }
304
305     /**
306      * @param name
307      * @param query
308      * @return @jmx.managed-operation
309      */

310     public Collection JavaDoc queryMBeans(ObjectName JavaDoc name, QueryExp JavaDoc query)
311         throws InstanceNotFoundException JavaDoc, IntrospectionException JavaDoc, ReflectionException JavaDoc, IOException JavaDoc {
312
313         if (!name.isPattern() && query == null) {
314             ArrayList JavaDoc a = new ArrayList JavaDoc();
315             a.add(getCachedMBean(name));
316         }
317
318         MBeanServerConnection JavaDoc conn = getServerConnection();
319         /*
320          * try { throw new Exception(); } catch (Exception e) {
321          * log.info("Query", e);
322          */

323         Set JavaDoc s = conn.queryNames(name, query);
324
325         Set JavaDoc mbeanNodes = new HashSet JavaDoc(s.size());
326
327         for (Iterator JavaDoc i2 = s.iterator(); i2.hasNext();) {
328             ObjectName JavaDoc on = (ObjectName JavaDoc) i2.next();
329             mbeanNodes.add(getCachedMBean(on));
330         }
331         Collection JavaDoc c;
332         return mbeanNodes;
333     }
334
335     public Set JavaDoc queryNames(ObjectName JavaDoc name, QueryExp JavaDoc query) throws IOException JavaDoc {
336         return serverConnection.queryNames(name, query);
337     }
338
339     /**
340      * @param name
341      * @param query
342      * @return @jmx.managed-operation
343      */

344     public Collection JavaDoc queryMBeans(ObjectName JavaDoc name)
345         throws InstanceNotFoundException JavaDoc, IntrospectionException JavaDoc, ReflectionException JavaDoc, IOException JavaDoc {
346         return queryMBeans(name, null);
347     }
348
349     /**
350      *
351      * @jmx.managed-operation
352      */

353     public MBeanWrapper getMBean(ObjectName JavaDoc name)
354         throws InstanceNotFoundException JavaDoc, IntrospectionException JavaDoc, ReflectionException JavaDoc, IOException JavaDoc {
355         return getCachedMBean(name);
356     }
357
358     private synchronized MBeanWrapper getCachedMBean(ObjectName JavaDoc name)
359         throws InstanceNotFoundException JavaDoc, IntrospectionException JavaDoc, ReflectionException JavaDoc, IOException JavaDoc {
360         if (!mBeans.containsKey(name)) {
361             mBeans.put(name, new MBeanWrapper(this, name));
362         }
363         return (MBeanWrapper) mBeans.get(name);
364     }
365
366 }
367
Popular Tags