From 1f04209be1769e40c730cf2701926611e2f85435 Mon Sep 17 00:00:00 2001 From: Decebal Suiu Date: Mon, 30 Jan 2023 20:36:47 +0200 Subject: Relax Plugin construction (remove dependency on PluginWrapper) (#512) --- .../main/java/org/pf4j/demo/api/DemoPlugin.java | 35 ++++++++++++++++++ .../main/java/org/pf4j/demo/api/PluginContext.java | 39 ++++++++++++++++++++ demo/app/src/main/java/org/pf4j/demo/Boot.java | 22 +----------- .../main/java/org/pf4j/demo/DemoPluginFactory.java | 40 +++++++++++++++++++++ .../main/java/org/pf4j/demo/DemoPluginManager.java | 42 ++++++++++++++++++++++ .../java/org/pf4j/demo/welcome/WelcomePlugin.java | 15 ++++---- .../main/java/org/pf4j/demo/hello/HelloPlugin.java | 10 +++--- 7 files changed, 169 insertions(+), 34 deletions(-) create mode 100644 demo/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java create mode 100644 demo/api/src/main/java/org/pf4j/demo/api/PluginContext.java create mode 100644 demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java create mode 100644 demo/app/src/main/java/org/pf4j/demo/DemoPluginManager.java (limited to 'demo') diff --git a/demo/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java b/demo/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java new file mode 100644 index 0000000..a2f76fc --- /dev/null +++ b/demo/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.pf4j.demo.api; + +import org.pf4j.Plugin; + +/** + * Base {@link Plugin} for all demo plugins. + * + * @author Decebal Suiu + */ +public abstract class DemoPlugin extends Plugin { + + protected final PluginContext context; + + protected DemoPlugin(PluginContext context) { + super(); + + this.context = context; + } + +} diff --git a/demo/api/src/main/java/org/pf4j/demo/api/PluginContext.java b/demo/api/src/main/java/org/pf4j/demo/api/PluginContext.java new file mode 100644 index 0000000..0a7506f --- /dev/null +++ b/demo/api/src/main/java/org/pf4j/demo/api/PluginContext.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.pf4j.demo.api; + +import org.pf4j.RuntimeMode; + +/** + * An instance of this class is provided to plugins in their constructor. + * It's safe for plugins to keep a reference to the instance for later use. + * This class facilitates communication with application and plugin manager. + * + * @author Decebal Suiu + */ +public class PluginContext { + + private final RuntimeMode runtimeMode; + + public PluginContext(RuntimeMode runtimeMode) { + this.runtimeMode = runtimeMode; + } + + public RuntimeMode getRuntimeMode() { + return runtimeMode; + } + +} diff --git a/demo/app/src/main/java/org/pf4j/demo/Boot.java b/demo/app/src/main/java/org/pf4j/demo/Boot.java index 524009c..d101104 100644 --- a/demo/app/src/main/java/org/pf4j/demo/Boot.java +++ b/demo/app/src/main/java/org/pf4j/demo/Boot.java @@ -16,7 +16,6 @@ package org.pf4j.demo; import org.apache.commons.lang.StringUtils; -import org.pf4j.DefaultPluginManager; import org.pf4j.PluginManager; import org.pf4j.PluginWrapper; import org.pf4j.demo.api.Greeting; @@ -40,7 +39,7 @@ public class Boot { printLogo(); // create the plugin manager - PluginManager pluginManager = createPluginManager(); + PluginManager pluginManager = new DemoPluginManager(); // load the plugins pluginManager.loadPlugins(); @@ -129,23 +128,4 @@ public class Boot { log.info(StringUtils.repeat("#", 40)); } - private static PluginManager createPluginManager() { - return new DefaultPluginManager(); - - // use below plugin manager instance if you want to enable ServiceProviderExtensionFinder - /* - return new DefaultPluginManager() { - - @Override - protected ExtensionFinder createExtensionFinder() { - DefaultExtensionFinder extensionFinder = (DefaultExtensionFinder) super.createExtensionFinder(); - extensionFinder.addServiceProviderExtensionFinder(); // to activate "HowdyGreeting" extension - - return extensionFinder; - } - - }; - */ - } - } diff --git a/demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java b/demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java new file mode 100644 index 0000000..432dceb --- /dev/null +++ b/demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.pf4j.demo; + +import org.pf4j.DefaultPluginFactory; +import org.pf4j.Plugin; +import org.pf4j.PluginWrapper; +import org.pf4j.demo.api.PluginContext; + +import java.lang.reflect.Constructor; + +class DemoPluginFactory extends DefaultPluginFactory { + + @Override + protected Plugin createInstance(Class pluginClass, PluginWrapper pluginWrapper) { + PluginContext context = new PluginContext(pluginWrapper.getRuntimeMode()); + try { + Constructor constructor = pluginClass.getConstructor(PluginContext.class); + return (Plugin) constructor.newInstance(context); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + return null; + } + +} diff --git a/demo/app/src/main/java/org/pf4j/demo/DemoPluginManager.java b/demo/app/src/main/java/org/pf4j/demo/DemoPluginManager.java new file mode 100644 index 0000000..2571a3e --- /dev/null +++ b/demo/app/src/main/java/org/pf4j/demo/DemoPluginManager.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.pf4j.demo; + +import org.pf4j.DefaultExtensionFinder; +import org.pf4j.DefaultPluginFactory; +import org.pf4j.DefaultPluginManager; +import org.pf4j.ExtensionFinder; +import org.pf4j.PluginFactory; + +class DemoPluginManager extends DefaultPluginManager { + + // Use below code if you want to enable ServiceProviderExtensionFinder + /* + @Override + protected ExtensionFinder createExtensionFinder() { + DefaultExtensionFinder extensionFinder = (DefaultExtensionFinder) super.createExtensionFinder(); + extensionFinder.addServiceProviderExtensionFinder(); // to activate "HowdyGreeting" extension + + return extensionFinder; + } + */ + + @Override + protected PluginFactory createPluginFactory() { + return new DemoPluginFactory(); + } + +} diff --git a/demo/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java b/demo/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java index a0cecab..3064902 100644 --- a/demo/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java +++ b/demo/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java @@ -16,27 +16,26 @@ package org.pf4j.demo.welcome; import org.apache.commons.lang.StringUtils; - -import org.pf4j.PluginWrapper; +import org.pf4j.Extension; import org.pf4j.RuntimeMode; +import org.pf4j.demo.api.DemoPlugin; import org.pf4j.demo.api.Greeting; -import org.pf4j.Extension; -import org.pf4j.Plugin; +import org.pf4j.demo.api.PluginContext; /** * @author Decebal Suiu */ -public class WelcomePlugin extends Plugin { +public class WelcomePlugin extends DemoPlugin { - public WelcomePlugin(PluginWrapper wrapper) { - super(wrapper); + public WelcomePlugin(PluginContext context) { + super(context); } @Override public void start() { log.info("WelcomePlugin.start()"); // for testing the development mode - if (RuntimeMode.DEVELOPMENT.equals(wrapper.getRuntimeMode())) { + if (RuntimeMode.DEVELOPMENT.equals(context.getRuntimeMode())) { log.info(StringUtils.upperCase("WelcomePlugin")); } } diff --git a/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java b/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java index 3b7c9ce..ed67878 100644 --- a/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java +++ b/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java @@ -16,19 +16,19 @@ package org.pf4j.demo.hello; import org.pf4j.Extension; -import org.pf4j.Plugin; -import org.pf4j.PluginWrapper; +import org.pf4j.demo.api.DemoPlugin; import org.pf4j.demo.api.Greeting; +import org.pf4j.demo.api.PluginContext; /** * A very simple plugin. * * @author Decebal Suiu */ -public class HelloPlugin extends Plugin { +public class HelloPlugin extends DemoPlugin { - public HelloPlugin(PluginWrapper wrapper) { - super(wrapper); + public HelloPlugin(PluginContext context) { + super(context); } @Override -- cgit v1.2.3