]> source.dussan.org Git - pf4j.git/commitdiff
Consolidate demo projects in the "demo" directory (#584)
authorSebastian Schuberth <sschuberth@users.noreply.github.com>
Sun, 23 Jun 2024 19:59:16 +0000 (21:59 +0200)
committerGitHub <noreply@github.com>
Sun, 23 Jun 2024 19:59:16 +0000 (22:59 +0300)
111 files changed:
demo/api/pom.xml [deleted file]
demo/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java [deleted file]
demo/api/src/main/java/org/pf4j/demo/api/Greeting.java [deleted file]
demo/api/src/main/java/org/pf4j/demo/api/PluginContext.java [deleted file]
demo/app/pom.xml [deleted file]
demo/app/src/main/assembly/assembly.xml [deleted file]
demo/app/src/main/java/org/pf4j/demo/Boot.java [deleted file]
demo/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java [deleted file]
demo/app/src/main/java/org/pf4j/demo/DemoPluginManager.java [deleted file]
demo/app/src/main/java/org/pf4j/demo/HowdyGreeting.java [deleted file]
demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java [deleted file]
demo/app/src/main/resources/META-INF/services/org.pf4j.demo.api.Greeting [deleted file]
demo/app/src/main/resources/simplelogger.properties [deleted file]
demo/gradle/.gitignore [new file with mode: 0644]
demo/gradle/README.md [new file with mode: 0644]
demo/gradle/api/.gitignore [new file with mode: 0644]
demo/gradle/api/build.gradle [new file with mode: 0644]
demo/gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java [new file with mode: 0644]
demo/gradle/app/.gitignore [new file with mode: 0644]
demo/gradle/app/build.gradle [new file with mode: 0644]
demo/gradle/app/src/main/java/org/pf4j/demo/Boot.java [new file with mode: 0644]
demo/gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java [new file with mode: 0644]
demo/gradle/app/src/main/resources/log4j.properties [new file with mode: 0644]
demo/gradle/build.gradle [new file with mode: 0644]
demo/gradle/gradle.properties [new file with mode: 0644]
demo/gradle/gradle/wrapper/gradle-wrapper.jar [new file with mode: 0644]
demo/gradle/gradle/wrapper/gradle-wrapper.properties [new file with mode: 0644]
demo/gradle/gradlew [new file with mode: 0755]
demo/gradle/gradlew.bat [new file with mode: 0644]
demo/gradle/plugins/build.gradle [new file with mode: 0644]
demo/gradle/plugins/disabled.txt [new file with mode: 0644]
demo/gradle/plugins/enabled.txt [new file with mode: 0644]
demo/gradle/plugins/plugin1/.gitignore [new file with mode: 0644]
demo/gradle/plugins/plugin1/build.gradle [new file with mode: 0644]
demo/gradle/plugins/plugin1/gradle.properties [new file with mode: 0644]
demo/gradle/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java [new file with mode: 0644]
demo/gradle/plugins/plugin2/.gitignore [new file with mode: 0644]
demo/gradle/plugins/plugin2/build.gradle [new file with mode: 0644]
demo/gradle/plugins/plugin2/gradle.properties [new file with mode: 0644]
demo/gradle/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java [new file with mode: 0644]
demo/gradle/plugins/plugin3/build.gradle [new file with mode: 0644]
demo/gradle/plugins/plugin3/gradle.properties [new file with mode: 0644]
demo/gradle/plugins/plugin3/src/main/kotlin/org/pf4j/demo/kotlin/KotlinPlugin.kt [new file with mode: 0644]
demo/gradle/settings.gradle [new file with mode: 0644]
demo/maven/api/pom.xml [new file with mode: 0644]
demo/maven/api/src/main/java/org/pf4j/demo/api/DemoPlugin.java [new file with mode: 0644]
demo/maven/api/src/main/java/org/pf4j/demo/api/Greeting.java [new file with mode: 0644]
demo/maven/api/src/main/java/org/pf4j/demo/api/PluginContext.java [new file with mode: 0644]
demo/maven/app/pom.xml [new file with mode: 0644]
demo/maven/app/src/main/assembly/assembly.xml [new file with mode: 0644]
demo/maven/app/src/main/java/org/pf4j/demo/Boot.java [new file with mode: 0644]
demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginFactory.java [new file with mode: 0644]
demo/maven/app/src/main/java/org/pf4j/demo/DemoPluginManager.java [new file with mode: 0644]
demo/maven/app/src/main/java/org/pf4j/demo/HowdyGreeting.java [new file with mode: 0644]
demo/maven/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java [new file with mode: 0644]
demo/maven/app/src/main/resources/META-INF/services/org.pf4j.demo.api.Greeting [new file with mode: 0644]
demo/maven/app/src/main/resources/simplelogger.properties [new file with mode: 0755]
demo/maven/plugins/disabled.txt [new file with mode: 0644]
demo/maven/plugins/enabled.txt [new file with mode: 0644]
demo/maven/plugins/plugin1/plugin.properties [new file with mode: 0644]
demo/maven/plugins/plugin1/pom.xml [new file with mode: 0644]
demo/maven/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java [new file with mode: 0644]
demo/maven/plugins/plugin2/plugin.properties [new file with mode: 0644]
demo/maven/plugins/plugin2/pom.xml [new file with mode: 0644]
demo/maven/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java [new file with mode: 0644]
demo/maven/plugins/pom.xml [new file with mode: 0644]
demo/maven/pom.xml [new file with mode: 0644]
demo/plugins/disabled.txt [deleted file]
demo/plugins/enabled.txt [deleted file]
demo/plugins/plugin1/plugin.properties [deleted file]
demo/plugins/plugin1/pom.xml [deleted file]
demo/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java [deleted file]
demo/plugins/plugin2/plugin.properties [deleted file]
demo/plugins/plugin2/pom.xml [deleted file]
demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java [deleted file]
demo/plugins/pom.xml [deleted file]
demo/pom.xml [deleted file]
demo_gradle/.gitignore [deleted file]
demo_gradle/README.md [deleted file]
demo_gradle/api/.gitignore [deleted file]
demo_gradle/api/build.gradle [deleted file]
demo_gradle/api/src/main/java/org/pf4j/demo/api/Greeting.java [deleted file]
demo_gradle/app/.gitignore [deleted file]
demo_gradle/app/build.gradle [deleted file]
demo_gradle/app/src/main/java/org/pf4j/demo/Boot.java [deleted file]
demo_gradle/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java [deleted file]
demo_gradle/app/src/main/resources/log4j.properties [deleted file]
demo_gradle/build.gradle [deleted file]
demo_gradle/gradle.properties [deleted file]
demo_gradle/gradle/wrapper/gradle-wrapper.jar [deleted file]
demo_gradle/gradle/wrapper/gradle-wrapper.properties [deleted file]
demo_gradle/gradlew [deleted file]
demo_gradle/gradlew.bat [deleted file]
demo_gradle/plugins/build.gradle [deleted file]
demo_gradle/plugins/disabled.txt [deleted file]
demo_gradle/plugins/enabled.txt [deleted file]
demo_gradle/plugins/plugin1/.gitignore [deleted file]
demo_gradle/plugins/plugin1/build.gradle [deleted file]
demo_gradle/plugins/plugin1/gradle.properties [deleted file]
demo_gradle/plugins/plugin1/src/main/java/org/pf4j/demo/welcome/WelcomePlugin.java [deleted file]
demo_gradle/plugins/plugin2/.gitignore [deleted file]
demo_gradle/plugins/plugin2/build.gradle [deleted file]
demo_gradle/plugins/plugin2/gradle.properties [deleted file]
demo_gradle/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java [deleted file]
demo_gradle/plugins/plugin3/build.gradle [deleted file]
demo_gradle/plugins/plugin3/gradle.properties [deleted file]
demo_gradle/plugins/plugin3/src/main/kotlin/org/pf4j/demo/kotlin/KotlinPlugin.kt [deleted file]
demo_gradle/settings.gradle [deleted file]
pom.xml
run-demo.bat
run-demo.sh

diff --git a/demo/api/pom.xml b/demo/api/pom.xml
deleted file mode 100644 (file)
index 615aa30..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <parent>
-        <groupId>org.pf4j.demo</groupId>
-        <artifactId>pf4j-demo-parent</artifactId>
-        <version>3.12.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>pf4j-demo-api</artifactId>
-    <version>3.12.0-SNAPSHOT</version>
-    <packaging>jar</packaging>
-    <name>Demo Api</name>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-deploy-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.pf4j</groupId>
-            <artifactId>pf4j</artifactId>
-            <version>${project.version}</version>
-            <!-- !!! VERY IMPORTANT -->
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-</project>
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 (file)
index a2f76fc..0000000
+++ /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 (file)
index 828d61b..0000000
+++ /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 (file)
index 0a7506f..0000000
+++ /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 (file)
index 963bb60..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <parent>
-        <groupId>org.pf4j.demo</groupId>
-        <artifactId>pf4j-demo-parent</artifactId>
-        <version>3.12.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>pf4j-demo-app</artifactId>
-    <version>3.12.0-SNAPSHOT</version>
-    <packaging>jar</packaging>
-    <name>Demo App</name>
-
-    <properties>
-        <main.class>org.pf4j.demo.Boot</main.class>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <version>2.3</version>
-                <configuration>
-                    <descriptors>
-                        <descriptor>src/main/assembly/assembly.xml</descriptor>
-                    </descriptors>
-                    <appendAssemblyId>false</appendAssemblyId>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>make-assembly</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>attached</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>lib/</classpathPrefix>
-                            <mainClass>${main.class}</mainClass>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <artifactId>maven-deploy-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.pf4j</groupId>
-            <artifactId>pf4j</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.pf4j.demo</groupId>
-            <artifactId>pf4j-demo-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <!-- Logging -->
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <version>${slf4j.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.4</version>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/demo/app/src/main/assembly/assembly.xml b/demo/app/src/main/assembly/assembly.xml
deleted file mode 100644 (file)
index 77c66b4..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
- Describes the dist
-
- @author Decebal Suiu
- @version 1.0
--->
-<assembly>
-       <id>app</id>
-       <formats>
-               <format>dir</format>
-               <format>zip</format>
-       </formats>
-       <includeBaseDirectory>false</includeBaseDirectory>
-       <dependencySets>
-               <dependencySet>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputDirectory>lib</outputDirectory>
-            <includes>
-                               <include>*:jar:*</include>
-                       </includes>
-               </dependencySet>
-       </dependencySets>
-    <fileSets>
-        <fileSet>
-            <directory>${project.build.directory}</directory>
-            <outputDirectory></outputDirectory>
-            <includes>
-                <include>*.jar</include>
-            </includes>
-            <excludes>
-                <exclude>*-javadoc.jar</exclude>
-                               <exclude>*-sources.jar</exclude>
-            </excludes>
-        </fileSet>
-    </fileSets>
-</assembly>
-
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 (file)
index d101104..0000000
+++ /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<Greeting> 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<String> extensionClassNames = pluginManager.getExtensionClassNames(null);
-        for (String extension : extensionClassNames) {
-            log.info("   {}", extension);
-        }
-
-        log.info("Extension classes by classpath:");
-        List<Class<? extends Greeting>> greetingsClasses = pluginManager.getExtensionClasses(Greeting.class);
-        for (Class<? extends Greeting> greeting : greetingsClasses) {
-            log.info("   Class: {}", greeting.getCanonicalName());
-        }
-
-        // print extensions ids for each started plugin
-        List<PluginWrapper> 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<Greeting> 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 (file)
index bdae2d6..0000000
+++ /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 (file)
index 2571a3e..0000000
+++ /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 (file)
index 050934d..0000000
+++ /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 (file)
index 1341b77..0000000
+++ /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 (file)
index 615a943..0000000
+++ /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 (executable)
index 40302dd..0000000
+++ /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 (file)
index 0000000..12ddda9
--- /dev/null
@@ -0,0 +1,3 @@
+build
+.gradle
+.idea
diff --git a/demo/gradle/README.md b/demo/gradle/README.md
new file mode 100644 (file)
index 0000000..5c8bc80
--- /dev/null
@@ -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 (file)
index 0000000..378eac2
--- /dev/null
@@ -0,0 +1 @@
+build
diff --git a/demo/gradle/api/build.gradle b/demo/gradle/api/build.gradle
new file mode 100644 (file)
index 0000000..a758f70
--- /dev/null
@@ -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 (file)
index 0000000..828d61b
--- /dev/null
@@ -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 (file)
index 0000000..378eac2
--- /dev/null
@@ -0,0 +1 @@
+build
diff --git a/demo/gradle/app/build.gradle b/demo/gradle/app/build.gradle
new file mode 100644 (file)
index 0000000..eaab92a
--- /dev/null
@@ -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 (file)
index 0000000..ebc5c31
--- /dev/null
@@ -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/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 (file)
index 0000000..1341b77
--- /dev/null
@@ -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 (file)
index 0000000..f42e226
--- /dev/null
@@ -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 (file)
index 0000000..9968360
--- /dev/null
@@ -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 (file)
index 0000000..4000315
--- /dev/null
@@ -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 (file)
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 (file)
index 0000000..a441313
--- /dev/null
@@ -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 (executable)
index 0000000..b740cf1
--- /dev/null
@@ -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 (file)
index 0000000..7101f8e
--- /dev/null
@@ -0,0 +1,92 @@
+@rem\r
+@rem Copyright 2015 the original author or authors.\r
+@rem\r
+@rem Licensed under the Apache License, Version 2.0 (the "License");\r
+@rem you may not use this file except in compliance with the License.\r
+@rem You may obtain a copy of the License at\r
+@rem\r
+@rem      https://www.apache.org/licenses/LICENSE-2.0\r
+@rem\r
+@rem Unless required by applicable law or agreed to in writing, software\r
+@rem distributed under the License is distributed on an "AS IS" BASIS,\r
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+@rem See the License for the specific language governing permissions and\r
+@rem limitations under the License.\r
+@rem\r
+\r
+@if "%DEBUG%"=="" @echo off\r
+@rem ##########################################################################\r
+@rem\r
+@rem  Gradle startup script for Windows\r
+@rem\r
+@rem ##########################################################################\r
+\r
+@rem Set local scope for the variables with windows NT shell\r
+if "%OS%"=="Windows_NT" setlocal\r
+\r
+set DIRNAME=%~dp0\r
+if "%DIRNAME%"=="" set DIRNAME=.\r
+@rem This is normally unused\r
+set APP_BASE_NAME=%~n0\r
+set APP_HOME=%DIRNAME%\r
+\r
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.\r
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi\r
+\r
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"\r
+\r
+@rem Find java.exe\r
+if defined JAVA_HOME goto findJavaFromJavaHome\r
+\r
+set JAVA_EXE=java.exe\r
+%JAVA_EXE% -version >NUL 2>&1\r
+if %ERRORLEVEL% equ 0 goto execute\r
+\r
+echo. 1>&2\r
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r
+echo. 1>&2\r
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2\r
+echo location of your Java installation. 1>&2\r
+\r
+goto fail\r
+\r
+:findJavaFromJavaHome\r
+set JAVA_HOME=%JAVA_HOME:"=%\r
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe\r
+\r
+if exist "%JAVA_EXE%" goto execute\r
+\r
+echo. 1>&2\r
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r
+echo. 1>&2\r
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2\r
+echo location of your Java installation. 1>&2\r
+\r
+goto fail\r
+\r
+:execute\r
+@rem Setup the command line\r
+\r
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar\r
+\r
+\r
+@rem Execute Gradle\r
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*\r
+\r
+:end\r
+@rem End local scope for the variables with windows NT shell\r
+if %ERRORLEVEL% equ 0 goto mainEnd\r
+\r
+:fail\r
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r
+rem the _cmd.exe /c_ return code!\r
+set EXIT_CODE=%ERRORLEVEL%\r
+if %EXIT_CODE% equ 0 set EXIT_CODE=1\r
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%\r
+exit /b %EXIT_CODE%\r
+\r
+:mainEnd\r
+if "%OS%"=="Windows_NT" endlocal\r
+\r
+:omega\r
diff --git a/demo/gradle/plugins/build.gradle b/demo/gradle/plugins/build.gradle
new file mode 100644 (file)
index 0000000..4b03210
--- /dev/null
@@ -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 (file)
index 0000000..45f1801
--- /dev/null
@@ -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 (file)
index 0000000..3d76b2f
--- /dev/null
@@ -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 (file)
index 0000000..378eac2
--- /dev/null
@@ -0,0 +1 @@
+build
diff --git a/demo/gradle/plugins/plugin1/build.gradle b/demo/gradle/plugins/plugin1/build.gradle
new file mode 100644 (file)
index 0000000..78eef47
--- /dev/null
@@ -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 (file)
index 0000000..2edd800
--- /dev/null
@@ -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 (file)
index 0000000..aaf1804
--- /dev/null
@@ -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 (file)
index 0000000..378eac2
--- /dev/null
@@ -0,0 +1 @@
+build
diff --git a/demo/gradle/plugins/plugin2/build.gradle b/demo/gradle/plugins/plugin2/build.gradle
new file mode 100644 (file)
index 0000000..78eef47
--- /dev/null
@@ -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 (file)
index 0000000..ef70127
--- /dev/null
@@ -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 (file)
index 0000000..f9c7797
--- /dev/null
@@ -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 (file)
index 0000000..4371251
--- /dev/null
@@ -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 (file)
index 0000000..a04b609
--- /dev/null
@@ -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 (file)
index 0000000..2b2bc17
--- /dev/null
@@ -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 (file)
index 0000000..828e80a
--- /dev/null
@@ -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 (file)
index 0000000..615aa30
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <groupId>org.pf4j.demo</groupId>
+        <artifactId>pf4j-demo-parent</artifactId>
+        <version>3.12.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>pf4j-demo-api</artifactId>
+    <version>3.12.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>Demo Api</name>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.pf4j</groupId>
+            <artifactId>pf4j</artifactId>
+            <version>${project.version}</version>
+            <!-- !!! VERY IMPORTANT -->
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+</project>
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 (file)
index 0000000..a2f76fc
--- /dev/null
@@ -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 (file)
index 0000000..828d61b
--- /dev/null
@@ -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 (file)
index 0000000..0a7506f
--- /dev/null
@@ -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 (file)
index 0000000..963bb60
--- /dev/null
@@ -0,0 +1,92 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <groupId>org.pf4j.demo</groupId>
+        <artifactId>pf4j-demo-parent</artifactId>
+        <version>3.12.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>pf4j-demo-app</artifactId>
+    <version>3.12.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>Demo App</name>
+
+    <properties>
+        <main.class>org.pf4j.demo.Boot</main.class>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>2.3</version>
+                <configuration>
+                    <descriptors>
+                        <descriptor>src/main/assembly/assembly.xml</descriptor>
+                    </descriptors>
+                    <appendAssemblyId>false</appendAssemblyId>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>attached</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <classpathPrefix>lib/</classpathPrefix>
+                            <mainClass>${main.class}</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.pf4j</groupId>
+            <artifactId>pf4j</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.pf4j.demo</groupId>
+            <artifactId>pf4j-demo-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- Logging -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <version>${slf4j.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.4</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/demo/maven/app/src/main/assembly/assembly.xml b/demo/maven/app/src/main/assembly/assembly.xml
new file mode 100644 (file)
index 0000000..77c66b4
--- /dev/null
@@ -0,0 +1,37 @@
+<!--
+ Describes the dist
+
+ @author Decebal Suiu
+ @version 1.0
+-->
+<assembly>
+       <id>app</id>
+       <formats>
+               <format>dir</format>
+               <format>zip</format>
+       </formats>
+       <includeBaseDirectory>false</includeBaseDirectory>
+       <dependencySets>
+               <dependencySet>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputDirectory>lib</outputDirectory>
+            <includes>
+                               <include>*:jar:*</include>
+                       </includes>
+               </dependencySet>
+       </dependencySets>
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.directory}</directory>
+            <outputDirectory></outputDirectory>
+            <includes>
+                <include>*.jar</include>
+            </includes>
+            <excludes>
+                <exclude>*-javadoc.jar</exclude>
+                               <exclude>*-sources.jar</exclude>
+            </excludes>
+        </fileSet>
+    </fileSets>
+</assembly>
+
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 (file)
index 0000000..d101104
--- /dev/null
@@ -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<Greeting> 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<String> extensionClassNames = pluginManager.getExtensionClassNames(null);
+        for (String extension : extensionClassNames) {
+            log.info("   {}", extension);
+        }
+
+        log.info("Extension classes by classpath:");
+        List<Class<? extends Greeting>> greetingsClasses = pluginManager.getExtensionClasses(Greeting.class);
+        for (Class<? extends Greeting> greeting : greetingsClasses) {
+            log.info("   Class: {}", greeting.getCanonicalName());
+        }
+
+        // print extensions ids for each started plugin
+        List<PluginWrapper> 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<Greeting> 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 (file)
index 0000000..bdae2d6
--- /dev/null
@@ -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 (file)
index 0000000..2571a3e
--- /dev/null
@@ -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 (file)
index 0000000..050934d
--- /dev/null
@@ -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 (file)
index 0000000..1341b77
--- /dev/null
@@ -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 (file)
index 0000000..615a943
--- /dev/null
@@ -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 (executable)
index 0000000..40302dd
--- /dev/null
@@ -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 (file)
index 0000000..45f1801
--- /dev/null
@@ -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 (file)
index 0000000..3d76b2f
--- /dev/null
@@ -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 (file)
index 0000000..9da9bcc
--- /dev/null
@@ -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 (file)
index 0000000..5873fdd
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <groupId>org.pf4j.demo</groupId>
+        <artifactId>pf4j-demo-plugins</artifactId>
+        <version>3.12.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>pf4j-demo-plugin1</artifactId>
+    <version>3.12.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>Demo Plugin #1</name>
+
+    <properties>
+        <plugin.id>welcome-plugin</plugin.id>
+        <plugin.class>org.pf4j.demo.welcome.WelcomePlugin</plugin.class>
+        <plugin.version>0.0.1</plugin.version>
+        <plugin.provider>Decebal Suiu</plugin.provider>
+        <plugin.dependencies />
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+    </dependencies>
+
+</project>
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 (file)
index 0000000..3064902
--- /dev/null
@@ -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 (file)
index 0000000..60b6f33
--- /dev/null
@@ -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 (file)
index 0000000..82ed985
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <groupId>org.pf4j.demo</groupId>
+        <artifactId>pf4j-demo-plugins</artifactId>
+        <version>3.12.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>pf4j-demo-plugin2</artifactId>
+    <version>3.12.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>Demo Plugin #2</name>
+
+    <properties>
+        <plugin.id>hello-plugin</plugin.id>
+        <plugin.class>org.pf4j.demo.hello.HelloPlugin</plugin.class>
+        <plugin.version>0.0.1</plugin.version>
+        <plugin.provider>Decebal Suiu</plugin.provider>
+        <plugin.dependencies />
+    </properties>
+
+</project>
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 (file)
index 0000000..ed67878
--- /dev/null
@@ -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 (file)
index 0000000..13d41f6
--- /dev/null
@@ -0,0 +1,99 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <groupId>org.pf4j.demo</groupId>
+        <artifactId>pf4j-demo-parent</artifactId>
+        <version>3.12.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>pf4j-demo-plugins</artifactId>
+    <version>3.12.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>Demo Plugins Parent</name>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+        <!-- Override below properties in each plugin's pom.xml -->
+        <plugin.id />
+        <plugin.class />
+        <plugin.version />
+        <plugin.provider />
+        <plugin.dependencies />
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>3.1.0</version>
+                <configuration>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                    <finalName>${project.artifactId}-${project.version}-all</finalName>
+                    <appendAssemblyId>false</appendAssemblyId>
+                    <attach>false</attach>
+                    <archive>
+                        <manifest>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                        </manifest>
+                        <manifestEntries>
+                            <Plugin-Id>${plugin.id}</Plugin-Id>
+                            <Plugin-Version>${plugin.version}</Plugin-Version>
+                            <Plugin-Provider>${plugin.provider}</Plugin-Provider>
+                            <Plugin-Class>${plugin.class}</Plugin-Class>
+                            <Plugin-Dependencies>${plugin.dependencies}</Plugin-Dependencies>
+                        </manifestEntries>
+                    </archive>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+                <version>2.8.2</version>
+            </plugin>
+        </plugins>
+    </build>
+
+    <modules>
+        <module>plugin1</module>
+        <module>plugin2</module>
+    </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.pf4j</groupId>
+            <artifactId>pf4j</artifactId>
+            <version>${project.version}</version>
+            <!-- !!! VERY IMPORTANT -->
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.pf4j.demo</groupId>
+            <artifactId>pf4j-demo-api</artifactId>
+            <version>${project.version}</version>
+            <!-- !!! VERY IMPORTANT -->
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/demo/maven/pom.xml b/demo/maven/pom.xml
new file mode 100644 (file)
index 0000000..36a0738
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <groupId>org.pf4j</groupId>
+        <artifactId>pf4j-parent</artifactId>
+        <version>3.12.0-SNAPSHOT</version>
+        <relativePath>../..</relativePath>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.pf4j.demo</groupId>
+    <artifactId>pf4j-demo-parent</artifactId>
+    <version>3.12.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>Demo Parent</name>
+
+    <properties>
+        <javadoc.disabled>true</javadoc.disabled>
+        <deploy.disabled>true</deploy.disabled>
+        <source.disabled>true</source.disabled>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <filtering>false</filtering>
+                <directory>src/main/java</directory>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+    </build>
+
+    <modules>
+        <module>app</module>
+        <module>api</module>
+        <module>plugins</module>
+    </modules>
+
+</project>
diff --git a/demo/plugins/disabled.txt b/demo/plugins/disabled.txt
deleted file mode 100644 (file)
index 45f1801..0000000
+++ /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 (file)
index 3d76b2f..0000000
+++ /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 (file)
index 9da9bcc..0000000
+++ /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 (file)
index 5873fdd..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <parent>
-        <groupId>org.pf4j.demo</groupId>
-        <artifactId>pf4j-demo-plugins</artifactId>
-        <version>3.12.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>pf4j-demo-plugin1</artifactId>
-    <version>3.12.0-SNAPSHOT</version>
-    <packaging>jar</packaging>
-    <name>Demo Plugin #1</name>
-
-    <properties>
-        <plugin.id>welcome-plugin</plugin.id>
-        <plugin.class>org.pf4j.demo.welcome.WelcomePlugin</plugin.class>
-        <plugin.version>0.0.1</plugin.version>
-        <plugin.provider>Decebal Suiu</plugin.provider>
-        <plugin.dependencies />
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.6</version>
-        </dependency>
-    </dependencies>
-
-</project>
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 (file)
index 3064902..0000000
+++ /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 (file)
index 60b6f33..0000000
+++ /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 (file)
index 82ed985..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <parent>
-        <groupId>org.pf4j.demo</groupId>
-        <artifactId>pf4j-demo-plugins</artifactId>
-        <version>3.12.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>pf4j-demo-plugin2</artifactId>
-    <version>3.12.0-SNAPSHOT</version>
-    <packaging>jar</packaging>
-    <name>Demo Plugin #2</name>
-
-    <properties>
-        <plugin.id>hello-plugin</plugin.id>
-        <plugin.class>org.pf4j.demo.hello.HelloPlugin</plugin.class>
-        <plugin.version>0.0.1</plugin.version>
-        <plugin.provider>Decebal Suiu</plugin.provider>
-        <plugin.dependencies />
-    </properties>
-
-</project>
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 (file)
index ed67878..0000000
+++ /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 (file)
index 13d41f6..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <parent>
-        <groupId>org.pf4j.demo</groupId>
-        <artifactId>pf4j-demo-parent</artifactId>
-        <version>3.12.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>pf4j-demo-plugins</artifactId>
-    <version>3.12.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <name>Demo Plugins Parent</name>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-
-        <!-- Override below properties in each plugin's pom.xml -->
-        <plugin.id />
-        <plugin.class />
-        <plugin.version />
-        <plugin.provider />
-        <plugin.dependencies />
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <version>3.1.0</version>
-                <configuration>
-                    <descriptorRefs>
-                        <descriptorRef>jar-with-dependencies</descriptorRef>
-                    </descriptorRefs>
-                    <finalName>${project.artifactId}-${project.version}-all</finalName>
-                    <appendAssemblyId>false</appendAssemblyId>
-                    <attach>false</attach>
-                    <archive>
-                        <manifest>
-                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-                        </manifest>
-                        <manifestEntries>
-                            <Plugin-Id>${plugin.id}</Plugin-Id>
-                            <Plugin-Version>${plugin.version}</Plugin-Version>
-                            <Plugin-Provider>${plugin.provider}</Plugin-Provider>
-                            <Plugin-Class>${plugin.class}</Plugin-Class>
-                            <Plugin-Dependencies>${plugin.dependencies}</Plugin-Dependencies>
-                        </manifestEntries>
-                    </archive>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>make-assembly</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-deploy-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-                <version>2.8.2</version>
-            </plugin>
-        </plugins>
-    </build>
-
-    <modules>
-        <module>plugin1</module>
-        <module>plugin2</module>
-    </modules>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.pf4j</groupId>
-            <artifactId>pf4j</artifactId>
-            <version>${project.version}</version>
-            <!-- !!! VERY IMPORTANT -->
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.pf4j.demo</groupId>
-            <artifactId>pf4j-demo-api</artifactId>
-            <version>${project.version}</version>
-            <!-- !!! VERY IMPORTANT -->
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/demo/pom.xml b/demo/pom.xml
deleted file mode 100644 (file)
index 5e8a8b6..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <parent>
-        <groupId>org.pf4j</groupId>
-        <artifactId>pf4j-parent</artifactId>
-        <version>3.12.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.pf4j.demo</groupId>
-    <artifactId>pf4j-demo-parent</artifactId>
-    <version>3.12.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <name>Demo Parent</name>
-
-    <properties>
-        <javadoc.disabled>true</javadoc.disabled>
-        <deploy.disabled>true</deploy.disabled>
-        <source.disabled>true</source.disabled>
-    </properties>
-
-    <build>
-        <resources>
-            <resource>
-                <filtering>false</filtering>
-                <directory>src/main/java</directory>
-                <excludes>
-                    <exclude>**/*.java</exclude>
-                </excludes>
-            </resource>
-            <resource>
-                <directory>src/main/resources</directory>
-            </resource>
-        </resources>
-    </build>
-
-    <modules>
-        <module>app</module>
-        <module>api</module>
-        <module>plugins</module>
-    </modules>
-
-</project>
diff --git a/demo_gradle/.gitignore b/demo_gradle/.gitignore
deleted file mode 100644 (file)
index 12ddda9..0000000
+++ /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 (file)
index 5c8bc80..0000000
+++ /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 (file)
index 378eac2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-build
diff --git a/demo_gradle/api/build.gradle b/demo_gradle/api/build.gradle
deleted file mode 100644 (file)
index 0d3ca62..0000000
+++ /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 (file)
index 828d61b..0000000
+++ /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 (file)
index 378eac2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-build
diff --git a/demo_gradle/app/build.gradle b/demo_gradle/app/build.gradle
deleted file mode 100644 (file)
index 85c2412..0000000
+++ /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 (file)
index ebc5c31..0000000
+++ /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<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_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 (file)
index 1341b77..0000000
+++ /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 (file)
index f42e226..0000000
+++ /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 (file)
index 9968360..0000000
+++ /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 (file)
index 4000315..0000000
+++ /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 (file)
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 (file)
index 4aeeaec..0000000
+++ /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 (executable)
index 2fe81a7..0000000
+++ /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 (file)
index 24467a1..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-@rem\r
-@rem Copyright 2015 the original author or authors.\r
-@rem\r
-@rem Licensed under the Apache License, Version 2.0 (the "License");\r
-@rem you may not use this file except in compliance with the License.\r
-@rem You may obtain a copy of the License at\r
-@rem\r
-@rem      https://www.apache.org/licenses/LICENSE-2.0\r
-@rem\r
-@rem Unless required by applicable law or agreed to in writing, software\r
-@rem distributed under the License is distributed on an "AS IS" BASIS,\r
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@rem See the License for the specific language governing permissions and\r
-@rem limitations under the License.\r
-@rem\r
-\r
-@if "%DEBUG%" == "" @echo off\r
-@rem ##########################################################################\r
-@rem\r
-@rem  Gradle startup script for Windows\r
-@rem\r
-@rem ##########################################################################\r
-\r
-@rem Set local scope for the variables with windows NT shell\r
-if "%OS%"=="Windows_NT" setlocal\r
-\r
-set DIRNAME=%~dp0\r
-if "%DIRNAME%" == "" set DIRNAME=.\r
-set APP_BASE_NAME=%~n0\r
-set APP_HOME=%DIRNAME%\r
-\r
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"\r
-\r
-@rem Find java.exe\r
-if defined JAVA_HOME goto findJavaFromJavaHome\r
-\r
-set JAVA_EXE=java.exe\r
-%JAVA_EXE% -version >NUL 2>&1\r
-if "%ERRORLEVEL%" == "0" goto init\r
-\r
-echo.\r
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r
-echo.\r
-echo Please set the JAVA_HOME variable in your environment to match the\r
-echo location of your Java installation.\r
-\r
-goto fail\r
-\r
-:findJavaFromJavaHome\r
-set JAVA_HOME=%JAVA_HOME:"=%\r
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe\r
-\r
-if exist "%JAVA_EXE%" goto init\r
-\r
-echo.\r
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r
-echo.\r
-echo Please set the JAVA_HOME variable in your environment to match the\r
-echo location of your Java installation.\r
-\r
-goto fail\r
-\r
-:init\r
-@rem Get command-line arguments, handling Windows variants\r
-\r
-if not "%OS%" == "Windows_NT" goto win9xME_args\r
-\r
-:win9xME_args\r
-@rem Slurp the command line arguments.\r
-set CMD_LINE_ARGS=\r
-set _SKIP=2\r
-\r
-:win9xME_args_slurp\r
-if "x%~1" == "x" goto execute\r
-\r
-set CMD_LINE_ARGS=%*\r
-\r
-:execute\r
-@rem Setup the command line\r
-\r
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar\r
-\r
-@rem Execute Gradle\r
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r
-\r
-:end\r
-@rem End local scope for the variables with windows NT shell\r
-if "%ERRORLEVEL%"=="0" goto mainEnd\r
-\r
-:fail\r
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r
-rem the _cmd.exe /c_ return code!\r
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1\r
-exit /b 1\r
-\r
-:mainEnd\r
-if "%OS%"=="Windows_NT" endlocal\r
-\r
-:omega\r
diff --git a/demo_gradle/plugins/build.gradle b/demo_gradle/plugins/build.gradle
deleted file mode 100644 (file)
index a46f84c..0000000
+++ /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 (file)
index 45f1801..0000000
+++ /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 (file)
index 3d76b2f..0000000
+++ /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 (file)
index 378eac2..0000000
+++ /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 (file)
index f3f00a5..0000000
+++ /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 (file)
index 2edd800..0000000
+++ /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 (file)
index aaf1804..0000000
+++ /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 (file)
index 378eac2..0000000
+++ /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 (file)
index f3f00a5..0000000
+++ /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 (file)
index ef70127..0000000
+++ /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 (file)
index f9c7797..0000000
+++ /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 (file)
index 1860b61..0000000
+++ /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 (file)
index a04b609..0000000
+++ /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 (file)
index 2b2bc17..0000000
+++ /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 (file)
index 828e80a..0000000
+++ /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 19884e29e4f7a78da320314277e35fbb5b5a9258..b59b24e11d4ab4cf0ffefc0acc060982a5e703ff 100644 (file)
--- a/pom.xml
+++ b/pom.xml
 
     <modules>
         <module>pf4j</module>
-        <module>demo</module>
+        <module>demo/maven</module>
         <module>maven-archetypes/quickstart</module>
     </modules>
 
index 6622d90a254ce75a3ddc30f86032f447ef741e9b..f8846cd0f15a601282c67631438c8fee8c12be02 100644 (file)
@@ -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
 
index 96ba79966ccc85834a06bed192e3f4b9052f6bd2..2991e57147651d5060e815556a2b9dcf4a95b23b 100755 (executable)
@@ -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