1 package org.columba.core.plugin; 2 3 import java.io.IOException ; 4 import java.io.InputStream ; 5 import java.util.Enumeration ; 6 import java.util.Hashtable ; 7 import java.util.Iterator ; 8 import java.util.List ; 9 import java.util.Map ; 10 import java.util.Vector ; 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 26 public class ExtensionXMLParser { 27 28 private static final String XML_ELEMENT_EXTENSION = "extension"; 29 30 private static final String XML_ELEMENT_EXTENSIONLIST = "extensionlist"; 31 32 private static final String XML_ATTRIBUTE_DESCRIPTION = "description"; 33 34 private static final String XML_ATTRIBUTE_CATEGORY = "category"; 35 36 private static final String XML_ATTRIBUTE_VERSION = "version"; 37 38 private static final String XML_ATTRIBUTE_NAME = "name"; 39 40 private static final String XML_ELEMENT_HANDLERLIST = "handlerlist"; 41 42 private static final String XML_ATTRIBUTE_SINGLETON = "singleton"; 43 44 private static final String XML_ATTRIBUTE_ENABLED = "enabled"; 45 46 private static final String XML_ATTRIBUTE_CLASS = "class"; 47 48 private static final String XML_ATTRIBUTE_PARENT = "parent"; 49 50 private static final String XML_ATTRIBUTE_ID = "id"; 51 52 private static final String XML_ELEMENT_PROPERTIES = "properties"; 53 54 private static final java.util.logging.Logger LOG = java.util.logging.Logger 55 .getLogger("org.columba.core.plugin"); 56 57 68 public Enumeration loadExtensionsFromStream(InputStream is, 69 PluginMetadata pluginMetadata, boolean internal) { 70 Vector <Extension> vector = new Vector <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 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 105 public ExtensionMetadata parseExtensionMetadata( 106 Element extensionXmlElement) { 107 String id = extensionXmlElement.getAttributeValue(XML_ATTRIBUTE_ID); 108 if (id == null) { 109 LOG.severe("missing attribute \"id\""); 110 return null; 111 } 112 113 String clazz = extensionXmlElement.getAttributeValue("class"); 114 if (clazz == null) { 115 LOG.severe("missing attribute \"class\""); 116 return null; 117 } 118 119 String enabledString = extensionXmlElement 120 .getAttributeValue(XML_ATTRIBUTE_ENABLED); 121 String singletonString = extensionXmlElement 122 .getAttributeValue(XML_ATTRIBUTE_SINGLETON); 123 124 Element attributesElement = extensionXmlElement 125 .getChild(XML_ELEMENT_PROPERTIES); 126 Map <String , String > attributes = new Hashtable <String , String >(); 127 if (attributesElement != null) { 128 List 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 (enabledString).booleanValue()); 143 144 if (singletonString != null) 145 metadata.setSingleton(new Boolean (singletonString).booleanValue()); 146 147 return metadata; 148 } 149 150 156 public PluginMetadata parsePluginMetadata(Element pluginElement) { 157 158 String id = pluginElement.getAttributeValue(XML_ATTRIBUTE_ID); 159 String name = pluginElement.getAttributeValue(XML_ATTRIBUTE_NAME); 160 String version = pluginElement.getAttributeValue(XML_ATTRIBUTE_VERSION); 161 String enabled = pluginElement.getAttributeValue(XML_ATTRIBUTE_ENABLED); 162 String category = pluginElement.getAttributeValue(XML_ATTRIBUTE_CATEGORY); 163 String description = pluginElement 164 .getAttributeValue(XML_ATTRIBUTE_DESCRIPTION); 165 166 PluginMetadata pluginMetadata = new PluginMetadata(id, name, 167 description, version, category, new Boolean (enabled) 168 .booleanValue()); 169 170 return pluginMetadata; 171 } 172 173 178 public Enumeration <ExtensionHandlerMetadata> parseExtensionHandlerList( 179 InputStream is) { 180 Vector <ExtensionHandlerMetadata> vector = new Vector <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 it = list.getChildren().listIterator(); 191 while (it.hasNext()) { 192 Element child = (Element) it.next(); 193 if (child.getName().equals("handler") == false) 195 continue; 196 String id = child.getAttributeValue(XML_ATTRIBUTE_ID); 197 String 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 216 public PluginMetadata parsePlugin(InputStream is, Hashtable hashtable) { 217 Document doc = retrieveDocument(is); 218 219 Element pluginElement = doc.getRootElement(); 220 221 PluginMetadata pluginMetadata = new ExtensionXMLParser() 222 .parsePluginMetadata(pluginElement); 223 224 Iterator it = pluginElement.getChildren().listIterator(); 226 while (it.hasNext() ) { 227 Element extensionListXmlElement = (Element) it.next(); 228 229 if (extensionListXmlElement.getName().equals( 231 XML_ELEMENT_EXTENSIONLIST) == false) 232 continue; 233 234 String 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 <ExtensionMetadata> vector = new Vector <ExtensionMetadata>(); 242 243 Iterator it2 = extensionListXmlElement.getChildren().listIterator(); 244 while (it2.hasNext() ) { 245 Element extensionXmlElement = (Element) it2.next(); 246 247 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 private static Document retrieveDocument(InputStream 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 e) { 276 LOG.severe(e.getMessage()); 277 e.printStackTrace(); 278 } 279 return doc; 280 } 281 } 282 | Popular Tags |