diff --git a/demo/app/src/main/java/ro/fortsoft/pf4j/demo/Boot.java b/demo/app/src/main/java/ro/fortsoft/pf4j/demo/Boot.java index 9f218cf..7681a75 100644 --- a/demo/app/src/main/java/ro/fortsoft/pf4j/demo/Boot.java +++ b/demo/app/src/main/java/ro/fortsoft/pf4j/demo/Boot.java @@ -12,12 +12,19 @@ */ package ro.fortsoft.pf4j.demo; +import java.io.File; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; import org.apache.commons.lang.StringUtils; import ro.fortsoft.pf4j.DefaultPluginManager; +import ro.fortsoft.pf4j.PluginClasspath; +import ro.fortsoft.pf4j.PluginDescriptorFinder; import ro.fortsoft.pf4j.PluginManager; +import ro.fortsoft.pf4j.PropertiesPluginDescriptorFinder; import ro.fortsoft.pf4j.demo.api.Greeting; /** @@ -26,21 +33,25 @@ import ro.fortsoft.pf4j.demo.api.Greeting; * @author Decebal Suiu */ public class Boot { - + public static void main(String[] args) { // print logo printLogo(); - // load and start (active/resolved) plugins - final PluginManager pluginManager = new DefaultPluginManager(); + // create the plugin manager + final PluginManager pluginManager = createPluginManager(); + + // load and start (active/resolved) the plugins pluginManager.loadPlugins(); pluginManager.startPlugins(); + // retrieves the extensions for Greeting extension point List greetings = pluginManager.getExtensions(Greeting.class); for (Greeting greeting : greetings) { System.out.println(">>> " + greeting.getGreeting()); } + // stop the plugins pluginManager.stopPlugins(); /* Runtime.getRuntime().addShutdownHook(new Thread() { @@ -53,11 +64,82 @@ public class Boot { }); */ } + + private static PluginManager createPluginManager() { + // retrieves the pf4j runtime mode + String modeAsString = System.getProperty("pf4j.mode", RuntimeMode.PROD.toString()); + RuntimeMode mode = RuntimeMode.byName(modeAsString); + + System.out.println("PF4J runtime mode: '" + mode + "'"); + + // create the plugin manager depending on runtime mode + PluginManager pluginManager = null; + if (mode == RuntimeMode.PROD) { + pluginManager = new DefaultPluginManager(); + } else if (mode == RuntimeMode.DEV) { + // run from eclipse IDE (for example) + pluginManager = new DefaultPluginManager(new File("../plugins")) { + + @Override + protected PluginClasspath createPluginClasspath() { + PluginClasspath pluginClasspath = super.createPluginClasspath(); + // modify plugin classes + List pluginClasses = pluginClasspath.getClassesDirectories(); + pluginClasses.clear(); + pluginClasses.add("target/classes"); + + return pluginClasspath; + } + + @Override + protected PluginDescriptorFinder createPluginDescriptorFinder() { + return new PropertiesPluginDescriptorFinder(); + } + + }; + } + + return pluginManager; + } private static void printLogo() { System.out.println(StringUtils.repeat("#", 40)); System.out.println(StringUtils.center("PF4J-DEMO", 40)); System.out.println(StringUtils.repeat("#", 40)); } + + public enum RuntimeMode { + + DEV("dev"), // development + PROD("prod"); // production + + private final String name; + + private static final Map map = new HashMap(); + + static { + for (RuntimeMode mode : RuntimeMode.values()) { + map.put(mode.name, mode); + } + } + + private RuntimeMode(final String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + + public static RuntimeMode byName(String name) { + if (map.containsKey(name)) { + return map.get(name); + } + + throw new NoSuchElementException("Cannot found PF4J runtime mode with name '" + name + "'"); + } + + } }