diff options
Diffstat (limited to 'demo')
54 files changed, 949 insertions, 0 deletions
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/api/src/main/java/org/pf4j/demo/api/Greeting.java b/demo/gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java index 828d61b..828d61b 100644 --- a/demo/api/src/main/java/org/pf4j/demo/api/Greeting.java +++ b/demo/gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java 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<Greeting> 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<String> extensionClassNames = pluginManager.getExtensionClassNames(null); + // for (String extension : extensionClassNames) { + // logger.info(" " + extension); + // } + + // print extensions for each started plugin + List<PluginWrapper> 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/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java b/demo/gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java index 1341b77..1341b77 100644 --- a/demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java +++ b/demo/gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java 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 Binary files differnew file mode 100644 index 0000000..e644113 --- /dev/null +++ b/demo/gradle/gradle/wrapper/gradle-wrapper.jar 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/plugins/disabled.txt b/demo/gradle/plugins/disabled.txt index 45f1801..45f1801 100644 --- a/demo/plugins/disabled.txt +++ b/demo/gradle/plugins/disabled.txt diff --git a/demo/plugins/enabled.txt b/demo/gradle/plugins/enabled.txt index 3d76b2f..3d76b2f 100644 --- a/demo/plugins/enabled.txt +++ b/demo/gradle/plugins/enabled.txt 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/api/pom.xml b/demo/maven/api/pom.xml index 615aa30..615aa30 100644 --- a/demo/api/pom.xml +++ b/demo/maven/api/pom.xml diff --git a/demo/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java b/demo/maven/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java index a2f76fc..a2f76fc 100644 --- a/demo/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java +++ b/demo/maven/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java 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/api/src/main/java/org/pf4j/demo/api/PluginContext.java b/demo/maven/api/src/main/java/org/pf4j/demo/api/PluginContext.java index 0a7506f..0a7506f 100644 --- a/demo/api/src/main/java/org/pf4j/demo/api/PluginContext.java +++ b/demo/maven/api/src/main/java/org/pf4j/demo/api/PluginContext.java diff --git a/demo/app/pom.xml b/demo/maven/app/pom.xml index 963bb60..963bb60 100644 --- a/demo/app/pom.xml +++ b/demo/maven/app/pom.xml diff --git a/demo/app/src/main/assembly/assembly.xml b/demo/maven/app/src/main/assembly/assembly.xml index 77c66b4..77c66b4 100644 --- a/demo/app/src/main/assembly/assembly.xml +++ b/demo/maven/app/src/main/assembly/assembly.xml diff --git a/demo/app/src/main/java/org/pf4j/demo/Boot.java b/demo/maven/app/src/main/java/org/pf4j/demo/Boot.java index d101104..d101104 100644 --- a/demo/app/src/main/java/org/pf4j/demo/Boot.java +++ b/demo/maven/app/src/main/java/org/pf4j/demo/Boot.java diff --git a/demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java b/demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java index bdae2d6..bdae2d6 100644 --- a/demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java +++ b/demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java diff --git a/demo/app/src/main/java/org/pf4j/demo/DemoPluginManager.java b/demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginManager.java index 2571a3e..2571a3e 100644 --- a/demo/app/src/main/java/org/pf4j/demo/DemoPluginManager.java +++ b/demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginManager.java diff --git a/demo/app/src/main/java/org/pf4j/demo/HowdyGreeting.java b/demo/maven/app/src/main/java/org/pf4j/demo/HowdyGreeting.java index 050934d..050934d 100644 --- a/demo/app/src/main/java/org/pf4j/demo/HowdyGreeting.java +++ b/demo/maven/app/src/main/java/org/pf4j/demo/HowdyGreeting.java 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/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 index 615a943..615a943 100644 --- a/demo/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 diff --git a/demo/app/src/main/resources/simplelogger.properties b/demo/maven/app/src/main/resources/simplelogger.properties index 40302dd..40302dd 100755 --- a/demo/app/src/main/resources/simplelogger.properties +++ b/demo/maven/app/src/main/resources/simplelogger.properties 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/plugins/plugin1/plugin.properties b/demo/maven/plugins/plugin1/plugin.properties index 9da9bcc..9da9bcc 100644 --- a/demo/plugins/plugin1/plugin.properties +++ b/demo/maven/plugins/plugin1/plugin.properties diff --git a/demo/plugins/plugin1/pom.xml b/demo/maven/plugins/plugin1/pom.xml index 5873fdd..5873fdd 100644 --- a/demo/plugins/plugin1/pom.xml +++ b/demo/maven/plugins/plugin1/pom.xml diff --git a/demo/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 index 3064902..3064902 100644 --- a/demo/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 diff --git a/demo/plugins/plugin2/plugin.properties b/demo/maven/plugins/plugin2/plugin.properties index 60b6f33..60b6f33 100644 --- a/demo/plugins/plugin2/plugin.properties +++ b/demo/maven/plugins/plugin2/plugin.properties diff --git a/demo/plugins/plugin2/pom.xml b/demo/maven/plugins/plugin2/pom.xml index 82ed985..82ed985 100644 --- a/demo/plugins/plugin2/pom.xml +++ b/demo/maven/plugins/plugin2/pom.xml diff --git a/demo/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 index ed67878..ed67878 100644 --- a/demo/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 diff --git a/demo/plugins/pom.xml b/demo/maven/plugins/pom.xml index 13d41f6..13d41f6 100644 --- a/demo/plugins/pom.xml +++ b/demo/maven/plugins/pom.xml diff --git a/demo/pom.xml b/demo/maven/pom.xml index 5e8a8b6..36a0738 100644 --- a/demo/pom.xml +++ b/demo/maven/pom.xml @@ -5,6 +5,7 @@ <groupId>org.pf4j</groupId> <artifactId>pf4j-parent</artifactId> <version>3.12.0-SNAPSHOT</version> + <relativePath>../..</relativePath> </parent> <modelVersion>4.0.0</modelVersion> |