KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > core > plugin > ExtensionXMLParser


1 package org.columba.core.plugin;
2
3 import java.io.IOException JavaDoc;
4 import java.io.InputStream JavaDoc;
5 import java.util.Enumeration JavaDoc;
6 import java.util.Hashtable JavaDoc;
7 import java.util.Iterator JavaDoc;
8 import java.util.List JavaDoc;
9 import java.util.Map JavaDoc;
10 import java.util.Vector JavaDoc;
11
12 import org.columba.api.plugin.ExtensionHandlerMetadata;
13 import org.columba.api.plugin.ExtensionMetadata;
14 import org.columba.api.plugin.PluginMetadata;
15 import org.jdom.Attribute;
16 import org.jdom.Document;
17 import org.jdom.Element;
18 import org.jdom.JDOMException;
19 import org.jdom.input.SAXBuilder;
20
21 /**
22  * Convenience methods for parsing the various xml-file resources.
23  *
24  * @author Frederik Dietzs
25  */

26 public class ExtensionXMLParser {
27
28     private static final String JavaDoc XML_ELEMENT_EXTENSION = "extension";
29
30     private static final String JavaDoc XML_ELEMENT_EXTENSIONLIST = "extensionlist";
31
32     private static final String JavaDoc XML_ATTRIBUTE_DESCRIPTION = "description";
33
34     private static final String JavaDoc XML_ATTRIBUTE_CATEGORY = "category";
35
36     private static final String JavaDoc XML_ATTRIBUTE_VERSION = "version";
37
38     private static final String JavaDoc XML_ATTRIBUTE_NAME = "name";
39
40     private static final String JavaDoc XML_ELEMENT_HANDLERLIST = "handlerlist";
41
42     private static final String JavaDoc XML_ATTRIBUTE_SINGLETON = "singleton";
43
44     private static final String JavaDoc XML_ATTRIBUTE_ENABLED = "enabled";
45
46     private static final String JavaDoc XML_ATTRIBUTE_CLASS = "class";
47
48     private static final String JavaDoc XML_ATTRIBUTE_PARENT = "parent";
49
50     private static final String JavaDoc XML_ATTRIBUTE_ID = "id";
51
52     private static final String JavaDoc XML_ELEMENT_PROPERTIES = "properties";
53
54     private static final java.util.logging.Logger JavaDoc LOG = java.util.logging.Logger
55             .getLogger("org.columba.core.plugin");
56
57     /**
58      * Parse IExtension enumeration metadata from xml file.
59      *
60      * @param is
61      * inputstream of xml extension file
62      * @param pluginMetadata
63      * can be <code>null</code>, in case of internal plugin
64      * @param internal
65      * true, if internal, False, otherwise.
66      * @return enumeration of <code>Extension</code>
67      */

68     public Enumeration JavaDoc loadExtensionsFromStream(InputStream JavaDoc is,
69             PluginMetadata pluginMetadata, boolean internal) {
70         Vector JavaDoc<Extension> vector = new Vector JavaDoc<Extension>();
71
72         Document doc = retrieveDocument(is);
73
74         Element parent = doc.getRootElement();
75     
76         if (parent == null || !parent.getName().equals(XML_ELEMENT_EXTENSIONLIST)) {
77             LOG.severe("missing <extensionlist> element");
78             return null;
79         }
80
81         Iterator JavaDoc iterator = parent.getChildren().listIterator();
82         Element extensionXmlElement;
83
84         while (iterator.hasNext()) {
85             extensionXmlElement = (Element) iterator.next();
86
87             ExtensionMetadata metadata = parseExtensionMetadata(extensionXmlElement);
88
89             if (internal == true)
90                 vector.add(new Extension(metadata, internal));
91             else
92                 vector.add(new Extension(pluginMetadata, metadata));
93
94         }
95
96         return vector.elements();
97     }
98
99     /**
100      * Parse extension metadata.
101      *
102      * @param extensionXmlElement
103      * @return
104      */

105     public ExtensionMetadata parseExtensionMetadata(
106             Element extensionXmlElement) {
107         String JavaDoc id = extensionXmlElement.getAttributeValue(XML_ATTRIBUTE_ID);
108         if (id == null) {
109             LOG.severe("missing attribute \"id\"");
110             return null;
111         }
112
113         String JavaDoc clazz = extensionXmlElement.getAttributeValue("class");
114         if (clazz == null) {
115             LOG.severe("missing attribute \"class\"");
116             return null;
117         }
118
119         String JavaDoc enabledString = extensionXmlElement
120                 .getAttributeValue(XML_ATTRIBUTE_ENABLED);
121         String JavaDoc singletonString = extensionXmlElement
122                 .getAttributeValue(XML_ATTRIBUTE_SINGLETON);
123
124         Element attributesElement = extensionXmlElement
125                 .getChild(XML_ELEMENT_PROPERTIES);
126         Map JavaDoc<String JavaDoc, String JavaDoc> attributes = new Hashtable JavaDoc<String JavaDoc, String JavaDoc>();
127         if (attributesElement != null) {
128             List JavaDoc list = attributesElement.getAttributes();
129             for (int i=0; i<list.size(); i++) {
130                 Attribute a = (Attribute) list.get(i);
131                 attributes.put(a.getName(), a.getValue());
132             }
133         }
134
135         ExtensionMetadata metadata = null;
136         if (attributes != null)
137             metadata = new ExtensionMetadata(id, clazz, attributes);
138         else
139             metadata = new ExtensionMetadata(id, clazz);
140
141         if (enabledString != null)
142             metadata.setEnabled(new Boolean JavaDoc(enabledString).booleanValue());
143
144         if (singletonString != null)
145             metadata.setSingleton(new Boolean JavaDoc(singletonString).booleanValue());
146
147         return metadata;
148     }
149
150     /**
151      * Parse plugin metadata.
152      *
153      * @param pluginElement
154      * @return
155      */

156     public PluginMetadata parsePluginMetadata(Element pluginElement) {
157
158         String JavaDoc id = pluginElement.getAttributeValue(XML_ATTRIBUTE_ID);
159         String JavaDoc name = pluginElement.getAttributeValue(XML_ATTRIBUTE_NAME);
160         String JavaDoc version = pluginElement.getAttributeValue(XML_ATTRIBUTE_VERSION);
161         String JavaDoc enabled = pluginElement.getAttributeValue(XML_ATTRIBUTE_ENABLED);
162         String JavaDoc category = pluginElement.getAttributeValue(XML_ATTRIBUTE_CATEGORY);
163         String JavaDoc description = pluginElement
164                 .getAttributeValue(XML_ATTRIBUTE_DESCRIPTION);
165
166         PluginMetadata pluginMetadata = new PluginMetadata(id, name,
167                 description, version, category, new Boolean JavaDoc(enabled)
168                         .booleanValue());
169
170         return pluginMetadata;
171     }
172
173     /**
174      * @param vector
175      * @param xmlFile
176      * @return
177      */

178     public Enumeration JavaDoc<ExtensionHandlerMetadata> parseExtensionHandlerList(
179             InputStream JavaDoc is) {
180         Vector JavaDoc<ExtensionHandlerMetadata> vector = new Vector JavaDoc<ExtensionHandlerMetadata>();
181
182         Document doc = retrieveDocument(is);
183         
184         Element list = doc.getRootElement();
185         if (list == null || !list.getName().equals(XML_ELEMENT_HANDLERLIST)) {
186             LOG.severe("element <handlerlist> expected.");
187             return vector.elements();
188         }
189
190         Iterator JavaDoc it = list.getChildren().listIterator();
191         while (it.hasNext()) {
192             Element child = (Element) it.next();
193             // skip non-matching elements
194
if (child.getName().equals("handler") == false)
195                 continue;
196             String JavaDoc id = child.getAttributeValue(XML_ATTRIBUTE_ID);
197             String JavaDoc parent = child.getAttributeValue(XML_ATTRIBUTE_PARENT);
198
199             ExtensionHandlerMetadata metadata = new ExtensionHandlerMetadata(
200                     id, parent);
201
202             vector.add(metadata);
203         }
204
205         return vector.elements();
206     }
207
208     /**
209      * "plugin.xml" file parse.
210      *
211      * @param is inputstream of "plugin.xml" file
212      * @param hashtable
213      * hashtable will be filled with Vector of all extensions
214      * @return plugin metadata
215      */

216     public PluginMetadata parsePlugin(InputStream JavaDoc is, Hashtable JavaDoc hashtable) {
217         Document doc = retrieveDocument(is);
218
219         Element pluginElement = doc.getRootElement();
220
221         PluginMetadata pluginMetadata = new ExtensionXMLParser()
222                 .parsePluginMetadata(pluginElement);
223
224         // loop through all extensions this plugin uses
225
Iterator JavaDoc it = pluginElement.getChildren().listIterator();
226         while (it.hasNext() ) {
227             Element extensionListXmlElement = (Element) it.next();
228             
229             // skip if no <extensionlist> element found
230
if (extensionListXmlElement.getName().equals(
231                     XML_ELEMENT_EXTENSIONLIST) == false)
232                 continue;
233
234             String JavaDoc extensionpointId = extensionListXmlElement
235                     .getAttributeValue(XML_ATTRIBUTE_ID);
236             if (extensionpointId == null) {
237                 LOG.severe("missing extension point id attribute");
238                 continue;
239             }
240
241             Vector JavaDoc<ExtensionMetadata> vector = new Vector JavaDoc<ExtensionMetadata>();
242
243             Iterator JavaDoc it2 = extensionListXmlElement.getChildren().listIterator();
244             while (it2.hasNext() ) {
245                 Element extensionXmlElement = (Element) it2.next();
246
247                 // skip if no <extension> element found
248
if (extensionXmlElement.getName().equals(XML_ELEMENT_EXTENSION) == false)
249                     continue;
250
251                 ExtensionMetadata extensionMetadata = new ExtensionXMLParser()
252                         .parseExtensionMetadata(extensionXmlElement);
253
254                 vector.add(extensionMetadata);
255
256             }
257
258             hashtable.put(extensionpointId, vector);
259         }
260
261         return pluginMetadata;
262     }
263     
264     
265     // retrieve JDom Document from inputstream
266
private static Document retrieveDocument(InputStream JavaDoc is) {
267         SAXBuilder builder = new SAXBuilder();
268         builder.setIgnoringElementContentWhitespace(true);
269         Document doc = null;
270         try {
271             doc = builder.build(is);
272         } catch (JDOMException e) {
273             LOG.severe(e.getMessage());
274             e.printStackTrace();
275         } catch (IOException JavaDoc e) {
276             LOG.severe(e.getMessage());
277             e.printStackTrace();
278         }
279         return doc;
280     }
281 }
282
Popular Tags