KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mx4j > tools > remote > resolver > local > Resolver


1 /*
2  * Copyright (C) The MX4J Contributors.
3  * All rights reserved.
4  *
5  * This software is distributed under the terms of the MX4J License version 1.0.
6  * See the terms of the MX4J License in the documentation provided with this software.
7  */

8
9 package mx4j.tools.remote.resolver.local;
10
11 import java.io.IOException JavaDoc;
12 import java.util.HashMap JavaDoc;
13 import java.util.List JavaDoc;
14 import java.util.Map JavaDoc;
15
16 import javax.management.JMException JavaDoc;
17 import javax.management.MBeanServer JavaDoc;
18 import javax.management.MBeanServerFactory JavaDoc;
19 import javax.management.ObjectName JavaDoc;
20 import javax.management.remote.JMXServiceURL JavaDoc;
21
22 import mx4j.remote.ConnectionResolver;
23 import mx4j.tools.remote.local.LocalConnectorServer;
24
25 /**
26  * @version $Revision: 1.1 $
27  */

28 public class Resolver extends ConnectionResolver
29 {
30    private static final String JavaDoc ID_CONTEXT = "/id/";
31    private static int connectorID;
32
33    private final Map JavaDoc mbeanServerIds = new HashMap JavaDoc();
34
35    public Object JavaDoc createServer(JMXServiceURL JavaDoc url, Map JavaDoc environment) throws IOException JavaDoc
36    {
37       String JavaDoc connectorID = findConnectorID(url);
38       if (connectorID == null) return null;
39
40       String JavaDoc mbeanServerId = findMBeanServerId(connectorID);
41       if (mbeanServerId == null) return null;
42
43       List JavaDoc servers = MBeanServerFactory.findMBeanServer(mbeanServerId);
44       if (servers.size() == 1) return servers.get(0);
45       return null;
46    }
47
48    private String JavaDoc findConnectorID(JMXServiceURL JavaDoc url)
49    {
50       String JavaDoc path = url.getURLPath();
51       if (path == null || !path.startsWith(ID_CONTEXT)) return null;
52       return path.substring(ID_CONTEXT.length());
53    }
54
55    private String JavaDoc findMBeanServerId(String JavaDoc connectorID)
56    {
57       synchronized (mbeanServerIds)
58       {
59          return (String JavaDoc)mbeanServerIds.get(connectorID);
60       }
61    }
62
63    public JMXServiceURL JavaDoc bindServer(Object JavaDoc server, JMXServiceURL JavaDoc url, Map JavaDoc environment) throws IOException JavaDoc
64    {
65       String JavaDoc connectorID = findConnectorID(url);
66       if (connectorID == null) connectorID = generateConnectorID();
67
68       MBeanServer JavaDoc mbeanServer = (MBeanServer JavaDoc)server;
69       try
70       {
71          String JavaDoc mbeanServerId = (String JavaDoc)mbeanServer.getAttribute(new ObjectName JavaDoc("JMImplementation:type=MBeanServerDelegate"), "MBeanServerId");
72          synchronized (mbeanServerIds)
73          {
74             String JavaDoc existing = findMBeanServerId(connectorID);
75             if (existing != null && !existing.equals(mbeanServerId)) throw new IOException JavaDoc("LocalConnectorServer with ID " + connectorID + " is already attached to MBeanServer with ID " + existing);
76             mbeanServerIds.put(connectorID, mbeanServerId);
77          }
78       }
79       catch (JMException JavaDoc x)
80       {
81          throw new IOException JavaDoc("Cannot retrieve MBeanServer ID " + x.toString());
82       }
83
84       return new JMXServiceURL JavaDoc(url.getProtocol(), url.getHost(), url.getPort(), ID_CONTEXT + connectorID);
85    }
86
87    private String JavaDoc generateConnectorID()
88    {
89       synchronized (Resolver.class)
90       {
91          return String.valueOf(++connectorID);
92       }
93    }
94
95    public void unbindServer(Object JavaDoc server, JMXServiceURL JavaDoc address, Map JavaDoc environment) throws IOException JavaDoc
96    {
97       String JavaDoc connectorID = findConnectorID(address);
98       if (connectorID == null) throw new IOException JavaDoc("Unknown LocalConnectorServer ID: " + address);
99       synchronized (mbeanServerIds)
100       {
101          mbeanServerIds.remove(connectorID);
102       }
103    }
104
105    public void destroyServer(Object JavaDoc server, JMXServiceURL JavaDoc url, Map JavaDoc environment) throws IOException JavaDoc
106    {
107    }
108
109    public Object JavaDoc lookupClient(JMXServiceURL JavaDoc url, Map JavaDoc environment) throws IOException JavaDoc
110    {
111       return LocalConnectorServer.find(url);
112    }
113
114    public Object JavaDoc bindClient(Object JavaDoc client, Map JavaDoc environment) throws IOException JavaDoc
115    {
116       return client;
117    }
118 }
119
Popular Tags