1 package org.columba.core.plugin; 19 20 import java.io.BufferedInputStream ; 21 import java.io.File ; 22 import java.io.FileInputStream ; 23 import java.io.FileNotFoundException ; 24 import java.io.IOException ; 25 import java.io.InputStream ; 26 import java.net.MalformedURLException ; 27 import java.net.URL ; 28 import java.util.Enumeration ; 29 import java.util.Hashtable ; 30 import java.util.Vector ; 31 import java.util.logging.Logger ; 32 33 import org.columba.api.plugin.ExtensionHandlerMetadata; 34 import org.columba.api.plugin.ExtensionMetadata; 35 import org.columba.api.plugin.IExtensionHandler; 36 import org.columba.api.plugin.IPluginManager; 37 import org.columba.api.plugin.PluginHandlerNotFoundException; 38 import org.columba.api.plugin.PluginMetadata; 39 import org.columba.core.io.DiskIO; 40 41 48 public class PluginManager implements IPluginManager { 49 50 private static final Logger LOG = Logger 51 .getLogger("org.columba.core.plugin"); 52 53 private static final String FILENAME_PLUGIN_XML = "plugin.xml"; 54 55 private static final String FILENAME_CONFIG_XML = "config.xml"; 56 57 private static final String FILENAME_EXTENSIONHANDLER_XML = "extensionhandler.xml"; 58 59 private Hashtable <String , IExtensionHandler> handlerMap = new Hashtable <String , IExtensionHandler>(); 60 61 private Hashtable <String , PluginMetadata> pluginMap = new Hashtable <String , PluginMetadata>(); 62 63 private static PluginManager instance = new PluginManager(); 64 65 private File [] pluginFolders; 66 67 70 private PluginManager() { 71 pluginFolders = PluginFinder.searchPlugins(); 73 } 74 75 78 public static IPluginManager getInstance() { 79 return instance; 80 } 81 82 86 public void addExtensionHandler(String id, IExtensionHandler handler) { 87 if (id == null) 88 throw new IllegalArgumentException ("id == null"); 89 if (handler == null) 90 throw new IllegalArgumentException ("handler == null"); 91 92 LOG.fine("adding extension handler " + id); 93 94 handlerMap.put(id, handler); 95 } 96 97 100 public IExtensionHandler getExtensionHandler(String id) 101 throws PluginHandlerNotFoundException { 102 if (id == null) 103 throw new IllegalArgumentException ("id == null"); 104 105 if (handlerMap.containsKey(id)) 106 return (IExtensionHandler) handlerMap.get(id); 107 else 108 throw new PluginHandlerNotFoundException(id); 109 } 110 111 114 public String addPlugin(File xmlFile) { 115 Hashtable hashtable = new Hashtable (); 116 117 BufferedInputStream buf; 119 try { 120 buf = new BufferedInputStream (new FileInputStream (xmlFile)); 121 } catch (FileNotFoundException e1) { 122 e1.printStackTrace(); 123 return null; 125 } 126 127 PluginMetadata pluginMetadata = new ExtensionXMLParser().parsePlugin( 128 buf, hashtable); 129 pluginMetadata.setDirectory(xmlFile.getParentFile()); 130 131 String id = pluginMetadata.getId(); 132 pluginMap.put(id, pluginMetadata); 133 134 parseExtensions(hashtable, pluginMetadata, false); 136 137 return id; 138 } 139 140 146 private void parseExtensions(Hashtable hashtable, 147 PluginMetadata pluginMetadata, boolean internal) { 148 Enumeration e = hashtable.keys(); 152 while (e.hasMoreElements()) { 153 String extensionpointId = (String ) e.nextElement(); 154 155 Vector extensionVector = (Vector ) hashtable.get(extensionpointId); 156 157 IExtensionHandler handler = null; 158 159 try { 161 handler = getExtensionHandler(extensionpointId); 162 Enumeration e2 = extensionVector.elements(); 163 while (e2.hasMoreElements()) { 164 ExtensionMetadata extensionMetadata = (ExtensionMetadata) e2 165 .nextElement(); 166 Extension pluginExtension = new Extension(pluginMetadata, 167 extensionMetadata); 168 pluginExtension.setInternal(internal); 169 170 String extensionId = pluginExtension.getMetadata().getId(); 171 if (handler.exists(extensionId) == false) 173 handler.addExtension(extensionId, pluginExtension); 174 } 175 } catch (PluginHandlerNotFoundException e2) { 176 LOG.severe("No suitable extension handler with name " 177 + extensionpointId + " found"); 178 } 179 } 180 } 181 182 185 public void initExternalPlugins() { 186 187 if (pluginFolders == null || pluginFolders.length == 0) { 189 return; 190 } 191 192 for (int i = 0; i < pluginFolders.length; i++) { 194 File folder = pluginFolders[i]; 195 196 File xmlFile = new File (folder, FILENAME_PLUGIN_XML); 197 198 if (xmlFile == null || !xmlFile.exists()) { 199 continue; 201 } 202 203 LOG.fine("registering plugin: " + folder); 204 205 addPlugin(xmlFile); 206 } 207 } 208 209 212 public File getPluginConfigFile(String id) { 213 214 PluginMetadata metadata = (PluginMetadata) pluginMap.get(id); 215 File directory = metadata.getDirectory(); 216 File configFile = new File (directory, FILENAME_CONFIG_XML); 217 218 return configFile; 219 } 220 221 224 public PluginMetadata getPluginMetadata(String id) { 225 if (id == null) 226 throw new IllegalArgumentException ("id == null"); 227 228 PluginMetadata metadata = (PluginMetadata) pluginMap.get(id); 229 return metadata; 230 } 231 232 235 public URL getInfoURL(String id) { 236 PluginMetadata metadata = (PluginMetadata) pluginMap.get(id); 237 File pluginDirectory = metadata.getDirectory(); 238 239 if (pluginDirectory == null) { 240 return null; 241 } 242 243 try { 244 File infoFile = new File (pluginDirectory, "readme.html"); 246 247 if (!infoFile.exists()) { 248 infoFile = new File (pluginDirectory, "readme.txt"); 249 } 250 251 if (!infoFile.exists()) { 252 infoFile = new File (pluginDirectory, "Readme.html"); 253 } 254 255 if (!infoFile.exists()) { 256 infoFile = new File (pluginDirectory, "Readme.txt"); 257 } 258 259 if (infoFile.exists()) { 260 LOG.fine("infofile-URL=" + infoFile.toURL()); 261 262 return infoFile.toURL(); 263 } 264 } catch (MalformedURLException ex) { 265 } 267 return null; 268 } 269 270 273 public Enumeration getPluginMetadataEnumeration() { 274 return pluginMap.elements(); 275 } 276 277 280 public String addPlugin(String resourcePath) { 281 if (resourcePath == null) 282 throw new IllegalArgumentException ("resourcePath == null"); 283 284 InputStream is; 286 try { 287 is = DiskIO.getResourceStream(resourcePath); 288 } catch (IOException e) { 289 e.printStackTrace(); 290 return null; 292 } 293 294 Hashtable hashtable = new Hashtable (); 296 PluginMetadata pluginMetadata = new ExtensionXMLParser().parsePlugin( 297 new BufferedInputStream (is), hashtable); 298 299 String id = pluginMetadata.getId(); 300 301 308 311 parseExtensions(hashtable, pluginMetadata, true); 313 314 return id; 315 } 316 317 320 public void initExternalExtensionHandlers() { 321 if (pluginFolders == null || pluginFolders.length == 0) { 323 return; 324 } 325 326 for (int i = 0; i < pluginFolders.length; i++) { 328 File folder = pluginFolders[i]; 329 330 File xmlFile = new File (folder, FILENAME_EXTENSIONHANDLER_XML); 331 332 if (xmlFile == null || !xmlFile.exists()) { 333 continue; 335 } 336 337 BufferedInputStream buf; 338 try { 339 buf = new BufferedInputStream (new FileInputStream (xmlFile)); 340 LOG.fine("registering extension handler: " + folder); 341 addExtensionHandlers(buf); 342 } catch (FileNotFoundException e1) { 343 e1.printStackTrace(); 344 continue; 346 } 347 } 348 } 349 350 353 public void addExtensionHandlers(InputStream is) { 354 Enumeration <ExtensionHandlerMetadata> e = new ExtensionXMLParser() 355 .parseExtensionHandlerList(is); 356 while (e.hasMoreElements()) { 357 ExtensionHandlerMetadata metadata = e.nextElement(); 358 359 IExtensionHandler handler = new ExtensionHandler(metadata.getId(), 360 metadata.getParent()); 361 362 addExtensionHandler(metadata.getId(), handler); 363 } 364 } 365 366 369 public void addExtensionHandlers(String resourcePath) { 370 InputStream is; 372 try { 373 is = DiskIO.getResourceStream(resourcePath); 374 } catch (IOException e) { 375 e.printStackTrace(); 376 return; 378 } 379 380 addExtensionHandlers(is); 381 } 382 } | Popular Tags |