KickJava   Java API By Example, From Geeks To Geeks.

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


1 // The contents of this file are subject to the Mozilla Public License Version
2
// 1.1
3
//(the "License"); you may not use this file except in compliance with the
4
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
5
//
6
//Software distributed under the License is distributed on an "AS IS" basis,
7
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8
//for the specific language governing rights and
9
//limitations under the License.
10
//
11
//The Original Code is "The Columba Project"
12
//
13
//The Initial Developers of the Original Code are Frederik Dietz and Timo
14
// Stich.
15
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
16
//
17
//All Rights Reserved.
18
package org.columba.core.plugin;
19
20 import java.io.BufferedInputStream JavaDoc;
21 import java.io.File JavaDoc;
22 import java.io.FileInputStream JavaDoc;
23 import java.io.FileNotFoundException JavaDoc;
24 import java.io.IOException JavaDoc;
25 import java.io.InputStream JavaDoc;
26 import java.net.MalformedURLException JavaDoc;
27 import java.net.URL JavaDoc;
28 import java.util.Enumeration JavaDoc;
29 import java.util.Hashtable JavaDoc;
30 import java.util.Vector JavaDoc;
31 import java.util.logging.Logger JavaDoc;
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 /**
42  * Plugin manager is a singleton registry for all plugins and all extension
43  * handlers.
44  *
45  * @author fdietz
46  *
47  */

48 public class PluginManager implements IPluginManager {
49
50     private static final Logger JavaDoc LOG = Logger
51             .getLogger("org.columba.core.plugin");
52
53     private static final String JavaDoc FILENAME_PLUGIN_XML = "plugin.xml";
54
55     private static final String JavaDoc FILENAME_CONFIG_XML = "config.xml";
56
57     private static final String JavaDoc FILENAME_EXTENSIONHANDLER_XML = "extensionhandler.xml";
58
59     private Hashtable JavaDoc<String JavaDoc, IExtensionHandler> handlerMap = new Hashtable JavaDoc<String JavaDoc, IExtensionHandler>();
60
61     private Hashtable JavaDoc<String JavaDoc, PluginMetadata> pluginMap = new Hashtable JavaDoc<String JavaDoc, PluginMetadata>();
62
63     private static PluginManager instance = new PluginManager();
64
65     private File JavaDoc[] pluginFolders;
66
67     /**
68      *
69      */

70     private PluginManager() {
71         // find all possible plugin directories
72
pluginFolders = PluginFinder.searchPlugins();
73     }
74
75     /**
76      * @return instance
77      */

78     public static IPluginManager getInstance() {
79         return instance;
80     }
81
82     /**
83      * @see org.columba.api.plugin.IPluginManager#addExtensionHandler(java.lang.String,
84      * org.columba.api.plugin.IExtensionHandler)
85      */

86     public void addExtensionHandler(String JavaDoc id, IExtensionHandler handler) {
87         if (id == null)
88             throw new IllegalArgumentException JavaDoc("id == null");
89         if (handler == null)
90             throw new IllegalArgumentException JavaDoc("handler == null");
91
92         LOG.fine("adding extension handler " + id);
93
94         handlerMap.put(id, handler);
95     }
96
97     /**
98      * @see org.columba.api.plugin.IPluginManager#getExtensionHandler(java.lang.String)
99      */

100     public IExtensionHandler getExtensionHandler(String JavaDoc id)
101             throws PluginHandlerNotFoundException {
102         if (id == null)
103             throw new IllegalArgumentException JavaDoc("id == null");
104
105         if (handlerMap.containsKey(id))
106             return (IExtensionHandler) handlerMap.get(id);
107         else
108             throw new PluginHandlerNotFoundException(id);
109     }
110
111     /**
112      * @see org.columba.api.plugin.IPluginManager#addPlugin(java.io.File)
113      */

114     public String JavaDoc addPlugin(File JavaDoc xmlFile) {
115         Hashtable JavaDoc hashtable = new Hashtable JavaDoc();
116
117         // parse "/plugin.xml" file
118
BufferedInputStream JavaDoc buf;
119         try {
120             buf = new BufferedInputStream JavaDoc(new FileInputStream JavaDoc(xmlFile));
121         } catch (FileNotFoundException JavaDoc e1) {
122             e1.printStackTrace();
123             // cancel
124
return null;
125         }
126
127         PluginMetadata pluginMetadata = new ExtensionXMLParser().parsePlugin(
128                 buf, hashtable);
129         pluginMetadata.setDirectory(xmlFile.getParentFile());
130
131         String JavaDoc id = pluginMetadata.getId();
132         pluginMap.put(id, pluginMetadata);
133
134         // register all extensions
135
parseExtensions(hashtable, pluginMetadata, false);
136
137         return id;
138     }
139
140     /**
141      * @param hashtable
142      * hashtable with String id and Vector of
143      * <code>ExtensionMetadata</code>
144      * @param pluginMetadata
145      */

146     private void parseExtensions(Hashtable JavaDoc hashtable,
147             PluginMetadata pluginMetadata, boolean internal) {
148         // loop through all extensions this plugin uses
149
// -> search the corresponding extension handler
150
// -> register the extension at the extension handler
151
Enumeration JavaDoc e = hashtable.keys();
152         while (e.hasMoreElements()) {
153             String JavaDoc extensionpointId = (String JavaDoc) e.nextElement();
154
155             Vector JavaDoc extensionVector = (Vector JavaDoc) hashtable.get(extensionpointId);
156
157             IExtensionHandler handler = null;
158
159             // we have a plugin-handler for this kind of extension
160
try {
161                 handler = getExtensionHandler(extensionpointId);
162                 Enumeration JavaDoc 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 JavaDoc extensionId = pluginExtension.getMetadata().getId();
171                     // if extension wasn't already registered
172
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     /**
183      * @see org.columba.api.plugin.IPluginManager#initExternalPlugins()
184      */

185     public void initExternalPlugins() {
186
187         // if no plugin directory exists -> return
188
if (pluginFolders == null || pluginFolders.length == 0) {
189             return;
190         }
191
192         // try to load all plugins
193
for (int i = 0; i < pluginFolders.length; i++) {
194             File JavaDoc folder = pluginFolders[i];
195
196             File JavaDoc xmlFile = new File JavaDoc(folder, FILENAME_PLUGIN_XML);
197
198             if (xmlFile == null || !xmlFile.exists()) {
199                 // skip if it doesn't exist
200
continue;
201             }
202
203             LOG.fine("registering plugin: " + folder);
204
205             addPlugin(xmlFile);
206         }
207     }
208
209     /**
210      * @see org.columba.api.plugin.IPluginManager#getPluginConfigFile(java.lang.String)
211      */

212     public File JavaDoc getPluginConfigFile(String JavaDoc id) {
213
214         PluginMetadata metadata = (PluginMetadata) pluginMap.get(id);
215         File JavaDoc directory = metadata.getDirectory();
216         File JavaDoc configFile = new File JavaDoc(directory, FILENAME_CONFIG_XML);
217
218         return configFile;
219     }
220
221     /**
222      * @see org.columba.api.plugin.IPluginManager#getPluginMetadata(java.lang.String)
223      */

224     public PluginMetadata getPluginMetadata(String JavaDoc id) {
225         if (id == null)
226             throw new IllegalArgumentException JavaDoc("id == null");
227
228         PluginMetadata metadata = (PluginMetadata) pluginMap.get(id);
229         return metadata;
230     }
231
232     /**
233      * @see org.columba.api.plugin.IPluginManager#getInfoURL(java.lang.String)
234      */

235     public URL JavaDoc getInfoURL(String JavaDoc id) {
236         PluginMetadata metadata = (PluginMetadata) pluginMap.get(id);
237         File JavaDoc pluginDirectory = metadata.getDirectory();
238
239         if (pluginDirectory == null) {
240             return null;
241         }
242
243         try {
244             // try all possible version of readme files...
245
File JavaDoc infoFile = new File JavaDoc(pluginDirectory, "readme.html");
246
247             if (!infoFile.exists()) {
248                 infoFile = new File JavaDoc(pluginDirectory, "readme.txt");
249             }
250
251             if (!infoFile.exists()) {
252                 infoFile = new File JavaDoc(pluginDirectory, "Readme.html");
253             }
254
255             if (!infoFile.exists()) {
256                 infoFile = new File JavaDoc(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 JavaDoc ex) {
265         } // does not occur
266

267         return null;
268     }
269
270     /**
271      * @see org.columba.api.plugin.IPluginManager#getPluginMetadataEnumeration()
272      */

273     public Enumeration JavaDoc getPluginMetadataEnumeration() {
274         return pluginMap.elements();
275     }
276
277     /**
278      * @see org.columba.api.plugin.IPluginManager#addPlugin(java.lang.String)
279      */

280     public String JavaDoc addPlugin(String JavaDoc resourcePath) {
281         if (resourcePath == null)
282             throw new IllegalArgumentException JavaDoc("resourcePath == null");
283
284         // retrieve inputstream from resource
285
InputStream JavaDoc is;
286         try {
287             is = DiskIO.getResourceStream(resourcePath);
288         } catch (IOException JavaDoc e) {
289             e.printStackTrace();
290             // cancel
291
return null;
292         }
293
294         // parse plugin metadata
295
Hashtable JavaDoc hashtable = new Hashtable JavaDoc();
296         PluginMetadata pluginMetadata = new ExtensionXMLParser().parsePlugin(
297                 new BufferedInputStream JavaDoc(is), hashtable);
298
299         String JavaDoc id = pluginMetadata.getId();
300
301         //
302
// Note: We intentionally don't remember internal plugins, because
303
// we don't want them to appear in the plugin manager currently.
304
//
305
// TODO: improve plugin manager dialog to support internal plugins
306
// which can't be removed, etc.
307

308         // remember plugin metadata
309
// pluginMap.put(id, pluginMetadata);
310

311         // register all extensions
312
parseExtensions(hashtable, pluginMetadata, true);
313
314         return id;
315     }
316
317     /**
318      * @see org.columba.api.plugin.IPluginManager#initExternalExtensionHandlers()
319      */

320     public void initExternalExtensionHandlers() {
321         // if no plugin directory exists -> return
322
if (pluginFolders == null || pluginFolders.length == 0) {
323             return;
324         }
325
326         // try to load extensin handlers of all plugins
327
for (int i = 0; i < pluginFolders.length; i++) {
328             File JavaDoc folder = pluginFolders[i];
329
330             File JavaDoc xmlFile = new File JavaDoc(folder, FILENAME_EXTENSIONHANDLER_XML);
331
332             if (xmlFile == null || !xmlFile.exists()) {
333                 // skip if it doesn't exist
334
continue;
335             }
336
337             BufferedInputStream JavaDoc buf;
338             try {
339                 buf = new BufferedInputStream JavaDoc(new FileInputStream JavaDoc(xmlFile));
340                 LOG.fine("registering extension handler: " + folder);
341                 addExtensionHandlers(buf);
342             } catch (FileNotFoundException JavaDoc e1) {
343                 e1.printStackTrace();
344                 // cancel
345
continue;
346             }
347         }
348     }
349
350     /**
351      * @see org.columba.api.plugin.IPluginManager#addExtensionHandlers(java.io.InputStream)
352      */

353     public void addExtensionHandlers(InputStream JavaDoc is) {
354         Enumeration JavaDoc<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     /**
367      * @see org.columba.api.plugin.IPluginManager#addExtensionHandlers(java.lang.String)
368      */

369     public void addExtensionHandlers(String JavaDoc resourcePath) {
370         // retrieve inputstream from resource
371
InputStream JavaDoc is;
372         try {
373             is = DiskIO.getResourceStream(resourcePath);
374         } catch (IOException JavaDoc e) {
375             e.printStackTrace();
376             // cancel
377
return;
378         }
379
380         addExtensionHandlers(is);
381     }
382 }
Popular Tags