diff options
author | Decebal Suiu <decebal.suiu@gmail.com> | 2023-01-15 19:20:36 +0200 |
---|---|---|
committer | Decebal Suiu <decebal.suiu@gmail.com> | 2023-01-15 19:20:36 +0200 |
commit | 5fae38427d1985468b018775a956c290dc214420 (patch) | |
tree | bd5ceaf70a5116d230d89d01370e1e6731db92ab /pf4j | |
parent | de63736b13a71c227c1dec95e8e39c95a3962870 (diff) | |
download | pf4j-5fae38427d1985468b018775a956c290dc214420.tar.gz pf4j-5fae38427d1985468b018775a956c290dc214420.zip |
Relax Plugin construction (remove dependency on PluginWrapper)
Diffstat (limited to 'pf4j')
6 files changed, 385 insertions, 314 deletions
diff --git a/pf4j/src/main/java/org/pf4j/DefaultPluginFactory.java b/pf4j/src/main/java/org/pf4j/DefaultPluginFactory.java index 2f55cab..db86006 100644 --- a/pf4j/src/main/java/org/pf4j/DefaultPluginFactory.java +++ b/pf4j/src/main/java/org/pf4j/DefaultPluginFactory.java @@ -23,18 +23,16 @@ import java.lang.reflect.Modifier; /** * The default implementation for {@link PluginFactory}. - * It uses {@link Class#newInstance()} method. + * It uses {@link Constructor#newInstance(Object...)} method. * * @author Decebal Suiu */ public class DefaultPluginFactory implements PluginFactory { - private static final Logger log = LoggerFactory.getLogger(DefaultPluginFactory.class); + protected static final Logger log = LoggerFactory.getLogger(DefaultPluginFactory.class); /** - * Creates a plugin instance. If an error occurs than that error is logged and the method returns null. - * @param pluginWrapper - * @return + * Creates a plugin instance. If an error occurs than that error is logged and the method returns {@code null}. */ @Override public Plugin create(final PluginWrapper pluginWrapper) { @@ -58,10 +56,21 @@ public class DefaultPluginFactory implements PluginFactory { return null; } - // create the plugin instance + return createInstance(pluginClass, pluginWrapper); + } + + /** + * Creates a plugin instance. If an error occurs than that error is logged and the method returns {@code null}. + */ + protected Plugin createInstance(Class<?> pluginClass, PluginWrapper pluginWrapper) { try { - Constructor<?> constructor = pluginClass.getConstructor(PluginWrapper.class); - return (Plugin) constructor.newInstance(pluginWrapper); + try { + Constructor<?> constructor = pluginClass.getConstructor(PluginWrapper.class); + return (Plugin) constructor.newInstance(pluginWrapper); + } catch (NoSuchMethodException e) { + Constructor<?> constructor = pluginClass.getConstructor(); + return (Plugin) constructor.newInstance(); + } } catch (Exception e) { log.error(e.getMessage(), e); } diff --git a/pf4j/src/main/java/org/pf4j/Plugin.java b/pf4j/src/main/java/org/pf4j/Plugin.java index e3dd449..29a36ad 100644 --- a/pf4j/src/main/java/org/pf4j/Plugin.java +++ b/pf4j/src/main/java/org/pf4j/Plugin.java @@ -34,13 +34,17 @@ public class Plugin { /** * Wrapper of the plugin. */ + @Deprecated protected PluginWrapper wrapper; /** * Constructor to be used by plugin manager for plugin instantiation. * Your plugins have to provide constructor with this exact signature to * be successfully loaded by manager. + * @deprecated Use application custom {@code PluginContext} instead of {@code PluginWrapper}. + * See demo for more details. */ + @Deprecated public Plugin(final PluginWrapper wrapper) { if (wrapper == null) { throw new IllegalArgumentException("Wrapper cannot be null"); @@ -49,9 +53,13 @@ public class Plugin { this.wrapper = wrapper; } + public Plugin() { + } + /** * Retrieves the wrapper of this plug-in. */ + @Deprecated public final PluginWrapper getWrapper() { return wrapper; } diff --git a/pf4j/src/main/java/org/pf4j/SecurePluginManagerWrapper.java b/pf4j/src/main/java/org/pf4j/SecurePluginManagerWrapper.java index f55b1e6..ee2d681 100644 --- a/pf4j/src/main/java/org/pf4j/SecurePluginManagerWrapper.java +++ b/pf4j/src/main/java/org/pf4j/SecurePluginManagerWrapper.java @@ -1,305 +1,308 @@ -package org.pf4j;
-
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Use this class to wrap the original plugin manager to prevent full access from within plugins.
- * Override AbstractPluginManager.createPluginWrapper to use this class
- * @author Wolfram Haussig
- *
- */
-public class SecurePluginManagerWrapper implements PluginManager {
-
- private static final String PLUGIN_PREFIX = "Plugin ";
- /**
- * the current plugin
- */
- private String currentPluginId;
- /**
- * the original plugin manager
- */
- private PluginManager original;
-
- /**
- * The registered {@link PluginStateListener}s.
- */
- protected List<PluginStateListener> pluginStateListeners = new ArrayList<>();
- /**
- * wrapper for pluginStateListeners
- */
- private PluginStateListenerWrapper listenerWrapper = new PluginStateListenerWrapper();
-
- /**
- * constructor
- * @param original the original plugin manager
- * @param currentPlugin the current pluginId
- */
- public SecurePluginManagerWrapper(PluginManager original, String currentPluginId) {
- this.original = original;
- this.currentPluginId = currentPluginId;
- }
-
- @Override
- public boolean isDevelopment() {
- return original.isDevelopment();
- }
-
- @Override
- public boolean isNotDevelopment() {
- return original.isNotDevelopment();
- }
-
- @Override
- public List<PluginWrapper> getPlugins() {
- return Arrays.asList(getPlugin(currentPluginId));
- }
-
- @Override
- public List<PluginWrapper> getPlugins(PluginState pluginState) {
- return getPlugins().stream().filter(p -> p.getPluginState() == pluginState).collect(Collectors.toList());
- }
-
- @Override
- public List<PluginWrapper> getResolvedPlugins() {
- return getPlugins().stream().filter(p -> p.getPluginState().ordinal() >= PluginState.RESOLVED.ordinal()).collect(Collectors.toList());
- }
-
- @Override
- public List<PluginWrapper> getUnresolvedPlugins() {
- return Collections.emptyList();
- }
-
- @Override
- public List<PluginWrapper> getStartedPlugins() {
- return getPlugins(PluginState.STARTED);
- }
-
- @Override
- public PluginWrapper getPlugin(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.getPlugin(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPlugin for foreign pluginId!");
- }
- }
-
- @Override
- public void loadPlugins() {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute loadPlugins!");
- }
-
- @Override
- public String loadPlugin(Path pluginPath) {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute loadPlugin!");
- }
-
- @Override
- public void startPlugins() {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute startPlugins!");
- }
-
- @Override
- public PluginState startPlugin(String pluginId) {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute startPlugin!");
- }
-
- @Override
- public void stopPlugins() {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute stopPlugins!");
- }
-
- @Override
- public PluginState stopPlugin(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.stopPlugin(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute stopPlugin for foreign pluginId!");
- }
- }
-
- @Override
- public void unloadPlugins() {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute unloadPlugins!");
- }
-
- @Override
- public boolean unloadPlugin(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.unloadPlugin(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute unloadPlugin for foreign pluginId!");
- }
- }
-
- @Override
- public boolean disablePlugin(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.disablePlugin(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute disablePlugin for foreign pluginId!");
- }
- }
-
- @Override
- public boolean enablePlugin(String pluginId) {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute enablePlugin!");
- }
-
- @Override
- public boolean deletePlugin(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.deletePlugin(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute deletePlugin for foreign pluginId!");
- }
- }
-
- @Override
- public ClassLoader getPluginClassLoader(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.getPluginClassLoader(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginClassLoader for foreign pluginId!");
- }
- }
-
- @Override
- public List<Class<?>> getExtensionClasses(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.getExtensionClasses(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClasses for foreign pluginId!");
- }
- }
-
- @Override
- public <T> List<Class<? extends T>> getExtensionClasses(Class<T> type) {
- return getExtensionClasses(type, currentPluginId);
- }
-
- @Override
- public <T> List<Class<? extends T>> getExtensionClasses(Class<T> type, String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.getExtensionClasses(type, pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClasses for foreign pluginId!");
- }
- }
-
- @Override
- public <T> List<T> getExtensions(Class<T> type) {
- return getExtensions(type, currentPluginId);
- }
-
- @Override
- public <T> List<T> getExtensions(Class<T> type, String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.getExtensions(type, pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensions for foreign pluginId!");
- }
- }
-
- @Override
- public List<?> getExtensions(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.getExtensions(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensions for foreign pluginId!");
- }
- }
-
- @Override
- public Set<String> getExtensionClassNames(String pluginId) {
- if (currentPluginId.equals(pluginId)) {
- return original.getExtensionClassNames(pluginId);
- } else {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClassNames for foreign pluginId!");
- }
- }
-
- @Override
- public ExtensionFactory getExtensionFactory() {
- return original.getExtensionFactory();
- }
-
- @Override
- public RuntimeMode getRuntimeMode() {
- return original.getRuntimeMode();
- }
-
- @Override
- public PluginWrapper whichPlugin(Class<?> clazz) {
- ClassLoader classLoader = clazz.getClassLoader();
- PluginWrapper plugin = getPlugin(currentPluginId);
- if (plugin.getPluginClassLoader() == classLoader) {
- return plugin;
- }
- return null;
- }
-
- @Override
- public void addPluginStateListener(PluginStateListener listener) {
- if (pluginStateListeners.isEmpty()) {
- this.original.addPluginStateListener(listenerWrapper);
- }
- pluginStateListeners.add(listener);
- }
-
- @Override
- public void removePluginStateListener(PluginStateListener listener) {
- pluginStateListeners.remove(listener);
- if (pluginStateListeners.isEmpty()) {
- this.original.removePluginStateListener(listenerWrapper);
- }
- }
-
- @Override
- public void setSystemVersion(String version) {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute setSystemVersion!");
- }
-
- @Override
- public String getSystemVersion() {
- return original.getSystemVersion();
- }
-
- @Override
- public Path getPluginsRoot() {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginsRoot!");
- }
-
- @Override
- public List<Path> getPluginsRoots() {
- throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginsRoots!");
- }
-
- @Override
- public VersionManager getVersionManager() {
- return original.getVersionManager();
- }
-
- /**
- * Wrapper for PluginStateListener events. will only propagate events if they match the current pluginId
- * @author Wolfram Haussig
- *
- */
- private class PluginStateListenerWrapper implements PluginStateListener {
-
- @Override
- public void pluginStateChanged(PluginStateEvent event) {
- if (event.getPlugin().getPluginId().equals(currentPluginId)) {
- for (PluginStateListener listener : pluginStateListeners) {
- listener.pluginStateChanged(event);
- }
- }
- }
-
- }
-}
+package org.pf4j; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Use this class to wrap the original plugin manager to prevent full access from within plugins. + * Override AbstractPluginManager.createPluginWrapper to use this class. + * @deprecated Use application custom {@code PluginContext} instead of {@code PluginWrapper} to communicate with {@link Plugin}. + * See demo for more details. + * + * @author Wolfram Haussig + */ +@Deprecated() +public class SecurePluginManagerWrapper implements PluginManager { + + private static final String PLUGIN_PREFIX = "Plugin "; + /** + * the current plugin + */ + private String currentPluginId; + /** + * the original plugin manager + */ + private PluginManager original; + + /** + * The registered {@link PluginStateListener}s. + */ + protected List<PluginStateListener> pluginStateListeners = new ArrayList<>(); + /** + * wrapper for pluginStateListeners + */ + private PluginStateListenerWrapper listenerWrapper = new PluginStateListenerWrapper(); + + /** + * constructor + * @param original the original plugin manager + * @param currentPluginId the current pluginId + */ + public SecurePluginManagerWrapper(PluginManager original, String currentPluginId) { + this.original = original; + this.currentPluginId = currentPluginId; + } + + @Override + public boolean isDevelopment() { + return original.isDevelopment(); + } + + @Override + public boolean isNotDevelopment() { + return original.isNotDevelopment(); + } + + @Override + public List<PluginWrapper> getPlugins() { + return Arrays.asList(getPlugin(currentPluginId)); + } + + @Override + public List<PluginWrapper> getPlugins(PluginState pluginState) { + return getPlugins().stream().filter(p -> p.getPluginState() == pluginState).collect(Collectors.toList()); + } + + @Override + public List<PluginWrapper> getResolvedPlugins() { + return getPlugins().stream().filter(p -> p.getPluginState().ordinal() >= PluginState.RESOLVED.ordinal()).collect(Collectors.toList()); + } + + @Override + public List<PluginWrapper> getUnresolvedPlugins() { + return Collections.emptyList(); + } + + @Override + public List<PluginWrapper> getStartedPlugins() { + return getPlugins(PluginState.STARTED); + } + + @Override + public PluginWrapper getPlugin(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.getPlugin(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPlugin for foreign pluginId!"); + } + } + + @Override + public void loadPlugins() { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute loadPlugins!"); + } + + @Override + public String loadPlugin(Path pluginPath) { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute loadPlugin!"); + } + + @Override + public void startPlugins() { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute startPlugins!"); + } + + @Override + public PluginState startPlugin(String pluginId) { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute startPlugin!"); + } + + @Override + public void stopPlugins() { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute stopPlugins!"); + } + + @Override + public PluginState stopPlugin(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.stopPlugin(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute stopPlugin for foreign pluginId!"); + } + } + + @Override + public void unloadPlugins() { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute unloadPlugins!"); + } + + @Override + public boolean unloadPlugin(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.unloadPlugin(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute unloadPlugin for foreign pluginId!"); + } + } + + @Override + public boolean disablePlugin(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.disablePlugin(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute disablePlugin for foreign pluginId!"); + } + } + + @Override + public boolean enablePlugin(String pluginId) { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute enablePlugin!"); + } + + @Override + public boolean deletePlugin(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.deletePlugin(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute deletePlugin for foreign pluginId!"); + } + } + + @Override + public ClassLoader getPluginClassLoader(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.getPluginClassLoader(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginClassLoader for foreign pluginId!"); + } + } + + @Override + public List<Class<?>> getExtensionClasses(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.getExtensionClasses(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClasses for foreign pluginId!"); + } + } + + @Override + public <T> List<Class<? extends T>> getExtensionClasses(Class<T> type) { + return getExtensionClasses(type, currentPluginId); + } + + @Override + public <T> List<Class<? extends T>> getExtensionClasses(Class<T> type, String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.getExtensionClasses(type, pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClasses for foreign pluginId!"); + } + } + + @Override + public <T> List<T> getExtensions(Class<T> type) { + return getExtensions(type, currentPluginId); + } + + @Override + public <T> List<T> getExtensions(Class<T> type, String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.getExtensions(type, pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensions for foreign pluginId!"); + } + } + + @Override + public List<?> getExtensions(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.getExtensions(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensions for foreign pluginId!"); + } + } + + @Override + public Set<String> getExtensionClassNames(String pluginId) { + if (currentPluginId.equals(pluginId)) { + return original.getExtensionClassNames(pluginId); + } else { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClassNames for foreign pluginId!"); + } + } + + @Override + public ExtensionFactory getExtensionFactory() { + return original.getExtensionFactory(); + } + + @Override + public RuntimeMode getRuntimeMode() { + return original.getRuntimeMode(); + } + + @Override + public PluginWrapper whichPlugin(Class<?> clazz) { + ClassLoader classLoader = clazz.getClassLoader(); + PluginWrapper plugin = getPlugin(currentPluginId); + if (plugin.getPluginClassLoader() == classLoader) { + return plugin; + } + return null; + } + + @Override + public void addPluginStateListener(PluginStateListener listener) { + if (pluginStateListeners.isEmpty()) { + this.original.addPluginStateListener(listenerWrapper); + } + pluginStateListeners.add(listener); + } + + @Override + public void removePluginStateListener(PluginStateListener listener) { + pluginStateListeners.remove(listener); + if (pluginStateListeners.isEmpty()) { + this.original.removePluginStateListener(listenerWrapper); + } + } + + @Override + public void setSystemVersion(String version) { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute setSystemVersion!"); + } + + @Override + public String getSystemVersion() { + return original.getSystemVersion(); + } + + @Override + public Path getPluginsRoot() { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginsRoot!"); + } + + @Override + public List<Path> getPluginsRoots() { + throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginsRoots!"); + } + + @Override + public VersionManager getVersionManager() { + return original.getVersionManager(); + } + + /** + * Wrapper for PluginStateListener events. will only propagate events if they match the current pluginId + * @author Wolfram Haussig + * + */ + private class PluginStateListenerWrapper implements PluginStateListener { + + @Override + public void pluginStateChanged(PluginStateEvent event) { + if (event.getPlugin().getPluginId().equals(currentPluginId)) { + for (PluginStateListener listener : pluginStateListeners) { + listener.pluginStateChanged(event); + } + } + } + + } +} diff --git a/pf4j/src/test/java/org/pf4j/DefaultPluginFactoryTest.java b/pf4j/src/test/java/org/pf4j/DefaultPluginFactoryTest.java index 3107083..c453e38 100644 --- a/pf4j/src/test/java/org/pf4j/DefaultPluginFactoryTest.java +++ b/pf4j/src/test/java/org/pf4j/DefaultPluginFactoryTest.java @@ -17,6 +17,7 @@ package org.pf4j; import org.junit.jupiter.api.Test; import org.pf4j.test.AnotherFailTestPlugin; +import org.pf4j.test.AnotherTestPlugin; import org.pf4j.test.FailTestPlugin; import org.pf4j.test.TestPlugin; @@ -49,6 +50,22 @@ public class DefaultPluginFactoryTest { } @Test + public void pluginConstructorNoParameters() { + PluginDescriptor pluginDescriptor = mock(PluginDescriptor.class); + when(pluginDescriptor.getPluginClass()).thenReturn(AnotherTestPlugin.class.getName()); + + PluginWrapper pluginWrapper = mock(PluginWrapper.class); + when(pluginWrapper.getDescriptor()).thenReturn(pluginDescriptor); + when(pluginWrapper.getPluginClassLoader()).thenReturn(getClass().getClassLoader()); + + PluginFactory pluginFactory = new DefaultPluginFactory(); + + Plugin result = pluginFactory.create(pluginWrapper); + assertNotNull(result); + assertThat(result, instanceOf(AnotherTestPlugin.class)); + } + + @Test public void testCreateFail() { PluginDescriptor pluginDescriptor = mock(PluginDescriptor.class); when(pluginDescriptor.getPluginClass()).thenReturn(FailTestPlugin.class.getName()); diff --git a/pf4j/src/test/java/org/pf4j/test/AnotherFailTestPlugin.java b/pf4j/src/test/java/org/pf4j/test/AnotherFailTestPlugin.java index d97b32c..79aa41b 100644 --- a/pf4j/src/test/java/org/pf4j/test/AnotherFailTestPlugin.java +++ b/pf4j/src/test/java/org/pf4j/test/AnotherFailTestPlugin.java @@ -19,7 +19,7 @@ import org.pf4j.Plugin; /** * A wrong {@link org.pf4j.Plugin}. - * It's wrong because it doesn't contain a constructor with one parameter ({@link org.pf4j.PluginWrapper} as parameter type). + * It's wrong because it calls super constructor with {@code null} for ({@link org.pf4j.PluginWrapper} parameter). * * @author Mario Franco */ diff --git a/pf4j/src/test/java/org/pf4j/test/AnotherTestPlugin.java b/pf4j/src/test/java/org/pf4j/test/AnotherTestPlugin.java new file mode 100644 index 0000000..f2e10c1 --- /dev/null +++ b/pf4j/src/test/java/org/pf4j/test/AnotherTestPlugin.java @@ -0,0 +1,34 @@ +/* + * 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.test; + +import org.pf4j.Plugin; + +/** + * A simple {@link Plugin}. + * + * In real applications you don't need to create a plugin like this if you are not interested in lifecycle events. + * {@code PF4J} will automatically create a plugin similar to this (empty / dummy) if no class plugin is specified. + * + * @author Decebal Suiu + */ +public class AnotherTestPlugin extends Plugin { + + public AnotherTestPlugin() { + super(); + } + +} |