01: package org.contineo.web;
02:
03: import org.java.plugin.Plugin;
04: import org.java.plugin.PluginClassLoader;
05: import org.java.plugin.PluginLifecycleException;
06: import org.java.plugin.registry.Identity;
07: import org.java.plugin.registry.PluginDescriptor;
08:
09: import java.lang.reflect.Method;
10:
11: import java.net.URL;
12:
13: import java.util.Iterator;
14: import java.util.Map;
15: import java.util.Set;
16:
17: /**
18: * Particular implementation of the plugin registry for the Tomcat servlet container
19: *
20: * @author Marco Meschieri
21: * @version $Id$
22: * @since 3.0
23: */
24: public class PluginRegistry extends org.contineo.util.PluginRegistry {
25: protected void initPlugins(Map<String, Identity> plugins) {
26: System.out.println("Intialising plugins");
27:
28: Set<String> keys = plugins.keySet();
29: Iterator<String> iterator = keys.iterator();
30:
31: while (iterator.hasNext()) {
32: String manifest = iterator.next();
33: System.out.println("manifestURL: " + manifest);
34:
35: PluginDescriptor pluginDescriptor = (PluginDescriptor) plugins
36: .get(manifest);
37: System.out.println("plugin located: "
38: + pluginDescriptor.getId() + " @ "
39: + pluginDescriptor.getLocation());
40:
41: // Now prepare the container class loader with all needed
42: // repositories
43: ClassLoader cl = this .getClass().getClassLoader();
44: PluginClassLoader pcl = (PluginClassLoader) manager
45: .getPluginClassLoader(pluginDescriptor);
46: URL[] urls = pcl.getURLs();
47:
48: Method addRepository;
49:
50: try {
51: addRepository = cl.getClass().getMethod(
52: "addRepository", new Class[] { String.class });
53:
54: for (int i = 0; i < urls.length; i++) {
55: String url = prepareRepositoryUrl(urls[i]
56: .toString());
57: addRepository.invoke(cl, new Object[] { url });
58: System.out.println("Added repository " + url
59: + " to " + cl.getClass().getName());
60: }
61: } catch (Exception e1) {
62: e1.printStackTrace();
63: }
64: }
65: }
66:
67: /**
68: * Convert the passed repository url to an equivalent version suitable for
69: * the container classloader
70: *
71: * @param url
72: * The original url
73: * @return The converted url
74: */
75: private String prepareRepositoryUrl(String url) {
76: String preparedUrl = url;
77:
78: if (url.startsWith("jar:")) {
79: preparedUrl = url.substring(4);
80:
81: if (preparedUrl.contains(".jar!")) {
82: int index = preparedUrl.lastIndexOf("!");
83: preparedUrl = preparedUrl.substring(0, index);
84: }
85: }
86:
87: return preparedUrl;
88: }
89: }
|