static PluginManager initialize() {
// We do not want info messages from JPF.
Logger.getLogger("org.java.plugin").setLevel(Level.WARNING);
Logger log = Logger.getLogger(PluginCore.class.getName());
ObjectFactory objectFactory = ObjectFactory.newInstance();
PluginManager result = objectFactory.createManager();
/*
* Now find plug-ins! Check directories and jar.
*/
try {
DefaultPluginsCollector collector = new DefaultPluginsCollector();
ExtendedProperties ep = new ExtendedProperties();
List<File> directoriesToSearch = new LinkedList<File>();
directoriesToSearch.add(new File("./src/plugins"));
directoriesToSearch.add(new File("./plugins"));
directoriesToSearch.add(userPluginDir);
try {
File parent = new File(PluginCore.class.getProtectionDomain()
.getCodeSource().getLocation().toURI()).getParentFile();
if (!parent.getCanonicalFile().equals(
new File(".").getCanonicalFile())) {
directoriesToSearch.add(new File(parent, "/src/plugins"));
directoriesToSearch.add(new File(parent, "/plugins"));
}
} catch (Exception e) {
// no problem, we just use paths relative to current dir.
}
StringBuilder sb = new StringBuilder();
for (File directory : directoriesToSearch) {
// We don't want warnings if the default plug-in paths don't
// exist, we do that below
if (directory.exists()) {
if (sb.length() > 0)
sb.append(',');
sb.append(directory.getPath());
}
}
ep.setProperty("org.java.plugin.boot.pluginsRepositories", sb
.toString());
collector.configure(ep);
Collection<PluginLocation> plugins = collector
.collectPluginLocations();
/**
* I know the following is really, really ugly, but I have found no
* way to automatically discover multiple plugin.xmls in JARs
*/
String[] jarLocationsToSearch = new String[] {
"/plugins/net.sf.jabref.core/",
"/plugins/net.sf.jabref.export.misq/"};
// Collection locations
for (String jarLocation : jarLocationsToSearch) {
PluginLocation location = getLocationInsideJar(jarLocation,
"plugin.xml");
if (location != null)
plugins.add(location);
}
if (plugins.size() <= 0) {
log
.warning(Globals
.lang("No plugins were found in the following folders:") +
"\n " +
Util.join(directoriesToSearch
.toArray(new String[directoriesToSearch.size()]),
"\n ", 0, directoriesToSearch.size()) +
"\n" +
Globals.lang("and inside the JabRef-jar:") +
"\n " +
Util.join(jarLocationsToSearch, "\n ", 0,
jarLocationsToSearch.length) +
"\n" +
Globals
.lang("At least the plug-in 'net.sf.jabref.core' should be there."));
} else {
result.publishPlugins(plugins.toArray(new PluginLocation[] {}));
Collection<PluginDescriptor> descs = result.getRegistry()
.getPluginDescriptors();
sb = new StringBuilder();
sb.append(Globals.lang("Found %0 plugin(s)", String
.valueOf(descs.size())) +
":\n");
for (PluginDescriptor p : result.getRegistry()
.getPluginDescriptors()) {
sb.append(" - ").append(p.getId()).append(" (").append(
p.getLocation()).append(")\n");
}
log.info(sb.toString());
}
} catch (Exception e) {
log
.severe(Globals
.lang("Error in starting plug-in system. Starting without, but some functionality may be missing.") +
"\n" + e.getLocalizedMessage());
}
return result;