KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > webjmx > adapter > AdapterFactory


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

8  /*
9  * AdapterMBeanServerFactory.java
10  *
11  * Created on December 20, 2001, 3:10 PM
12  */

13
14 package org.webjmx.adapter;
15
16 import java.io.*;
17 import java.util.*;
18 import javax.management.*;
19 import javax.xml.parsers.*;
20
21 import org.webjmx.tags.JMXTaglibConstants;
22 import org.webjmx.adapter.xml.*;
23
24 //import com.jxml.quick.*;
25
import org.xml.sax.*;
26 import org.w3c.dom.*;
27
28
29 /** This is a source for MBeanServers used by the JMX tags. It can be configured
30  * from an XML file called AdapterFactoryInit.xml
31  *
32  * @author John Aronson
33  */

34 public class AdapterFactory
35     implements JMXTaglibConstants
36  {
37      private static final String JavaDoc PROP_FILE = "/AdapterFactoryInit.xml";
38      //private static final String PROP_SCHEMA = "/AdapterFactoryInit.qjml";
39
private static Map AdapterTypeMap = new HashMap();
40      private static Map AdapterMap = new HashMap();
41      
42      static
43      {
44         //set up the XML parser available in JDK 1.4 if not specified ...
45
if(System.getProperty(PARSER_PROP_NAME) == null)
46             System.setProperty(PARSER_PROP_NAME, "org.apache.xerces.parsers.SAXParser");
47         
48         if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("initalizing AdapterFactory from properties file ...");
49         InputStream in = AdapterFactory.class.getResourceAsStream(PROP_FILE);
50         try
51         {
52             if(in != null && in.available() > 0)
53             {
54
55                 AdapterFactoryInit init = parseDOMTree(in);
56
57                 //process services
58
for(int i = 0; i < init.getServices().size(); i++)
59                 {
60                     try{ init.getService(i).verify(); }
61                     catch(Exception JavaDoc ex)
62                     {
63                         if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("Warning: failed to map service: " +init.getService(i));
64                         continue;
65                     }
66
67                     AdapterTypeMap.put(init.getService(i).getName(), init.getService(i).getClassName());
68                     if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("mapped class [" +init.getService(i).getClassName()
69                         +"] to service name: " +init.getService(i).getName());
70                 }
71
72                 //process Adapters
73
for(int i = 0; i < init.getAdapters().size(); i++)
74                 {
75                     List l = findMBeanServer(init.getAdapter(i).getLocator());
76                     try
77                     {
78                         for(int j = 0; j < l.size() && init.getAdapter(i).isPreload(); j++)
79                              ((JMXServiceAdapter)l.get(j)).connect();
80                     }catch(Exception JavaDoc ex)
81                     {
82                         if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("Warning: failed to map Adapter: " +init.getAdapter(i));
83                         continue;
84                     }
85
86                     AdapterMap.put(init.getAdapter(i).getName(), l);
87                     if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("mapped Adapter locaton [" +init.getAdapter(i).getLocator()
88                         +"] to alias: " +init.getAdapter(i).getName());
89                 }
90             }else
91                 System.out.println("no property file found");
92         }catch(Exception JavaDoc ex)
93         {
94             System.out.println("exception caught while processing properties file: " +ex);
95             ex.printStackTrace();
96         }
97
98         //default mappings
99
if(!AdapterTypeMap.containsKey(SOCKET_SERVICE_NAME))
100             AdapterTypeMap.put(SOCKET_SERVICE_NAME, SOCKET_SERVICE_CLASS);
101         else
102             if(Boolean.getBoolean(DEBUG_PROP)) System.out.println(SOCKET_SERVICE_NAME +" service already mapped.");
103
104      }
105
106      private static AdapterFactoryInit parseDOMTree(InputStream in)
107         throws Exception JavaDoc
108      {
109          AdapterFactoryInit init = new AdapterFactoryInit();
110          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
111          dbf.setNamespaceAware(true);
112          dbf.setIgnoringComments(true);
113          DocumentBuilder db = dbf.newDocumentBuilder();
114          Document doc = db.parse(in);
115          Element root = doc.getDocumentElement();
116          for(int i = 0; i < root.getChildNodes().getLength(); i++)
117          {
118              Node node = root.getChildNodes().item(i);
119              //System.out.println("\nchild node: " +node.getNodeValue());
120
if(node.getNodeName().equals("ServiceMapping"))
121              {
122                  ServiceMapping mapping = new ServiceMapping();
123                  mapping.setName(node.getAttributes().getNamedItem("name").getNodeValue());
124                  mapping.setClassName(node.getAttributes().getNamedItem("class").getNodeValue());
125                  //System.out.println("adding mapping: " +mapping);
126
init.getServices().add(mapping);
127              }else if(node.getNodeName().equals("AdapterMapping"))
128              {
129                  AdapterMapping mapping = new AdapterMapping();
130                  mapping.setName(node.getAttributes().getNamedItem("name").getNodeValue());
131                  mapping.setLocator(node.getAttributes().getNamedItem("locator").getNodeValue());
132                  if(node.getAttributes().getNamedItem("preload") != null)
133                      mapping.setPreload("true".equalsIgnoreCase(node.getAttributes().getNamedItem("preload").getNodeValue()));
134                  //System.out.println("adding mapping: " +mapping);
135
init.getAdapters().add(mapping);
136              }else
137                  System.out.println("Unknown XML element name: " +node.getNodeName());
138          }
139          return init;
140      }
141
142     // agent string format 'Adapter;param1:param2:...'
143
// returns a list MBeanServers
144
static public List findMBeanServer(String JavaDoc locator)
145     {
146         //if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("locator: " +locator);
147
Object JavaDoc o = AdapterMap.get(locator);
148         //if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("cached list: " +o);
149
if(o != null)
150             return (ArrayList)o;
151         
152         if(locator == null)
153             return MBeanServerFactory.findMBeanServer(null);
154         
155         //parse the string
156
StringTokenizer semiTok = new StringTokenizer(locator, ";", true);
157                
158         String JavaDoc AdapterType = semiTok.nextToken();
159         if(AdapterType.equals(";"))
160             AdapterType = null;
161         else if(semiTok.hasMoreTokens())
162             semiTok.nextToken();
163         
164         List parameters = new ArrayList();
165         String JavaDoc params = null;
166         if(semiTok.hasMoreTokens())
167             params = semiTok.nextToken();
168         if(params != null && !params.equals(";"))
169         {
170             //parse the params
171
StringTokenizer colonTok = new StringTokenizer(params, ":");
172             while(colonTok.hasMoreTokens())
173                 parameters.add(colonTok.nextToken());
174             
175             //eat the next semicolon
176
if(semiTok.hasMoreTokens())
177                 semiTok.nextToken();
178         }
179         //if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("service type: " +AdapterType"; parameter list size: " +parameters.size());
180

181         //lookup the Adapter
182
if(AdapterType == null)
183             AdapterType = DEFAULT_SERVICE_NAME;
184         
185         if(AdapterType.equals(DEFAULT_SERVICE_NAME))
186         {
187             String JavaDoc defaultDomain = null;
188             if(parameters.size() > 0)
189                 defaultDomain = (String JavaDoc)parameters.get(0);
190             String JavaDoc agentID = null;
191             if(parameters.size() > 1)
192                 agentID = (String JavaDoc)parameters.get(1);
193             
194             List l = MBeanServerFactory.findMBeanServer(agentID);
195             //if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("MBeanServerFactory result: " +l.size());
196

197             //check for defaultDomain matches
198
for(int i = l.size() -1; defaultDomain != null && i > -1; i--)
199             {
200                 MBeanServer s = (MBeanServer)l.get(i);
201                 if(!s.getDefaultDomain().equals(defaultDomain))
202                     l.remove(i);
203             }
204         
205             //cache the Adapter list in AdapterMap
206
AdapterMap.put(locator, l);
207
208             //if(Boolean.getBoolean(DEBUG_PROP)) System.out.println("returing list size: " +l.size());
209
return l;
210         }
211         
212         Object JavaDoc className = AdapterTypeMap.get(AdapterType);
213         if(className == null)
214             className = AdapterType;
215         Class JavaDoc cls = null;
216
217         try{ cls = Class.forName(className.toString()); }
218         catch(ClassNotFoundException JavaDoc ce)
219         {
220             System.out.println("unknown Adapter type: " +AdapterType);
221             ce.printStackTrace();
222             return null;
223         }
224
225         try{ o = cls.newInstance(); }
226         catch(Exception JavaDoc ex)
227         {
228             System.out.println("problem with Adapter class: " +ex.getClass());
229             ex.printStackTrace();
230             return null;
231         }
232
233         if(!(o instanceof JMXServiceAdapter))
234         {
235             System.out.println("bad Adapter class mapping, Adapter class must implement JMXServiceAdapter: " +o);
236             return null;
237         }
238
239         JMXServiceAdapter Adapter = (JMXServiceAdapter)o;
240         try
241         {
242             Adapter.initialize(parameters);
243             Adapter.connect();
244         }catch(Exception JavaDoc ex)
245         {
246             ex.printStackTrace();
247             return null;
248         }
249                
250         ArrayList list = new ArrayList();
251         list.add(Adapter);
252         
253         //no check for defaultDomain match required
254

255         //cache the Adapter list in AdapterMap
256
AdapterMap.put(locator, list);
257         
258         return list;
259     }
260     
261     public static void main(String JavaDoc args[])
262     {
263         //display the XML parsing results ...
264
System.out.println("Type Map: ");
265         Iterator it = AdapterTypeMap.keySet().iterator();
266         while(it.hasNext())
267         {
268             Object JavaDoc key = it.next();
269             System.out.println("[" +key +"] " +AdapterTypeMap.get(key));
270         }
271         System.out.println("\n\nAdapter Map: ");
272         it = AdapterMap.keySet().iterator();
273         while(it.hasNext())
274         {
275             Object JavaDoc key = it.next();
276             System.out.println("[" +key +"] " +AdapterMap.get(key));
277         }
278     }
279 }
280
Popular Tags