Skip to content
This repository has been archived by the owner on Jul 26, 2022. It is now read-only.

Commit

Permalink
Lazy plugin loading
Browse files Browse the repository at this point in the history
  • Loading branch information
pimotte committed Jul 25, 2014
1 parent 724c9c0 commit 0226500
Showing 1 changed file with 26 additions and 4 deletions.
30 changes: 26 additions & 4 deletions syncany-lib/src/main/java/org/syncany/plugins/Plugins.java
Expand Up @@ -44,15 +44,13 @@ public class Plugins {
private static final Reflections reflections = new Reflections(Plugin.class.getPackage().getName());
private static final Map<String, Plugin> plugins = new TreeMap<String, Plugin>();

static {
loadPlugins();
}

/**
* Loads and returns a list of all available
* {@link Plugin}s.
*/
public static List<Plugin> list() {
loadPlugins();
return new ArrayList<Plugin>(plugins.values());
}

Expand All @@ -61,6 +59,7 @@ public static List<Plugin> list() {
* matching the given subclass.
*/
public static <T extends Plugin> List<T> list(Class<T> pluginClass) {
loadPlugins();
List<T> matchingPlugins = new ArrayList<T>();

for (Plugin plugin : plugins.values()) {
Expand All @@ -86,6 +85,8 @@ public static Plugin get(String pluginId) {
return null;
}

loadPlugin(pluginId);

if (plugins.containsKey(pluginId)) {
return plugins.get(pluginId);
}
Expand All @@ -104,12 +105,33 @@ public static <T extends Plugin> T get(String pluginId, Class<T> pluginClass) {
return pluginClass.cast(plugin);
}
}

private static void loadPlugin(String pluginId) {
if (plugins.containsKey(pluginId)) {
return;
}
for (Class<? extends Plugin> pluginClass : reflections.getSubTypesOf(Plugin.class)) {
boolean canInstantiate = !Modifier.isAbstract(pluginClass.getModifiers());
String candidatePluginId = pluginClass.getSimpleName().replace("Plugin", "").toLowerCase();

if (canInstantiate && candidatePluginId.equals(pluginId)) {
try {
Plugin plugin = (Plugin) pluginClass.newInstance();
plugins.put(plugin.getId(), plugin);
}
catch (Exception e) {
logger.log(Level.WARNING, "Could not load plugin (2): " + pluginClass.getName(), e);
}
}
}
}

private static void loadPlugins() {
for (Class<? extends Plugin> pluginClass : reflections.getSubTypesOf(Plugin.class)) {
boolean canInstantiate = !Modifier.isAbstract(pluginClass.getModifiers());
String pluginId = pluginClass.getSimpleName().replace("Plugin", "").toLowerCase();

if (canInstantiate) {
if (canInstantiate && !plugins.containsKey(pluginId)) {
try {
Plugin plugin = (Plugin) pluginClass.newInstance();
plugins.put(plugin.getId(), plugin);
Expand Down

0 comments on commit 0226500

Please sign in to comment.