From: Sebastian Schuberth Date: Sun, 23 Jun 2024 19:59:16 +0000 (+0200) Subject: Consolidate demo projects in the "demo" directory (#584) X-Git-Tag: release-3.12.0~11 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=acf0a9f26190c49f508c5b187e9f2c671874d90d;p=pf4j.git Consolidate demo projects in the "demo" directory (#584) --- diff --git a/demo/api/pom.xml b/demo/api/pom.xml deleted file mode 100644 index 615aa30..0000000 --- a/demo/api/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - org.pf4j.demo - pf4j-demo-parent - 3.12.0-SNAPSHOT - - - 4.0.0 - pf4j-demo-api - 3.12.0-SNAPSHOT - jar - Demo Api - - - - - maven-deploy-plugin - - true - - - - - - - - org.pf4j - pf4j - ${project.version} - - provided - - - - 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 deleted file mode 100644 index a2f76fc..0000000 --- a/demo/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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/Greeting.java b/demo/api/src/main/java/org/pf4j/demo/api/Greeting.java deleted file mode 100644 index 828d61b..0000000 --- a/demo/api/src/main/java/org/pf4j/demo/api/Greeting.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.ExtensionPoint; - -/** - * @author Decebal Suiu - */ -public interface Greeting extends ExtensionPoint { - - String getGreeting(); - -} 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 deleted file mode 100644 index 0a7506f..0000000 --- a/demo/api/src/main/java/org/pf4j/demo/api/PluginContext.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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/pom.xml b/demo/app/pom.xml deleted file mode 100644 index 963bb60..0000000 --- a/demo/app/pom.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - org.pf4j.demo - pf4j-demo-parent - 3.12.0-SNAPSHOT - - - 4.0.0 - pf4j-demo-app - 3.12.0-SNAPSHOT - jar - Demo App - - - org.pf4j.demo.Boot - - - - - - maven-assembly-plugin - 2.3 - - - src/main/assembly/assembly.xml - - false - - - - make-assembly - package - - attached - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - lib/ - ${main.class} - - - - - - - maven-deploy-plugin - - true - - - - - - - - org.pf4j - pf4j - ${project.version} - - - - org.pf4j.demo - pf4j-demo-api - ${project.version} - - - - - org.slf4j - slf4j-simple - ${slf4j.version} - - - - commons-lang - commons-lang - 2.4 - - - - diff --git a/demo/app/src/main/assembly/assembly.xml b/demo/app/src/main/assembly/assembly.xml deleted file mode 100644 index 77c66b4..0000000 --- a/demo/app/src/main/assembly/assembly.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - app - - dir - zip - - false - - - false - lib - - *:jar:* - - - - - - ${project.build.directory} - - - *.jar - - - *-javadoc.jar - *-sources.jar - - - - - diff --git a/demo/app/src/main/java/org/pf4j/demo/Boot.java b/demo/app/src/main/java/org/pf4j/demo/Boot.java deleted file mode 100644 index d101104..0000000 --- a/demo/app/src/main/java/org/pf4j/demo/Boot.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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.apache.commons.lang.StringUtils; -import org.pf4j.PluginManager; -import org.pf4j.PluginWrapper; -import org.pf4j.demo.api.Greeting; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.Set; - -/** - * A boot class that start the demo. - * - * @author Decebal Suiu - */ -public class Boot { - - private static final Logger log = LoggerFactory.getLogger(Boot.class); - - public static void main(String[] args) { - // print logo - printLogo(); - - // create the plugin manager - PluginManager pluginManager = new DemoPluginManager(); - - // load the plugins - pluginManager.loadPlugins(); - - // enable a disabled plugin -// pluginManager.enablePlugin("welcome-plugin"); - - // start (active/resolved) the plugins - pluginManager.startPlugins(); - - // retrieves the extensions for Greeting extension point - List greetings = pluginManager.getExtensions(Greeting.class); - log.info("Found {} extensions for extension point '{}'", greetings.size(), Greeting.class.getName()); - for (Greeting greeting : greetings) { - log.info(">>> {}", greeting.getGreeting()); - } - - // print extensions from classpath (non plugin) - log.info("Extensions added by classpath:"); - Set extensionClassNames = pluginManager.getExtensionClassNames(null); - for (String extension : extensionClassNames) { - log.info(" {}", extension); - } - - log.info("Extension classes by classpath:"); - List> greetingsClasses = pluginManager.getExtensionClasses(Greeting.class); - for (Class greeting : greetingsClasses) { - log.info(" Class: {}", greeting.getCanonicalName()); - } - - // print extensions ids for each started plugin - List startedPlugins = pluginManager.getStartedPlugins(); - for (PluginWrapper plugin : startedPlugins) { - String pluginId = plugin.getDescriptor().getPluginId(); - log.info("Extensions added by plugin '{}}':", pluginId); - extensionClassNames = pluginManager.getExtensionClassNames(pluginId); - for (String extension : extensionClassNames) { - log.info(" {}", extension); - } - } - - // print the extensions instances for Greeting extension point for each started plugin - for (PluginWrapper plugin : startedPlugins) { - String pluginId = plugin.getDescriptor().getPluginId(); - log.info("Extensions instances added by plugin '{}' for extension point '{}':", pluginId, Greeting.class.getName()); - List extensions = pluginManager.getExtensions(Greeting.class, pluginId); - for (Object extension : extensions) { - log.info(" {}", extension); - } - } - - // print extensions instances from classpath (non plugin) - log.info("Extensions instances added by classpath:"); - List extensions = pluginManager.getExtensions((String) null); - for (Object extension : extensions) { - log.info(" {}", extension); - } - - // print extensions instances for each started plugin - for (PluginWrapper plugin : startedPlugins) { - String pluginId = plugin.getDescriptor().getPluginId(); - log.info("Extensions instances added by plugin '{}':", pluginId); - extensions = pluginManager.getExtensions(pluginId); - for (Object extension : extensions) { - log.info(" {}", extension); - } - } - - // stop the plugins - pluginManager.stopPlugins(); - /* - Runtime.getRuntime().addShutdownHook(new Thread() { - - @Override - public void run() { - pluginManager.stopPlugins(); - } - - }); - */ - } - - private static void printLogo() { - log.info(StringUtils.repeat("#", 40)); - log.info(StringUtils.center("PF4J-DEMO", 40)); - log.info(StringUtils.repeat("#", 40)); - } - -} diff --git a/demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java b/demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java deleted file mode 100644 index bdae2d6..0000000 --- a/demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 java.lang.reflect.Constructor; -import org.pf4j.DefaultPluginFactory; -import org.pf4j.Plugin; -import org.pf4j.PluginWrapper; -import org.pf4j.demo.api.PluginContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class DemoPluginFactory extends DefaultPluginFactory { - - private static final Logger log = LoggerFactory.getLogger(DemoPluginFactory.class); - - @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 deleted file mode 100644 index 2571a3e..0000000 --- a/demo/app/src/main/java/org/pf4j/demo/DemoPluginManager.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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/app/src/main/java/org/pf4j/demo/HowdyGreeting.java b/demo/app/src/main/java/org/pf4j/demo/HowdyGreeting.java deleted file mode 100644 index 050934d..0000000 --- a/demo/app/src/main/java/org/pf4j/demo/HowdyGreeting.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.demo.api.Greeting; - -/** - * A Service Implementation (no @Extension) declared via Java Service Provider mechanism (using META-INF/services). - * - * @author Decebal Suiu - */ -public class HowdyGreeting implements Greeting { - - @Override - public String getGreeting() { - return "Howdy"; - } - -} diff --git a/demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java b/demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java deleted file mode 100644 index 1341b77..0000000 --- a/demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.Extension; -import org.pf4j.demo.api.Greeting; - -/** - * @author Decebal Suiu - */ -@Extension -public class WhazzupGreeting implements Greeting { - - @Override - public String getGreeting() { - return "Whazzup"; - } - -} diff --git a/demo/app/src/main/resources/META-INF/services/org.pf4j.demo.api.Greeting b/demo/app/src/main/resources/META-INF/services/org.pf4j.demo.api.Greeting deleted file mode 100644 index 615a943..0000000 --- a/demo/app/src/main/resources/META-INF/services/org.pf4j.demo.api.Greeting +++ /dev/null @@ -1 +0,0 @@ -org.pf4j.demo.HowdyGreeting diff --git a/demo/app/src/main/resources/simplelogger.properties b/demo/app/src/main/resources/simplelogger.properties deleted file mode 100755 index 40302dd..0000000 --- a/demo/app/src/main/resources/simplelogger.properties +++ /dev/null @@ -1,39 +0,0 @@ -# SLF4J's SimpleLogger configuration file -# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. - -# Default logging detail level for all instances of SimpleLogger. -# Must be one of ("trace", "debug", "info", "warn", or "error"). -# If not specified, defaults to "info". -org.slf4j.simpleLogger.defaultLogLevel=debug - -# Logging detail level for a SimpleLogger instance named "xxxxx". -# Must be one of ("trace", "debug", "info", "warn", or "error"). -# If not specified, the default logging detail level is used. -#org.slf4j.simpleLogger.log.xxxxx= -# !!! Uncomment below loggers when you are in trouble -#org.slf4j.simpleLogger.log.org.pf4j.PluginClassLoader=trace -#org.slf4j.simpleLogger.log.org.pf4j.AbstractExtensionFinder=trace - -# Set to true if you want the current date and time to be included in output messages. -# Default is false, and will output the number of milliseconds elapsed since startup. -#org.slf4j.simpleLogger.showDateTime=false -org.slf4j.simpleLogger.showDateTime=true - -# The date and time format to be used in the output messages. -# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. -# If the format is not specified or is invalid, the default format is used. -# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. -#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z -org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss - -# Set to true if you want to output the current thread name. -# Defaults to true. -#org.slf4j.simpleLogger.showThreadName=true - -# Set to true if you want the Logger instance name to be included in output messages. -# Defaults to true. -#org.slf4j.simpleLogger.showLogName=true - -# Set to true if you want the last component of the name to be included in output messages. -# Defaults to false. -#org.slf4j.simpleLogger.showShortLogName=false diff --git a/demo/gradle/.gitignore b/demo/gradle/.gitignore new file mode 100644 index 0000000..12ddda9 --- /dev/null +++ b/demo/gradle/.gitignore @@ -0,0 +1,3 @@ +build +.gradle +.idea diff --git a/demo/gradle/README.md b/demo/gradle/README.md new file mode 100644 index 0000000..5c8bc80 --- /dev/null +++ b/demo/gradle/README.md @@ -0,0 +1,62 @@ +# PF4J Gradle Demo + +This demo assumes that you know the basics of Gradle (Please look at [gradle](https://gradle.org/) for more info) + +### Setup/Build + +1. Clone the repo +2. Go to demo_gradle `cd demo_gradle` +3. run `./gradlew build` + +* This will produce one jar, named app-plugin-demo-uberjar.jar, located in the `app/build/libs/` directory and three plugins zips located in `build/plugins` directory. +* The plugins are `plugin-hello-plugin-0.0.1.zip`, `plugin-KotlinPlugin-1.0.0.zip` and `plugin-welcome-plugin-0.0.1.zip` + +### Run the demo + +1. Run + +``` + ./gradlew app:run +``` + +2. The demo's output should look similar to: (Please see `Boot#main()` for more details) +``` +[main] INFO org.pf4j.demo.Boot - ######################################## +[main] INFO org.pf4j.demo.Boot - PF4J-DEMO +[main] INFO org.pf4j.demo.Boot - ######################################## +[main] INFO org.pf4j.DefaultPluginStatusProvider - Enabled plugins: [] +[main] INFO org.pf4j.DefaultPluginStatusProvider - Disabled plugins: [] +[main] INFO org.pf4j.DefaultPluginManager - PF4J version 3.1.0 in 'deployment' mode +[main] INFO org.pf4j.util.FileUtils - Expanded plugin zip 'plugin-hello-plugin-0.0.1.zip' in 'plugin-hello-plugin-0.0.1' +[main] INFO org.pf4j.util.FileUtils - Expanded plugin zip 'plugin-KotlinPlugin-1.0.0.zip' in 'plugin-KotlinPlugin-1.0.0' +[main] INFO org.pf4j.util.FileUtils - Expanded plugin zip 'plugin-welcome-plugin-0.0.1.zip' in 'plugin-welcome-plugin-0.0.1' +[main] INFO org.pf4j.AbstractPluginManager - Plugin 'welcome-plugin@0.0.1' resolved +[main] INFO org.pf4j.AbstractPluginManager - Plugin 'KotlinPlugin@1.0.0' resolved +[main] INFO org.pf4j.AbstractPluginManager - Plugin 'hello-plugin@0.0.1' resolved +[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'welcome-plugin@0.0.1' +[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WelcomePlugin.start() +[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WELCOMEPLUGIN +[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'KotlinPlugin@1.0.0' +[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KotlinPlugin.start() +[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KOTLINPLUGIN +[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'hello-plugin@0.0.1' +[main] INFO org.pf4j.demo.hello.HelloPlugin - HelloPlugin.start() +[main] INFO org.pf4j.demo.Boot - Plugindirectory: +[main] INFO org.pf4j.demo.Boot - ../build/plugins + +[main] INFO org.pf4j.demo.Boot - Found 4 extensions for extension point 'org.pf4j.demo.api.Greeting' +[main] INFO org.pf4j.demo.Boot - >>> Whazzup +[main] INFO org.pf4j.demo.Boot - >>> Welcome +[main] INFO org.pf4j.demo.Boot - >>> KotlinGreetings +[main] INFO org.pf4j.demo.Boot - >>> Hello +[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'welcome-plugin': +[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'KotlinPlugin': +[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'hello-plugin': +[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'hello-plugin@0.0.1' +[main] INFO org.pf4j.demo.hello.HelloPlugin - HelloPlugin.stop() +[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'KotlinPlugin@1.0.0' +[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KotlinPlugin.stop() +[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'welcome-plugin@0.0.1' +[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WelcomePlugin.stop() +``` + diff --git a/demo/gradle/api/.gitignore b/demo/gradle/api/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/demo/gradle/api/.gitignore @@ -0,0 +1 @@ +build diff --git a/demo/gradle/api/build.gradle b/demo/gradle/api/build.gradle new file mode 100644 index 0000000..a758f70 --- /dev/null +++ b/demo/gradle/api/build.gradle @@ -0,0 +1,6 @@ +dependencies { + implementation group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}" + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' + + testImplementation group: 'junit', name: 'junit', version: '4.+' +} diff --git a/demo/gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java b/demo/gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java new file mode 100644 index 0000000..828d61b --- /dev/null +++ b/demo/gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java @@ -0,0 +1,27 @@ +/* + * 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.ExtensionPoint; + +/** + * @author Decebal Suiu + */ +public interface Greeting extends ExtensionPoint { + + String getGreeting(); + +} diff --git a/demo/gradle/app/.gitignore b/demo/gradle/app/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/demo/gradle/app/.gitignore @@ -0,0 +1 @@ +build diff --git a/demo/gradle/app/build.gradle b/demo/gradle/app/build.gradle new file mode 100644 index 0000000..eaab92a --- /dev/null +++ b/demo/gradle/app/build.gradle @@ -0,0 +1,35 @@ +apply plugin: 'application' + +mainClassName = 'org.pf4j.demo.Boot' +run { + systemProperty 'pf4j.pluginsDir', '../build/plugins' +} + +dependencies { + implementation project(':api') + implementation group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}" + annotationProcessor(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' + implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' + + testImplementation group: 'junit', name: 'junit', version: '4.+' +} + +task uberjar(type: Jar, dependsOn: ['compileJava']) { + zip64 true + from configurations.runtimeClasspath.asFileTree.files.collect { + exclude "META-INF/*.SF" + exclude "META-INF/*.DSA" + exclude "META-INF/*.RSA" + zipTree(it) + } + from files(sourceSets.main.output.classesDirs) + from files(sourceSets.main.resources) + manifest { + attributes 'Main-Class': mainClassName + } + + archiveBaseName = "${project.name}-plugin-demo" + archiveClassifier = "uberjar" +} + diff --git a/demo/gradle/app/src/main/java/org/pf4j/demo/Boot.java b/demo/gradle/app/src/main/java/org/pf4j/demo/Boot.java new file mode 100644 index 0000000..ebc5c31 --- /dev/null +++ b/demo/gradle/app/src/main/java/org/pf4j/demo/Boot.java @@ -0,0 +1,112 @@ +/* + * 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.apache.commons.lang3.StringUtils; +import org.pf4j.CompoundPluginDescriptorFinder; +import org.pf4j.ManifestPluginDescriptorFinder; +import org.pf4j.PropertiesPluginDescriptorFinder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.pf4j.DefaultPluginManager; +import org.pf4j.PluginManager; +import org.pf4j.PluginWrapper; +import org.pf4j.demo.api.Greeting; + +import java.util.List; + +/** + * A boot class that start the demo. + * + * @author Decebal Suiu + */ +public class Boot { + private static final Logger logger = LoggerFactory.getLogger(Boot.class); + + public static void main(String[] args) { + // print logo + printLogo(); + + // create the plugin manager + final PluginManager pluginManager = new DefaultPluginManager() { + @Override + protected CompoundPluginDescriptorFinder createPluginDescriptorFinder() { + return new CompoundPluginDescriptorFinder() + // Demo is using the Manifest file + // PropertiesPluginDescriptorFinder is commented out just to avoid error log + //.add(new PropertiesPluginDescriptorFinder()) + .add(new ManifestPluginDescriptorFinder()); + } + }; + + // load the plugins + pluginManager.loadPlugins(); + + // enable a disabled plugin +// pluginManager.enablePlugin("welcome-plugin"); + + // start (active/resolved) the plugins + pluginManager.startPlugins(); + + logger.info("Plugindirectory: "); + logger.info("\t" + System.getProperty("pf4j.pluginsDir", "plugins") + "\n"); + + // retrieves the extensions for Greeting extension point + List greetings = pluginManager.getExtensions(Greeting.class); + logger.info(String.format("Found %d extensions for extension point '%s'", greetings.size(), Greeting.class.getName())); + for (Greeting greeting : greetings) { + logger.info(">>> " + greeting.getGreeting()); + } + + // // print extensions from classpath (non plugin) + // logger.info(String.format("Extensions added by classpath:")); + // Set extensionClassNames = pluginManager.getExtensionClassNames(null); + // for (String extension : extensionClassNames) { + // logger.info(" " + extension); + // } + + // print extensions for each started plugin + List startedPlugins = pluginManager.getStartedPlugins(); + for (PluginWrapper plugin : startedPlugins) { + String pluginId = plugin.getDescriptor().getPluginId(); + logger.info(String.format("Extensions added by plugin '%s':", pluginId)); + // extensionClassNames = pluginManager.getExtensionClassNames(pluginId); + // for (String extension : extensionClassNames) { + // logger.info(" " + extension); + // } + } + + // stop the plugins + pluginManager.stopPlugins(); + /* + Runtime.getRuntime().addShutdownHook(new Thread() { + + @Override + public void run() { + pluginManager.stopPlugins(); + } + + }); + */ + } + + private static void printLogo() { + logger.info(StringUtils.repeat("#", 40)); + logger.info(StringUtils.center("PF4J-DEMO", 40)); + logger.info(StringUtils.repeat("#", 40)); + } + +} diff --git a/demo/gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java b/demo/gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java new file mode 100644 index 0000000..1341b77 --- /dev/null +++ b/demo/gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java @@ -0,0 +1,32 @@ +/* + * 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.Extension; +import org.pf4j.demo.api.Greeting; + +/** + * @author Decebal Suiu + */ +@Extension +public class WhazzupGreeting implements Greeting { + + @Override + public String getGreeting() { + return "Whazzup"; + } + +} diff --git a/demo/gradle/app/src/main/resources/log4j.properties b/demo/gradle/app/src/main/resources/log4j.properties new file mode 100644 index 0000000..f42e226 --- /dev/null +++ b/demo/gradle/app/src/main/resources/log4j.properties @@ -0,0 +1,16 @@ +log4j.rootLogger=DEBUG, Console + +# +# PF4J log +# +log4j.logger.org.pf4j=DEBUG, Console +log4j.logger.org.pf4j.PluginClassLoader=WARN, Console +log4j.additivity.org.pf4j=false + +# +# Appenders +# +log4j.appender.Console=org.apache.log4j.ConsoleAppender +log4j.appender.Console.layout=org.apache.log4j.PatternLayout +#log4j.appender.Console.layout.conversionPattern=%-5p - %-32.32c{1} - %m\n +log4j.appender.Console.layout.ConversionPattern=%d %p %c - %m%n diff --git a/demo/gradle/build.gradle b/demo/gradle/build.gradle new file mode 100644 index 0000000..9968360 --- /dev/null +++ b/demo/gradle/build.gradle @@ -0,0 +1,14 @@ +subprojects { + apply plugin: 'java' + + repositories { + mavenLocal() + mavenCentral() + } +} +// plugin location +ext.pluginsDir = rootProject.buildDir.path + '/plugins' + +task build(dependsOn: [':app:uberjar']) + + diff --git a/demo/gradle/gradle.properties b/demo/gradle/gradle.properties new file mode 100644 index 0000000..4000315 --- /dev/null +++ b/demo/gradle/gradle.properties @@ -0,0 +1,2 @@ +# PF4J +pf4jVersion=3.1.0 diff --git a/demo/gradle/gradle/wrapper/gradle-wrapper.jar b/demo/gradle/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e644113 Binary files /dev/null and b/demo/gradle/gradle/wrapper/gradle-wrapper.jar differ diff --git a/demo/gradle/gradle/wrapper/gradle-wrapper.properties b/demo/gradle/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a441313 --- /dev/null +++ b/demo/gradle/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/demo/gradle/gradlew b/demo/gradle/gradlew new file mode 100755 index 0000000..b740cf1 --- /dev/null +++ b/demo/gradle/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original 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 +# +# https://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. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/demo/gradle/gradlew.bat b/demo/gradle/gradlew.bat new file mode 100644 index 0000000..7101f8e --- /dev/null +++ b/demo/gradle/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/demo/gradle/plugins/build.gradle b/demo/gradle/plugins/build.gradle new file mode 100644 index 0000000..4b03210 --- /dev/null +++ b/demo/gradle/plugins/build.gradle @@ -0,0 +1,33 @@ +subprojects { + jar { + manifest { + attributes 'Plugin-Class': "${pluginClass}", + 'Plugin-Id': "${pluginId}", + 'Plugin-Version': "${archiveVersion}", + 'Plugin-Provider': "${pluginProvider}", + 'Plugin-Dependencies': "${pluginDependencies}" + } + } + + task plugin(type: Jar) { + archiveBaseName = "plugin-${pluginId}" + into('classes') { + with jar + } + into('lib') { + from configurations.runtimeClasspath + } + archiveExtension ='zip' + } + + task assemblePlugin(type: Copy) { + from plugin + into pluginsDir + } +} + +task assemblePlugins(type: Copy) { + dependsOn subprojects.assemblePlugin +} + +build.dependsOn project.tasks.assemblePlugins diff --git a/demo/gradle/plugins/disabled.txt b/demo/gradle/plugins/disabled.txt new file mode 100644 index 0000000..45f1801 --- /dev/null +++ b/demo/gradle/plugins/disabled.txt @@ -0,0 +1,6 @@ +######################################## +# - load all plugins except these +# - add one plugin id on each line +# - put this file in plugins folder +######################################## +#welcome-plugin diff --git a/demo/gradle/plugins/enabled.txt b/demo/gradle/plugins/enabled.txt new file mode 100644 index 0000000..3d76b2f --- /dev/null +++ b/demo/gradle/plugins/enabled.txt @@ -0,0 +1,6 @@ +######################################## +# - load only these plugins +# - add one plugin id on each line +# - put this file in plugins folder +######################################## +#welcome-plugin diff --git a/demo/gradle/plugins/plugin1/.gitignore b/demo/gradle/plugins/plugin1/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/demo/gradle/plugins/plugin1/.gitignore @@ -0,0 +1 @@ +build diff --git a/demo/gradle/plugins/plugin1/build.gradle b/demo/gradle/plugins/plugin1/build.gradle new file mode 100644 index 0000000..78eef47 --- /dev/null +++ b/demo/gradle/plugins/plugin1/build.gradle @@ -0,0 +1,11 @@ +dependencies { + // compileOnly important!!! We do not want to put the api into the zip file since the main program has it already! + compileOnly project(':api') + compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") { + exclude group: "org.slf4j" + } + annotationProcessor(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' + implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' + testImplementation group: 'junit', name: 'junit', version: '4.+' +} diff --git a/demo/gradle/plugins/plugin1/gradle.properties b/demo/gradle/plugins/plugin1/gradle.properties new file mode 100644 index 0000000..2edd800 --- /dev/null +++ b/demo/gradle/plugins/plugin1/gradle.properties @@ -0,0 +1,6 @@ +version=0.0.1 + +pluginId=welcome-plugin +pluginClass=org.pf4j.demo.welcome.WelcomePlugin +pluginProvider=Decebal Suiu +pluginDependencies= diff --git a/demo/gradle/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java b/demo/gradle/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java new file mode 100644 index 0000000..aaf1804 --- /dev/null +++ b/demo/gradle/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java @@ -0,0 +1,59 @@ +/* + * 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.welcome; + +import org.apache.commons.lang3.StringUtils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.pf4j.Extension; +import org.pf4j.Plugin; +import org.pf4j.PluginWrapper; +import org.pf4j.demo.api.Greeting; + +/** + * @author Decebal Suiu + */ +public class WelcomePlugin extends Plugin { + + private static final Logger logger = LoggerFactory.getLogger(WelcomePlugin.class); + + public WelcomePlugin(PluginWrapper wrapper) { + super(wrapper); + } + + @Override + public void start() { + logger.info("WelcomePlugin.start()"); + logger.info(StringUtils.upperCase("WelcomePlugin")); + } + + @Override + public void stop() { + logger.info("WelcomePlugin.stop()"); + } + + @Extension + public static class WelcomeGreeting implements Greeting { + + @Override + public String getGreeting() { + return "Welcome"; + } + + } + +} diff --git a/demo/gradle/plugins/plugin2/.gitignore b/demo/gradle/plugins/plugin2/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/demo/gradle/plugins/plugin2/.gitignore @@ -0,0 +1 @@ +build diff --git a/demo/gradle/plugins/plugin2/build.gradle b/demo/gradle/plugins/plugin2/build.gradle new file mode 100644 index 0000000..78eef47 --- /dev/null +++ b/demo/gradle/plugins/plugin2/build.gradle @@ -0,0 +1,11 @@ +dependencies { + // compileOnly important!!! We do not want to put the api into the zip file since the main program has it already! + compileOnly project(':api') + compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") { + exclude group: "org.slf4j" + } + annotationProcessor(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' + implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' + testImplementation group: 'junit', name: 'junit', version: '4.+' +} diff --git a/demo/gradle/plugins/plugin2/gradle.properties b/demo/gradle/plugins/plugin2/gradle.properties new file mode 100644 index 0000000..ef70127 --- /dev/null +++ b/demo/gradle/plugins/plugin2/gradle.properties @@ -0,0 +1,6 @@ +version=0.0.1 + +pluginId=hello-plugin +pluginClass=org.pf4j.demo.hello.HelloPlugin +pluginProvider=Decebal Suiu +pluginDependencies= diff --git a/demo/gradle/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java b/demo/gradle/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java new file mode 100644 index 0000000..f9c7797 --- /dev/null +++ b/demo/gradle/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java @@ -0,0 +1,57 @@ +/* + * 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.hello; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.pf4j.Extension; +import org.pf4j.Plugin; +import org.pf4j.PluginWrapper; +import org.pf4j.demo.api.Greeting; + +/** + * A very simple plugin. + * + * @author Decebal Suiu + */ +public class HelloPlugin extends Plugin { + private static final Logger logger = LoggerFactory.getLogger(HelloPlugin.class); + + public HelloPlugin(PluginWrapper wrapper) { + super(wrapper); + } + + @Override + public void start() { + logger.info("HelloPlugin.start()"); + } + + @Override + public void stop() { + logger.info("HelloPlugin.stop()"); + } + + @Extension(ordinal=1) + public static class HelloGreeting implements Greeting { + + @Override + public String getGreeting() { + return "Hello"; + } + + } + +} diff --git a/demo/gradle/plugins/plugin3/build.gradle b/demo/gradle/plugins/plugin3/build.gradle new file mode 100644 index 0000000..4371251 --- /dev/null +++ b/demo/gradle/plugins/plugin3/build.gradle @@ -0,0 +1,30 @@ +buildscript { + ext.kotlin_version = '1.9.24' + + repositories { + mavenCentral() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +apply plugin: 'kotlin' +apply plugin: 'kotlin-kapt' + +repositories { + mavenCentral() +} + +dependencies { + compileOnly project(':api') + compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") { + exclude group: "org.slf4j" + } + kapt(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' + implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + + testImplementation group: 'junit', name: 'junit', version: '4.+' +} diff --git a/demo/gradle/plugins/plugin3/gradle.properties b/demo/gradle/plugins/plugin3/gradle.properties new file mode 100644 index 0000000..a04b609 --- /dev/null +++ b/demo/gradle/plugins/plugin3/gradle.properties @@ -0,0 +1,6 @@ +version=1.0.0 + +pluginId=KotlinPlugin +pluginClass=org.pf4j.demo.kotlin.KotlinPlugin +pluginProvider=Anindya Chatterjee +pluginDependencies= diff --git a/demo/gradle/plugins/plugin3/src/main/kotlin/org/pf4j/demo/kotlin/KotlinPlugin.kt b/demo/gradle/plugins/plugin3/src/main/kotlin/org/pf4j/demo/kotlin/KotlinPlugin.kt new file mode 100644 index 0000000..2b2bc17 --- /dev/null +++ b/demo/gradle/plugins/plugin3/src/main/kotlin/org/pf4j/demo/kotlin/KotlinPlugin.kt @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2017 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.kotlin + +import org.apache.commons.lang3.StringUtils +import org.slf4j.LoggerFactory +import org.pf4j.Extension +import org.pf4j.Plugin +import org.pf4j.PluginWrapper +import org.pf4j.demo.api.Greeting + +/** + * A sample plugin written in Kotlin + * + * @author Anindya Chatterjee + */ +class KotlinPlugin(wrapper: PluginWrapper) : Plugin(wrapper) { + private val logger = LoggerFactory.getLogger(KotlinPlugin::class.java) + + override fun start() { + logger.info("KotlinPlugin.start()") + logger.info(StringUtils.upperCase("KotlinPlugin")) + } + + override fun stop() { + logger.info("KotlinPlugin.stop()") + } +} + +@Extension +class KotlinGreeting : Greeting { + override fun getGreeting(): String { + return "KotlinGreetings" + } +} diff --git a/demo/gradle/settings.gradle b/demo/gradle/settings.gradle new file mode 100644 index 0000000..828e80a --- /dev/null +++ b/demo/gradle/settings.gradle @@ -0,0 +1,8 @@ +include 'api' +include 'app' + +include 'plugins' + +include 'plugins:plugin1' +include 'plugins:plugin2' +include 'plugins:plugin3' diff --git a/demo/maven/api/pom.xml b/demo/maven/api/pom.xml new file mode 100644 index 0000000..615aa30 --- /dev/null +++ b/demo/maven/api/pom.xml @@ -0,0 +1,37 @@ + + + + + org.pf4j.demo + pf4j-demo-parent + 3.12.0-SNAPSHOT + + + 4.0.0 + pf4j-demo-api + 3.12.0-SNAPSHOT + jar + Demo Api + + + + + maven-deploy-plugin + + true + + + + + + + + org.pf4j + pf4j + ${project.version} + + provided + + + + diff --git a/demo/maven/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java b/demo/maven/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java new file mode 100644 index 0000000..a2f76fc --- /dev/null +++ b/demo/maven/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/maven/api/src/main/java/org/pf4j/demo/api/Greeting.java b/demo/maven/api/src/main/java/org/pf4j/demo/api/Greeting.java new file mode 100644 index 0000000..828d61b --- /dev/null +++ b/demo/maven/api/src/main/java/org/pf4j/demo/api/Greeting.java @@ -0,0 +1,27 @@ +/* + * 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.ExtensionPoint; + +/** + * @author Decebal Suiu + */ +public interface Greeting extends ExtensionPoint { + + String getGreeting(); + +} diff --git a/demo/maven/api/src/main/java/org/pf4j/demo/api/PluginContext.java b/demo/maven/api/src/main/java/org/pf4j/demo/api/PluginContext.java new file mode 100644 index 0000000..0a7506f --- /dev/null +++ b/demo/maven/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/maven/app/pom.xml b/demo/maven/app/pom.xml new file mode 100644 index 0000000..963bb60 --- /dev/null +++ b/demo/maven/app/pom.xml @@ -0,0 +1,92 @@ + + + + + org.pf4j.demo + pf4j-demo-parent + 3.12.0-SNAPSHOT + + + 4.0.0 + pf4j-demo-app + 3.12.0-SNAPSHOT + jar + Demo App + + + org.pf4j.demo.Boot + + + + + + maven-assembly-plugin + 2.3 + + + src/main/assembly/assembly.xml + + false + + + + make-assembly + package + + attached + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + lib/ + ${main.class} + + + + + + + maven-deploy-plugin + + true + + + + + + + + org.pf4j + pf4j + ${project.version} + + + + org.pf4j.demo + pf4j-demo-api + ${project.version} + + + + + org.slf4j + slf4j-simple + ${slf4j.version} + + + + commons-lang + commons-lang + 2.4 + + + + diff --git a/demo/maven/app/src/main/assembly/assembly.xml b/demo/maven/app/src/main/assembly/assembly.xml new file mode 100644 index 0000000..77c66b4 --- /dev/null +++ b/demo/maven/app/src/main/assembly/assembly.xml @@ -0,0 +1,37 @@ + + + app + + dir + zip + + false + + + false + lib + + *:jar:* + + + + + + ${project.build.directory} + + + *.jar + + + *-javadoc.jar + *-sources.jar + + + + + diff --git a/demo/maven/app/src/main/java/org/pf4j/demo/Boot.java b/demo/maven/app/src/main/java/org/pf4j/demo/Boot.java new file mode 100644 index 0000000..d101104 --- /dev/null +++ b/demo/maven/app/src/main/java/org/pf4j/demo/Boot.java @@ -0,0 +1,131 @@ +/* + * 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.apache.commons.lang.StringUtils; +import org.pf4j.PluginManager; +import org.pf4j.PluginWrapper; +import org.pf4j.demo.api.Greeting; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Set; + +/** + * A boot class that start the demo. + * + * @author Decebal Suiu + */ +public class Boot { + + private static final Logger log = LoggerFactory.getLogger(Boot.class); + + public static void main(String[] args) { + // print logo + printLogo(); + + // create the plugin manager + PluginManager pluginManager = new DemoPluginManager(); + + // load the plugins + pluginManager.loadPlugins(); + + // enable a disabled plugin +// pluginManager.enablePlugin("welcome-plugin"); + + // start (active/resolved) the plugins + pluginManager.startPlugins(); + + // retrieves the extensions for Greeting extension point + List greetings = pluginManager.getExtensions(Greeting.class); + log.info("Found {} extensions for extension point '{}'", greetings.size(), Greeting.class.getName()); + for (Greeting greeting : greetings) { + log.info(">>> {}", greeting.getGreeting()); + } + + // print extensions from classpath (non plugin) + log.info("Extensions added by classpath:"); + Set extensionClassNames = pluginManager.getExtensionClassNames(null); + for (String extension : extensionClassNames) { + log.info(" {}", extension); + } + + log.info("Extension classes by classpath:"); + List> greetingsClasses = pluginManager.getExtensionClasses(Greeting.class); + for (Class greeting : greetingsClasses) { + log.info(" Class: {}", greeting.getCanonicalName()); + } + + // print extensions ids for each started plugin + List startedPlugins = pluginManager.getStartedPlugins(); + for (PluginWrapper plugin : startedPlugins) { + String pluginId = plugin.getDescriptor().getPluginId(); + log.info("Extensions added by plugin '{}}':", pluginId); + extensionClassNames = pluginManager.getExtensionClassNames(pluginId); + for (String extension : extensionClassNames) { + log.info(" {}", extension); + } + } + + // print the extensions instances for Greeting extension point for each started plugin + for (PluginWrapper plugin : startedPlugins) { + String pluginId = plugin.getDescriptor().getPluginId(); + log.info("Extensions instances added by plugin '{}' for extension point '{}':", pluginId, Greeting.class.getName()); + List extensions = pluginManager.getExtensions(Greeting.class, pluginId); + for (Object extension : extensions) { + log.info(" {}", extension); + } + } + + // print extensions instances from classpath (non plugin) + log.info("Extensions instances added by classpath:"); + List extensions = pluginManager.getExtensions((String) null); + for (Object extension : extensions) { + log.info(" {}", extension); + } + + // print extensions instances for each started plugin + for (PluginWrapper plugin : startedPlugins) { + String pluginId = plugin.getDescriptor().getPluginId(); + log.info("Extensions instances added by plugin '{}':", pluginId); + extensions = pluginManager.getExtensions(pluginId); + for (Object extension : extensions) { + log.info(" {}", extension); + } + } + + // stop the plugins + pluginManager.stopPlugins(); + /* + Runtime.getRuntime().addShutdownHook(new Thread() { + + @Override + public void run() { + pluginManager.stopPlugins(); + } + + }); + */ + } + + private static void printLogo() { + log.info(StringUtils.repeat("#", 40)); + log.info(StringUtils.center("PF4J-DEMO", 40)); + log.info(StringUtils.repeat("#", 40)); + } + +} diff --git a/demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java b/demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java new file mode 100644 index 0000000..bdae2d6 --- /dev/null +++ b/demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java @@ -0,0 +1,43 @@ +/* + * 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 java.lang.reflect.Constructor; +import org.pf4j.DefaultPluginFactory; +import org.pf4j.Plugin; +import org.pf4j.PluginWrapper; +import org.pf4j.demo.api.PluginContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class DemoPluginFactory extends DefaultPluginFactory { + + private static final Logger log = LoggerFactory.getLogger(DemoPluginFactory.class); + + @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/maven/app/src/main/java/org/pf4j/demo/DemoPluginManager.java b/demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginManager.java new file mode 100644 index 0000000..2571a3e --- /dev/null +++ b/demo/maven/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/maven/app/src/main/java/org/pf4j/demo/HowdyGreeting.java b/demo/maven/app/src/main/java/org/pf4j/demo/HowdyGreeting.java new file mode 100644 index 0000000..050934d --- /dev/null +++ b/demo/maven/app/src/main/java/org/pf4j/demo/HowdyGreeting.java @@ -0,0 +1,32 @@ +/* + * 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.demo.api.Greeting; + +/** + * A Service Implementation (no @Extension) declared via Java Service Provider mechanism (using META-INF/services). + * + * @author Decebal Suiu + */ +public class HowdyGreeting implements Greeting { + + @Override + public String getGreeting() { + return "Howdy"; + } + +} diff --git a/demo/maven/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java b/demo/maven/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java new file mode 100644 index 0000000..1341b77 --- /dev/null +++ b/demo/maven/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java @@ -0,0 +1,32 @@ +/* + * 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.Extension; +import org.pf4j.demo.api.Greeting; + +/** + * @author Decebal Suiu + */ +@Extension +public class WhazzupGreeting implements Greeting { + + @Override + public String getGreeting() { + return "Whazzup"; + } + +} diff --git a/demo/maven/app/src/main/resources/META-INF/services/org.pf4j.demo.api.Greeting b/demo/maven/app/src/main/resources/META-INF/services/org.pf4j.demo.api.Greeting new file mode 100644 index 0000000..615a943 --- /dev/null +++ b/demo/maven/app/src/main/resources/META-INF/services/org.pf4j.demo.api.Greeting @@ -0,0 +1 @@ +org.pf4j.demo.HowdyGreeting diff --git a/demo/maven/app/src/main/resources/simplelogger.properties b/demo/maven/app/src/main/resources/simplelogger.properties new file mode 100755 index 0000000..40302dd --- /dev/null +++ b/demo/maven/app/src/main/resources/simplelogger.properties @@ -0,0 +1,39 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. + +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=debug + +# Logging detail level for a SimpleLogger instance named "xxxxx". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +#org.slf4j.simpleLogger.log.xxxxx= +# !!! Uncomment below loggers when you are in trouble +#org.slf4j.simpleLogger.log.org.pf4j.PluginClassLoader=trace +#org.slf4j.simpleLogger.log.org.pf4j.AbstractExtensionFinder=trace + +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +#org.slf4j.simpleLogger.showDateTime=false +org.slf4j.simpleLogger.showDateTime=true + +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z +org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss + +# Set to true if you want to output the current thread name. +# Defaults to true. +#org.slf4j.simpleLogger.showThreadName=true + +# Set to true if you want the Logger instance name to be included in output messages. +# Defaults to true. +#org.slf4j.simpleLogger.showLogName=true + +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +#org.slf4j.simpleLogger.showShortLogName=false diff --git a/demo/maven/plugins/disabled.txt b/demo/maven/plugins/disabled.txt new file mode 100644 index 0000000..45f1801 --- /dev/null +++ b/demo/maven/plugins/disabled.txt @@ -0,0 +1,6 @@ +######################################## +# - load all plugins except these +# - add one plugin id on each line +# - put this file in plugins folder +######################################## +#welcome-plugin diff --git a/demo/maven/plugins/enabled.txt b/demo/maven/plugins/enabled.txt new file mode 100644 index 0000000..3d76b2f --- /dev/null +++ b/demo/maven/plugins/enabled.txt @@ -0,0 +1,6 @@ +######################################## +# - load only these plugins +# - add one plugin id on each line +# - put this file in plugins folder +######################################## +#welcome-plugin diff --git a/demo/maven/plugins/plugin1/plugin.properties b/demo/maven/plugins/plugin1/plugin.properties new file mode 100644 index 0000000..9da9bcc --- /dev/null +++ b/demo/maven/plugins/plugin1/plugin.properties @@ -0,0 +1,5 @@ +plugin.id=welcome-plugin +plugin.class=org.pf4j.demo.welcome.WelcomePlugin +plugin.version=0.0.1 +plugin.provider=Decebal Suiu +plugin.dependencies= diff --git a/demo/maven/plugins/plugin1/pom.xml b/demo/maven/plugins/plugin1/pom.xml new file mode 100644 index 0000000..5873fdd --- /dev/null +++ b/demo/maven/plugins/plugin1/pom.xml @@ -0,0 +1,32 @@ + + + + + org.pf4j.demo + pf4j-demo-plugins + 3.12.0-SNAPSHOT + + + 4.0.0 + pf4j-demo-plugin1 + 3.12.0-SNAPSHOT + jar + Demo Plugin #1 + + + welcome-plugin + org.pf4j.demo.welcome.WelcomePlugin + 0.0.1 + Decebal Suiu + + + + + + commons-lang + commons-lang + 2.6 + + + + diff --git a/demo/maven/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java b/demo/maven/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java new file mode 100644 index 0000000..3064902 --- /dev/null +++ b/demo/maven/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java @@ -0,0 +1,58 @@ +/* + * 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.welcome; + +import org.apache.commons.lang.StringUtils; +import org.pf4j.Extension; +import org.pf4j.RuntimeMode; +import org.pf4j.demo.api.DemoPlugin; +import org.pf4j.demo.api.Greeting; +import org.pf4j.demo.api.PluginContext; + +/** + * @author Decebal Suiu + */ +public class WelcomePlugin extends DemoPlugin { + + public WelcomePlugin(PluginContext context) { + super(context); + } + + @Override + public void start() { + log.info("WelcomePlugin.start()"); + // for testing the development mode + if (RuntimeMode.DEVELOPMENT.equals(context.getRuntimeMode())) { + log.info(StringUtils.upperCase("WelcomePlugin")); + } + } + + @Override + public void stop() { + log.info("WelcomePlugin.stop()"); + } + + @Extension + public static class WelcomeGreeting implements Greeting { + + @Override + public String getGreeting() { + return "Welcome"; + } + + } + +} diff --git a/demo/maven/plugins/plugin2/plugin.properties b/demo/maven/plugins/plugin2/plugin.properties new file mode 100644 index 0000000..60b6f33 --- /dev/null +++ b/demo/maven/plugins/plugin2/plugin.properties @@ -0,0 +1,5 @@ +plugin.id=hello-plugin +plugin.class=org.pf4j.demo.hello.HelloPlugin +plugin.version=0.0.1 +plugin.provider=Decebal Suiu +plugin.dependencies= diff --git a/demo/maven/plugins/plugin2/pom.xml b/demo/maven/plugins/plugin2/pom.xml new file mode 100644 index 0000000..82ed985 --- /dev/null +++ b/demo/maven/plugins/plugin2/pom.xml @@ -0,0 +1,24 @@ + + + + + org.pf4j.demo + pf4j-demo-plugins + 3.12.0-SNAPSHOT + + + 4.0.0 + pf4j-demo-plugin2 + 3.12.0-SNAPSHOT + jar + Demo Plugin #2 + + + hello-plugin + org.pf4j.demo.hello.HelloPlugin + 0.0.1 + Decebal Suiu + + + + diff --git a/demo/maven/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java b/demo/maven/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java new file mode 100644 index 0000000..ed67878 --- /dev/null +++ b/demo/maven/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java @@ -0,0 +1,54 @@ +/* + * 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.hello; + +import org.pf4j.Extension; +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 DemoPlugin { + + public HelloPlugin(PluginContext context) { + super(context); + } + + @Override + public void start() { + log.info("HelloPlugin.start()"); + } + + @Override + public void stop() { + log.info("HelloPlugin.stop()"); + } + + @Extension(ordinal=1) + public static class HelloGreeting implements Greeting { + + @Override + public String getGreeting() { + return "Hello"; + } + + } + +} diff --git a/demo/maven/plugins/pom.xml b/demo/maven/plugins/pom.xml new file mode 100644 index 0000000..13d41f6 --- /dev/null +++ b/demo/maven/plugins/pom.xml @@ -0,0 +1,99 @@ + + + + + org.pf4j.demo + pf4j-demo-parent + 3.12.0-SNAPSHOT + + + 4.0.0 + pf4j-demo-plugins + 3.12.0-SNAPSHOT + pom + Demo Plugins Parent + + + UTF-8 + UTF-8 + + + + + + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + jar-with-dependencies + + ${project.artifactId}-${project.version}-all + false + false + + + true + true + + + ${plugin.id} + ${plugin.version} + ${plugin.provider} + ${plugin.class} + ${plugin.dependencies} + + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + 2.8.2 + + + + + + plugin1 + plugin2 + + + + + org.pf4j + pf4j + ${project.version} + + provided + + + + org.pf4j.demo + pf4j-demo-api + ${project.version} + + provided + + + + diff --git a/demo/maven/pom.xml b/demo/maven/pom.xml new file mode 100644 index 0000000..36a0738 --- /dev/null +++ b/demo/maven/pom.xml @@ -0,0 +1,45 @@ + + + + + org.pf4j + pf4j-parent + 3.12.0-SNAPSHOT + ../.. + + + 4.0.0 + org.pf4j.demo + pf4j-demo-parent + 3.12.0-SNAPSHOT + pom + Demo Parent + + + true + true + true + + + + + + false + src/main/java + + **/*.java + + + + src/main/resources + + + + + + app + api + plugins + + + diff --git a/demo/plugins/disabled.txt b/demo/plugins/disabled.txt deleted file mode 100644 index 45f1801..0000000 --- a/demo/plugins/disabled.txt +++ /dev/null @@ -1,6 +0,0 @@ -######################################## -# - load all plugins except these -# - add one plugin id on each line -# - put this file in plugins folder -######################################## -#welcome-plugin diff --git a/demo/plugins/enabled.txt b/demo/plugins/enabled.txt deleted file mode 100644 index 3d76b2f..0000000 --- a/demo/plugins/enabled.txt +++ /dev/null @@ -1,6 +0,0 @@ -######################################## -# - load only these plugins -# - add one plugin id on each line -# - put this file in plugins folder -######################################## -#welcome-plugin diff --git a/demo/plugins/plugin1/plugin.properties b/demo/plugins/plugin1/plugin.properties deleted file mode 100644 index 9da9bcc..0000000 --- a/demo/plugins/plugin1/plugin.properties +++ /dev/null @@ -1,5 +0,0 @@ -plugin.id=welcome-plugin -plugin.class=org.pf4j.demo.welcome.WelcomePlugin -plugin.version=0.0.1 -plugin.provider=Decebal Suiu -plugin.dependencies= diff --git a/demo/plugins/plugin1/pom.xml b/demo/plugins/plugin1/pom.xml deleted file mode 100644 index 5873fdd..0000000 --- a/demo/plugins/plugin1/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - org.pf4j.demo - pf4j-demo-plugins - 3.12.0-SNAPSHOT - - - 4.0.0 - pf4j-demo-plugin1 - 3.12.0-SNAPSHOT - jar - Demo Plugin #1 - - - welcome-plugin - org.pf4j.demo.welcome.WelcomePlugin - 0.0.1 - Decebal Suiu - - - - - - commons-lang - commons-lang - 2.6 - - - - 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 deleted file mode 100644 index 3064902..0000000 --- a/demo/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.welcome; - -import org.apache.commons.lang.StringUtils; -import org.pf4j.Extension; -import org.pf4j.RuntimeMode; -import org.pf4j.demo.api.DemoPlugin; -import org.pf4j.demo.api.Greeting; -import org.pf4j.demo.api.PluginContext; - -/** - * @author Decebal Suiu - */ -public class WelcomePlugin extends DemoPlugin { - - public WelcomePlugin(PluginContext context) { - super(context); - } - - @Override - public void start() { - log.info("WelcomePlugin.start()"); - // for testing the development mode - if (RuntimeMode.DEVELOPMENT.equals(context.getRuntimeMode())) { - log.info(StringUtils.upperCase("WelcomePlugin")); - } - } - - @Override - public void stop() { - log.info("WelcomePlugin.stop()"); - } - - @Extension - public static class WelcomeGreeting implements Greeting { - - @Override - public String getGreeting() { - return "Welcome"; - } - - } - -} diff --git a/demo/plugins/plugin2/plugin.properties b/demo/plugins/plugin2/plugin.properties deleted file mode 100644 index 60b6f33..0000000 --- a/demo/plugins/plugin2/plugin.properties +++ /dev/null @@ -1,5 +0,0 @@ -plugin.id=hello-plugin -plugin.class=org.pf4j.demo.hello.HelloPlugin -plugin.version=0.0.1 -plugin.provider=Decebal Suiu -plugin.dependencies= diff --git a/demo/plugins/plugin2/pom.xml b/demo/plugins/plugin2/pom.xml deleted file mode 100644 index 82ed985..0000000 --- a/demo/plugins/plugin2/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - org.pf4j.demo - pf4j-demo-plugins - 3.12.0-SNAPSHOT - - - 4.0.0 - pf4j-demo-plugin2 - 3.12.0-SNAPSHOT - jar - Demo Plugin #2 - - - hello-plugin - org.pf4j.demo.hello.HelloPlugin - 0.0.1 - Decebal Suiu - - - - 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 deleted file mode 100644 index ed67878..0000000 --- a/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.hello; - -import org.pf4j.Extension; -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 DemoPlugin { - - public HelloPlugin(PluginContext context) { - super(context); - } - - @Override - public void start() { - log.info("HelloPlugin.start()"); - } - - @Override - public void stop() { - log.info("HelloPlugin.stop()"); - } - - @Extension(ordinal=1) - public static class HelloGreeting implements Greeting { - - @Override - public String getGreeting() { - return "Hello"; - } - - } - -} diff --git a/demo/plugins/pom.xml b/demo/plugins/pom.xml deleted file mode 100644 index 13d41f6..0000000 --- a/demo/plugins/pom.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - org.pf4j.demo - pf4j-demo-parent - 3.12.0-SNAPSHOT - - - 4.0.0 - pf4j-demo-plugins - 3.12.0-SNAPSHOT - pom - Demo Plugins Parent - - - UTF-8 - UTF-8 - - - - - - - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - jar-with-dependencies - - ${project.artifactId}-${project.version}-all - false - false - - - true - true - - - ${plugin.id} - ${plugin.version} - ${plugin.provider} - ${plugin.class} - ${plugin.dependencies} - - - - - - make-assembly - package - - single - - - - - - org.apache.maven.plugins - maven-deploy-plugin - - true - - 2.8.2 - - - - - - plugin1 - plugin2 - - - - - org.pf4j - pf4j - ${project.version} - - provided - - - - org.pf4j.demo - pf4j-demo-api - ${project.version} - - provided - - - - diff --git a/demo/pom.xml b/demo/pom.xml deleted file mode 100644 index 5e8a8b6..0000000 --- a/demo/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - org.pf4j - pf4j-parent - 3.12.0-SNAPSHOT - - - 4.0.0 - org.pf4j.demo - pf4j-demo-parent - 3.12.0-SNAPSHOT - pom - Demo Parent - - - true - true - true - - - - - - false - src/main/java - - **/*.java - - - - src/main/resources - - - - - - app - api - plugins - - - diff --git a/demo_gradle/.gitignore b/demo_gradle/.gitignore deleted file mode 100644 index 12ddda9..0000000 --- a/demo_gradle/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build -.gradle -.idea diff --git a/demo_gradle/README.md b/demo_gradle/README.md deleted file mode 100644 index 5c8bc80..0000000 --- a/demo_gradle/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# PF4J Gradle Demo - -This demo assumes that you know the basics of Gradle (Please look at [gradle](https://gradle.org/) for more info) - -### Setup/Build - -1. Clone the repo -2. Go to demo_gradle `cd demo_gradle` -3. run `./gradlew build` - -* This will produce one jar, named app-plugin-demo-uberjar.jar, located in the `app/build/libs/` directory and three plugins zips located in `build/plugins` directory. -* The plugins are `plugin-hello-plugin-0.0.1.zip`, `plugin-KotlinPlugin-1.0.0.zip` and `plugin-welcome-plugin-0.0.1.zip` - -### Run the demo - -1. Run - -``` - ./gradlew app:run -``` - -2. The demo's output should look similar to: (Please see `Boot#main()` for more details) -``` -[main] INFO org.pf4j.demo.Boot - ######################################## -[main] INFO org.pf4j.demo.Boot - PF4J-DEMO -[main] INFO org.pf4j.demo.Boot - ######################################## -[main] INFO org.pf4j.DefaultPluginStatusProvider - Enabled plugins: [] -[main] INFO org.pf4j.DefaultPluginStatusProvider - Disabled plugins: [] -[main] INFO org.pf4j.DefaultPluginManager - PF4J version 3.1.0 in 'deployment' mode -[main] INFO org.pf4j.util.FileUtils - Expanded plugin zip 'plugin-hello-plugin-0.0.1.zip' in 'plugin-hello-plugin-0.0.1' -[main] INFO org.pf4j.util.FileUtils - Expanded plugin zip 'plugin-KotlinPlugin-1.0.0.zip' in 'plugin-KotlinPlugin-1.0.0' -[main] INFO org.pf4j.util.FileUtils - Expanded plugin zip 'plugin-welcome-plugin-0.0.1.zip' in 'plugin-welcome-plugin-0.0.1' -[main] INFO org.pf4j.AbstractPluginManager - Plugin 'welcome-plugin@0.0.1' resolved -[main] INFO org.pf4j.AbstractPluginManager - Plugin 'KotlinPlugin@1.0.0' resolved -[main] INFO org.pf4j.AbstractPluginManager - Plugin 'hello-plugin@0.0.1' resolved -[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'welcome-plugin@0.0.1' -[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WelcomePlugin.start() -[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WELCOMEPLUGIN -[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'KotlinPlugin@1.0.0' -[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KotlinPlugin.start() -[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KOTLINPLUGIN -[main] INFO org.pf4j.AbstractPluginManager - Start plugin 'hello-plugin@0.0.1' -[main] INFO org.pf4j.demo.hello.HelloPlugin - HelloPlugin.start() -[main] INFO org.pf4j.demo.Boot - Plugindirectory: -[main] INFO org.pf4j.demo.Boot - ../build/plugins - -[main] INFO org.pf4j.demo.Boot - Found 4 extensions for extension point 'org.pf4j.demo.api.Greeting' -[main] INFO org.pf4j.demo.Boot - >>> Whazzup -[main] INFO org.pf4j.demo.Boot - >>> Welcome -[main] INFO org.pf4j.demo.Boot - >>> KotlinGreetings -[main] INFO org.pf4j.demo.Boot - >>> Hello -[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'welcome-plugin': -[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'KotlinPlugin': -[main] INFO org.pf4j.demo.Boot - Extensions added by plugin 'hello-plugin': -[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'hello-plugin@0.0.1' -[main] INFO org.pf4j.demo.hello.HelloPlugin - HelloPlugin.stop() -[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'KotlinPlugin@1.0.0' -[main] INFO org.pf4j.demo.kotlin.KotlinPlugin - KotlinPlugin.stop() -[main] INFO org.pf4j.AbstractPluginManager - Stop plugin 'welcome-plugin@0.0.1' -[main] INFO org.pf4j.demo.welcome.WelcomePlugin - WelcomePlugin.stop() -``` - diff --git a/demo_gradle/api/.gitignore b/demo_gradle/api/.gitignore deleted file mode 100644 index 378eac2..0000000 --- a/demo_gradle/api/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/demo_gradle/api/build.gradle b/demo_gradle/api/build.gradle deleted file mode 100644 index 0d3ca62..0000000 --- a/demo_gradle/api/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -dependencies { - compile group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}" - compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' - - testCompile group: 'junit', name: 'junit', version: '4.+' -} diff --git a/demo_gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java b/demo_gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java deleted file mode 100644 index 828d61b..0000000 --- a/demo_gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.ExtensionPoint; - -/** - * @author Decebal Suiu - */ -public interface Greeting extends ExtensionPoint { - - String getGreeting(); - -} diff --git a/demo_gradle/app/.gitignore b/demo_gradle/app/.gitignore deleted file mode 100644 index 378eac2..0000000 --- a/demo_gradle/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/demo_gradle/app/build.gradle b/demo_gradle/app/build.gradle deleted file mode 100644 index 85c2412..0000000 --- a/demo_gradle/app/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -apply plugin: 'application' - -mainClassName = 'org.pf4j.demo.Boot' -run { - systemProperty 'pf4j.pluginsDir', '../build/plugins' -} - -dependencies { - compile project(':api') - compile group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}" - annotationProcessor(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") - compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' - compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' - - testCompile group: 'junit', name: 'junit', version: '4.+' -} - -task uberjar(type: Jar, dependsOn: ['compileJava']) { - zip64 true - from configurations.runtimeClasspath.asFileTree.files.collect { - exclude "META-INF/*.SF" - exclude "META-INF/*.DSA" - exclude "META-INF/*.RSA" - zipTree(it) - } - from files(sourceSets.main.output.classesDirs) - from files(sourceSets.main.resources) - manifest { - attributes 'Main-Class': mainClassName - } - - archiveBaseName = "${project.name}-plugin-demo" - archiveClassifier = "uberjar" -} - diff --git a/demo_gradle/app/src/main/java/org/pf4j/demo/Boot.java b/demo_gradle/app/src/main/java/org/pf4j/demo/Boot.java deleted file mode 100644 index ebc5c31..0000000 --- a/demo_gradle/app/src/main/java/org/pf4j/demo/Boot.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * 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.apache.commons.lang3.StringUtils; -import org.pf4j.CompoundPluginDescriptorFinder; -import org.pf4j.ManifestPluginDescriptorFinder; -import org.pf4j.PropertiesPluginDescriptorFinder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.pf4j.DefaultPluginManager; -import org.pf4j.PluginManager; -import org.pf4j.PluginWrapper; -import org.pf4j.demo.api.Greeting; - -import java.util.List; - -/** - * A boot class that start the demo. - * - * @author Decebal Suiu - */ -public class Boot { - private static final Logger logger = LoggerFactory.getLogger(Boot.class); - - public static void main(String[] args) { - // print logo - printLogo(); - - // create the plugin manager - final PluginManager pluginManager = new DefaultPluginManager() { - @Override - protected CompoundPluginDescriptorFinder createPluginDescriptorFinder() { - return new CompoundPluginDescriptorFinder() - // Demo is using the Manifest file - // PropertiesPluginDescriptorFinder is commented out just to avoid error log - //.add(new PropertiesPluginDescriptorFinder()) - .add(new ManifestPluginDescriptorFinder()); - } - }; - - // load the plugins - pluginManager.loadPlugins(); - - // enable a disabled plugin -// pluginManager.enablePlugin("welcome-plugin"); - - // start (active/resolved) the plugins - pluginManager.startPlugins(); - - logger.info("Plugindirectory: "); - logger.info("\t" + System.getProperty("pf4j.pluginsDir", "plugins") + "\n"); - - // retrieves the extensions for Greeting extension point - List greetings = pluginManager.getExtensions(Greeting.class); - logger.info(String.format("Found %d extensions for extension point '%s'", greetings.size(), Greeting.class.getName())); - for (Greeting greeting : greetings) { - logger.info(">>> " + greeting.getGreeting()); - } - - // // print extensions from classpath (non plugin) - // logger.info(String.format("Extensions added by classpath:")); - // Set extensionClassNames = pluginManager.getExtensionClassNames(null); - // for (String extension : extensionClassNames) { - // logger.info(" " + extension); - // } - - // print extensions for each started plugin - List startedPlugins = pluginManager.getStartedPlugins(); - for (PluginWrapper plugin : startedPlugins) { - String pluginId = plugin.getDescriptor().getPluginId(); - logger.info(String.format("Extensions added by plugin '%s':", pluginId)); - // extensionClassNames = pluginManager.getExtensionClassNames(pluginId); - // for (String extension : extensionClassNames) { - // logger.info(" " + extension); - // } - } - - // stop the plugins - pluginManager.stopPlugins(); - /* - Runtime.getRuntime().addShutdownHook(new Thread() { - - @Override - public void run() { - pluginManager.stopPlugins(); - } - - }); - */ - } - - private static void printLogo() { - logger.info(StringUtils.repeat("#", 40)); - logger.info(StringUtils.center("PF4J-DEMO", 40)); - logger.info(StringUtils.repeat("#", 40)); - } - -} diff --git a/demo_gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java b/demo_gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java deleted file mode 100644 index 1341b77..0000000 --- a/demo_gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.Extension; -import org.pf4j.demo.api.Greeting; - -/** - * @author Decebal Suiu - */ -@Extension -public class WhazzupGreeting implements Greeting { - - @Override - public String getGreeting() { - return "Whazzup"; - } - -} diff --git a/demo_gradle/app/src/main/resources/log4j.properties b/demo_gradle/app/src/main/resources/log4j.properties deleted file mode 100644 index f42e226..0000000 --- a/demo_gradle/app/src/main/resources/log4j.properties +++ /dev/null @@ -1,16 +0,0 @@ -log4j.rootLogger=DEBUG, Console - -# -# PF4J log -# -log4j.logger.org.pf4j=DEBUG, Console -log4j.logger.org.pf4j.PluginClassLoader=WARN, Console -log4j.additivity.org.pf4j=false - -# -# Appenders -# -log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.layout=org.apache.log4j.PatternLayout -#log4j.appender.Console.layout.conversionPattern=%-5p - %-32.32c{1} - %m\n -log4j.appender.Console.layout.ConversionPattern=%d %p %c - %m%n diff --git a/demo_gradle/build.gradle b/demo_gradle/build.gradle deleted file mode 100644 index 9968360..0000000 --- a/demo_gradle/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -subprojects { - apply plugin: 'java' - - repositories { - mavenLocal() - mavenCentral() - } -} -// plugin location -ext.pluginsDir = rootProject.buildDir.path + '/plugins' - -task build(dependsOn: [':app:uberjar']) - - diff --git a/demo_gradle/gradle.properties b/demo_gradle/gradle.properties deleted file mode 100644 index 4000315..0000000 --- a/demo_gradle/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -# PF4J -pf4jVersion=3.1.0 diff --git a/demo_gradle/gradle/wrapper/gradle-wrapper.jar b/demo_gradle/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index cc4fdc2..0000000 Binary files a/demo_gradle/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/demo_gradle/gradle/wrapper/gradle-wrapper.properties b/demo_gradle/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 4aeeaec..0000000 --- a/demo_gradle/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Thu Nov 14 12:06:04 CST 2019 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-all.zip -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStorePath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME diff --git a/demo_gradle/gradlew b/demo_gradle/gradlew deleted file mode 100755 index 2fe81a7..0000000 --- a/demo_gradle/gradlew +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 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 -# -# https://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. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/demo_gradle/gradlew.bat b/demo_gradle/gradlew.bat deleted file mode 100644 index 24467a1..0000000 --- a/demo_gradle/gradlew.bat +++ /dev/null @@ -1,100 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/demo_gradle/plugins/build.gradle b/demo_gradle/plugins/build.gradle deleted file mode 100644 index a46f84c..0000000 --- a/demo_gradle/plugins/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -subprojects { - jar { - manifest { - attributes 'Plugin-Class': "${pluginClass}", - 'Plugin-Id': "${pluginId}", - 'Plugin-Version': "${archiveVersion}", - 'Plugin-Provider': "${pluginProvider}", - 'Plugin-Dependencies': "${pluginDependencies}" - } - } - - task plugin(type: Jar) { - archiveBaseName = "plugin-${pluginId}" - into('classes') { - with jar - } - into('lib') { - from configurations.compile - } - archiveExtension ='zip' - } - - task assemblePlugin(type: Copy) { - from plugin - into pluginsDir - } -} - -task assemblePlugins(type: Copy) { - dependsOn subprojects.assemblePlugin -} - -build.dependsOn project.tasks.assemblePlugins diff --git a/demo_gradle/plugins/disabled.txt b/demo_gradle/plugins/disabled.txt deleted file mode 100644 index 45f1801..0000000 --- a/demo_gradle/plugins/disabled.txt +++ /dev/null @@ -1,6 +0,0 @@ -######################################## -# - load all plugins except these -# - add one plugin id on each line -# - put this file in plugins folder -######################################## -#welcome-plugin diff --git a/demo_gradle/plugins/enabled.txt b/demo_gradle/plugins/enabled.txt deleted file mode 100644 index 3d76b2f..0000000 --- a/demo_gradle/plugins/enabled.txt +++ /dev/null @@ -1,6 +0,0 @@ -######################################## -# - load only these plugins -# - add one plugin id on each line -# - put this file in plugins folder -######################################## -#welcome-plugin diff --git a/demo_gradle/plugins/plugin1/.gitignore b/demo_gradle/plugins/plugin1/.gitignore deleted file mode 100644 index 378eac2..0000000 --- a/demo_gradle/plugins/plugin1/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/demo_gradle/plugins/plugin1/build.gradle b/demo_gradle/plugins/plugin1/build.gradle deleted file mode 100644 index f3f00a5..0000000 --- a/demo_gradle/plugins/plugin1/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -dependencies { - // compileOnly important!!! We do not want to put the api into the zip file since the main program has it already! - compileOnly project(':api') - compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") { - exclude group: "org.slf4j" - } - annotationProcessor(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") - compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' - testCompile group: 'junit', name: 'junit', version: '4.+' -} diff --git a/demo_gradle/plugins/plugin1/gradle.properties b/demo_gradle/plugins/plugin1/gradle.properties deleted file mode 100644 index 2edd800..0000000 --- a/demo_gradle/plugins/plugin1/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -version=0.0.1 - -pluginId=welcome-plugin -pluginClass=org.pf4j.demo.welcome.WelcomePlugin -pluginProvider=Decebal Suiu -pluginDependencies= diff --git a/demo_gradle/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java b/demo_gradle/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java deleted file mode 100644 index aaf1804..0000000 --- a/demo_gradle/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.welcome; - -import org.apache.commons.lang3.StringUtils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.pf4j.Extension; -import org.pf4j.Plugin; -import org.pf4j.PluginWrapper; -import org.pf4j.demo.api.Greeting; - -/** - * @author Decebal Suiu - */ -public class WelcomePlugin extends Plugin { - - private static final Logger logger = LoggerFactory.getLogger(WelcomePlugin.class); - - public WelcomePlugin(PluginWrapper wrapper) { - super(wrapper); - } - - @Override - public void start() { - logger.info("WelcomePlugin.start()"); - logger.info(StringUtils.upperCase("WelcomePlugin")); - } - - @Override - public void stop() { - logger.info("WelcomePlugin.stop()"); - } - - @Extension - public static class WelcomeGreeting implements Greeting { - - @Override - public String getGreeting() { - return "Welcome"; - } - - } - -} diff --git a/demo_gradle/plugins/plugin2/.gitignore b/demo_gradle/plugins/plugin2/.gitignore deleted file mode 100644 index 378eac2..0000000 --- a/demo_gradle/plugins/plugin2/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/demo_gradle/plugins/plugin2/build.gradle b/demo_gradle/plugins/plugin2/build.gradle deleted file mode 100644 index f3f00a5..0000000 --- a/demo_gradle/plugins/plugin2/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -dependencies { - // compileOnly important!!! We do not want to put the api into the zip file since the main program has it already! - compileOnly project(':api') - compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") { - exclude group: "org.slf4j" - } - annotationProcessor(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") - compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' - testCompile group: 'junit', name: 'junit', version: '4.+' -} diff --git a/demo_gradle/plugins/plugin2/gradle.properties b/demo_gradle/plugins/plugin2/gradle.properties deleted file mode 100644 index ef70127..0000000 --- a/demo_gradle/plugins/plugin2/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -version=0.0.1 - -pluginId=hello-plugin -pluginClass=org.pf4j.demo.hello.HelloPlugin -pluginProvider=Decebal Suiu -pluginDependencies= diff --git a/demo_gradle/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java b/demo_gradle/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java deleted file mode 100644 index f9c7797..0000000 --- a/demo_gradle/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.hello; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.pf4j.Extension; -import org.pf4j.Plugin; -import org.pf4j.PluginWrapper; -import org.pf4j.demo.api.Greeting; - -/** - * A very simple plugin. - * - * @author Decebal Suiu - */ -public class HelloPlugin extends Plugin { - private static final Logger logger = LoggerFactory.getLogger(HelloPlugin.class); - - public HelloPlugin(PluginWrapper wrapper) { - super(wrapper); - } - - @Override - public void start() { - logger.info("HelloPlugin.start()"); - } - - @Override - public void stop() { - logger.info("HelloPlugin.stop()"); - } - - @Extension(ordinal=1) - public static class HelloGreeting implements Greeting { - - @Override - public String getGreeting() { - return "Hello"; - } - - } - -} diff --git a/demo_gradle/plugins/plugin3/build.gradle b/demo_gradle/plugins/plugin3/build.gradle deleted file mode 100644 index 1860b61..0000000 --- a/demo_gradle/plugins/plugin3/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -buildscript { - ext.kotlin_version = '1.3.50' - - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -apply plugin: 'kotlin' -apply plugin: 'kotlin-kapt' - -repositories { - mavenCentral() -} - -dependencies { - compileOnly project(':api') - compileOnly(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") { - exclude group: "org.slf4j" - } - kapt(group: 'org.pf4j', name: 'pf4j', version: "${pf4jVersion}") - compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5' - compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - - testCompile group: 'junit', name: 'junit', version: '4.+' -} diff --git a/demo_gradle/plugins/plugin3/gradle.properties b/demo_gradle/plugins/plugin3/gradle.properties deleted file mode 100644 index a04b609..0000000 --- a/demo_gradle/plugins/plugin3/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -version=1.0.0 - -pluginId=KotlinPlugin -pluginClass=org.pf4j.demo.kotlin.KotlinPlugin -pluginProvider=Anindya Chatterjee -pluginDependencies= diff --git a/demo_gradle/plugins/plugin3/src/main/kotlin/org/pf4j/demo/kotlin/KotlinPlugin.kt b/demo_gradle/plugins/plugin3/src/main/kotlin/org/pf4j/demo/kotlin/KotlinPlugin.kt deleted file mode 100644 index 2b2bc17..0000000 --- a/demo_gradle/plugins/plugin3/src/main/kotlin/org/pf4j/demo/kotlin/KotlinPlugin.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2017 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.kotlin - -import org.apache.commons.lang3.StringUtils -import org.slf4j.LoggerFactory -import org.pf4j.Extension -import org.pf4j.Plugin -import org.pf4j.PluginWrapper -import org.pf4j.demo.api.Greeting - -/** - * A sample plugin written in Kotlin - * - * @author Anindya Chatterjee - */ -class KotlinPlugin(wrapper: PluginWrapper) : Plugin(wrapper) { - private val logger = LoggerFactory.getLogger(KotlinPlugin::class.java) - - override fun start() { - logger.info("KotlinPlugin.start()") - logger.info(StringUtils.upperCase("KotlinPlugin")) - } - - override fun stop() { - logger.info("KotlinPlugin.stop()") - } -} - -@Extension -class KotlinGreeting : Greeting { - override fun getGreeting(): String { - return "KotlinGreetings" - } -} diff --git a/demo_gradle/settings.gradle b/demo_gradle/settings.gradle deleted file mode 100644 index 828e80a..0000000 --- a/demo_gradle/settings.gradle +++ /dev/null @@ -1,8 +0,0 @@ -include 'api' -include 'app' - -include 'plugins' - -include 'plugins:plugin1' -include 'plugins:plugin2' -include 'plugins:plugin3' diff --git a/pom.xml b/pom.xml index 19884e2..b59b24e 100644 --- a/pom.xml +++ b/pom.xml @@ -167,7 +167,7 @@ pf4j - demo + demo/maven maven-archetypes/quickstart diff --git a/run-demo.bat b/run-demo.bat index 6622d90..f8846cd 100644 --- a/run-demo.bat +++ b/run-demo.bat @@ -11,11 +11,11 @@ mkdir demo-dist mkdir demo-dist\plugins REM copy artifacts to demo-dist folder -xcopy demo\app\target\pf4j-demo-app-*.zip demo-dist /s /i -xcopy demo\plugins\plugin1\target\pf4j-demo-plugin1-*-all.jar demo-dist\plugins /s -xcopy demo\plugins\plugin2\target\pf4j-demo-plugin2-*-all.jar demo-dist\plugins /s -xcopy demo\plugins\enabled.txt demo-dist\plugins /s -xcopy demo\plugins\disabled.txt demo-dist\plugins /s +xcopy demo\maven\app\target\pf4j-demo-app-*.zip demo-dist /s /i +xcopy demo\maven\plugins\plugin1\target\pf4j-demo-plugin1-*-all.jar demo-dist\plugins /s +xcopy demo\maven\plugins\plugin2\target\pf4j-demo-plugin2-*-all.jar demo-dist\plugins /s +xcopy demo\maven\plugins\enabled.txt demo-dist\plugins /s +xcopy demo\maven\plugins\disabled.txt demo-dist\plugins /s cd demo-dist diff --git a/run-demo.sh b/run-demo.sh index 96ba799..2991e57 100755 --- a/run-demo.sh +++ b/run-demo.sh @@ -12,11 +12,11 @@ rm -fr demo-dist mkdir -p demo-dist/plugins # copy artifacts to demo-dist folder -cp demo/app/target/pf4j-demo-*.zip demo-dist/ -cp demo/plugins/plugin1/target/pf4j-demo-plugin1-*-all.jar demo-dist/plugins/ -cp demo/plugins/plugin2/target/pf4j-demo-plugin2-*-all.jar demo-dist/plugins/ -cp demo/plugins/enabled.txt demo-dist/plugins/ -cp demo/plugins/disabled.txt demo-dist/plugins/ +cp demo/maven/app/target/pf4j-demo-*.zip demo-dist/ +cp demo/maven/plugins/plugin1/target/pf4j-demo-plugin1-*-all.jar demo-dist/plugins/ +cp demo/maven/plugins/plugin2/target/pf4j-demo-plugin2-*-all.jar demo-dist/plugins/ +cp demo/maven/plugins/enabled.txt demo-dist/plugins/ +cp demo/maven/plugins/disabled.txt demo-dist/plugins/ cd demo-dist