1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
package org.jvnet.lafplugin;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.swing.UIDefaults;
/**
* Plugin manager for look-and-feels.
*
* @author Kirill Grouchnikov
* @author Erik Vickroy
* @author Robert Beeger
* @author Frederic Lavigne
* @author Pattrick Gotthardt
*/
public class PluginManager {
private String mainTag;
private String pluginTag;
private String xmlName;
private Set plugins;
/**
* Simple constructor.
*
* @param xmlName
* The name of XML file that contains plugin configuration.
* @param mainTag
* The main tag in the XML configuration file.
* @param pluginTag
* The tag that corresponds to a single plugin kind. Specifies
* the plugin kind that will be located in
* {@link #getAvailablePlugins(boolean)}.
*/
public PluginManager(String xmlName, String mainTag, String pluginTag) {
this.xmlName = xmlName;
this.mainTag = mainTag;
this.pluginTag = pluginTag;
this.plugins = null;
}
// protected String getPluginClass(URL pluginUrl) {
// InputStream is = null;
// try {
// DocumentBuilder builder = DocumentBuilderFactory.newInstance()
// .newDocumentBuilder();
// is = pluginUrl.openStream();
// Document doc = builder.parse(is);
// Node root = doc.getFirstChild();
// if (!this.mainTag.equals(root.getNodeName()))
// return null;
// NodeList children = root.getChildNodes();
// for (int i = 0; i < children.getLength(); i++) {
// Node child = children.item(i);
// if (!this.pluginTag.equals(child.getNodeName()))
// continue;
// if (child.getChildNodes().getLength() != 1)
// return null;
// Node text = child.getFirstChild();
// if (text.getNodeType() != Node.TEXT_NODE)
// return null;
// return text.getNodeValue();
// }
// return null;
// } catch (Exception exc) {
// return null;
// } finally {
// if (is != null) {
// try {
// is.close();
// } catch (Exception e) {
// }
// }
// }
// }
//
protected String getPluginClass(URL pluginUrl) {
InputStream is = null;
InputStreamReader isr = null;
try {
XMLElement xml = new XMLElement();
is = pluginUrl.openStream();
isr = new InputStreamReader(is);
xml.parseFromReader(isr);
if (!this.mainTag.equals(xml.getName()))
return null;
Enumeration children = xml.enumerateChildren();
while (children.hasMoreElements()) {
XMLElement child = (XMLElement) children.nextElement();
if (!this.pluginTag.equals(child.getName()))
continue;
if (child.countChildren() != 0)
return null;
return child.getContent();
}
return null;
} catch (Exception exc) {
return null;
} finally {
if (isr != null) {
try {
isr.close();
} catch (Exception e) {
}
}
if (is != null) {
try {
is.close();
} catch (Exception e) {
}
}
}
}
protected Object getPlugin(URL pluginUrl) throws Exception {
String pluginClassName = this.getPluginClass(pluginUrl);
if (pluginClassName == null)
return null;
Class pluginClass = Class.forName(pluginClassName);
if (pluginClass == null)
return null;
Object pluginInstance = pluginClass.newInstance();
if (pluginInstance == null)
return null;
return pluginInstance;
}
/**
* Returns a collection of all available plugins.
*
* @return Collection of all available plugins. The classpath is scanned
* only once.
* @see #getAvailablePlugins(boolean)
*/
public Set getAvailablePlugins() {
return this.getAvailablePlugins(false);
}
/**
* Returns a collection of all available plugins. The parameter specifies
* whether the classpath should be rescanned or whether to return the
* already found plugins (after first-time scan).
*
* @param toReload
* If <code>true</code>, the classpath is scanned for
* available plugins every time <code>this</code> function is
* called. If <code>false</code>, the classpath scan is
* performed only once. The consecutive calls return the cached
* result.
* @return Collection of all available plugins.
*/
public Set getAvailablePlugins(boolean toReload) {
if (toReload && (this.plugins != null))
return this.plugins;
this.plugins = new HashSet();
ClassLoader cl = PluginManager.class.getClassLoader();
try {
Enumeration urls = cl.getResources(this.xmlName);
while (urls.hasMoreElements()) {
URL pluginUrl = (URL) urls.nextElement();
Object pluginInstance = this.getPlugin(pluginUrl);
if (pluginInstance != null)
this.plugins.add(pluginInstance);
}
} catch (Exception exc) {
return null;
}
return plugins;
}
}
|