summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDecebal Suiu <decebal.suiu@gmail.com>2015-06-05 15:57:08 +0300
committerDecebal Suiu <decebal.suiu@gmail.com>2015-06-05 15:57:08 +0300
commitbbdfdfb77897478c05a35cda6ed86774cfeca179 (patch)
treecd39e3b5342a5ffa473a38939225b6e88ae0f8b4
parent56ac163f9119a32cb7ec7119890eba7146cdd9db (diff)
parent56a7ee47ac9758357ce6d5d8eb807da3a7910198 (diff)
downloadpf4j-bbdfdfb77897478c05a35cda6ed86774cfeca179.tar.gz
pf4j-bbdfdfb77897478c05a35cda6ed86774cfeca179.zip
Merge pull request #43 from decebals/plugin-repository
review #41
-rw-r--r--pf4j/src/main/java/ro/fortsoft/pf4j/CompoundPluginRepository.java52
-rw-r--r--pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java63
-rw-r--r--pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginRepository.java67
-rw-r--r--pf4j/src/main/java/ro/fortsoft/pf4j/PluginRepository.java41
4 files changed, 184 insertions, 39 deletions
diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/CompoundPluginRepository.java b/pf4j/src/main/java/ro/fortsoft/pf4j/CompoundPluginRepository.java
new file mode 100644
index 0000000..28c5d80
--- /dev/null
+++ b/pf4j/src/main/java/ro/fortsoft/pf4j/CompoundPluginRepository.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Decebal Suiu
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with
+ * the License. You may obtain a copy of the License in the LICENSE file, or 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 ro.fortsoft.pf4j;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Decebal Suiu
+ * @author Mário Franco
+ */
+public class CompoundPluginRepository implements PluginRepository {
+
+ private final PluginRepository[] repositories;
+
+ public CompoundPluginRepository(PluginRepository... repositories) {
+ this.repositories = repositories;
+ }
+
+ @Override
+ public List<File> getPluginArchives() {
+ List<File> file = new ArrayList<>();
+ for (PluginRepository repository : repositories) {
+ file.addAll(repository.getPluginArchives());
+ }
+
+ return file;
+ }
+
+ @Override
+ public boolean deletePluginArchive(String pluginPath) {
+ for (PluginRepository repository : repositories) {
+ if (repository.deletePluginArchive(pluginPath)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java b/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java
index 9334315..9ee3e7a 100644
--- a/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java
+++ b/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java
@@ -34,9 +34,6 @@ public class DefaultPluginManager implements PluginManager {
public static final String DEFAULT_PLUGINS_DIRECTORY = "plugins";
public static final String DEVELOPMENT_PLUGINS_DIRECTORY = "../plugins";
- /**
- * The plugins repository.
- */
private File pluginsDirectory;
private ExtensionFinder extensionFinder;
@@ -96,19 +93,23 @@ public class DefaultPluginManager implements PluginManager {
private PluginStatusProvider pluginStatusProvider;
/**
+ * The plugins repository.
+ */
+ private PluginRepository pluginRepository;
+
+ /**
* The plugins directory is supplied by System.getProperty("pf4j.pluginsDir", "plugins").
*/
public DefaultPluginManager() {
- this.pluginsDirectory = createPluginsDirectory();
+ this.pluginsDirectory = createPluginsDirectory();
- initialize();
+ initialize();
}
/**
* Constructs DefaultPluginManager which the given plugins directory.
*
- * @param pluginsDirectory
- * the directory to search for plugins
+ * @param pluginsDirectory the directory to search for plugins
*/
public DefaultPluginManager(File pluginsDirectory) {
this.pluginsDirectory = pluginsDirectory;
@@ -343,16 +344,13 @@ public class DefaultPluginManager implements PluginManager {
}
// expand all plugin archives
- FileFilter zipFilter = new ZipFileFilter();
- File[] zipFiles = pluginsDirectory.listFiles(zipFilter);
- if (zipFiles != null) {
- for (File zipFile : zipFiles) {
- try {
- expandPluginArchive(zipFile);
- } catch (IOException e) {
- log.error(e.getMessage(), e);
- }
- }
+ List<File> pluginArchives = pluginRepository.getPluginArchives();
+ for (File archiveFile : pluginArchives) {
+ try {
+ expandPluginArchive(archiveFile);
+ } catch (IOException e) {
+ log.error(e.getMessage(), e);
+ }
}
// check for no plugins
@@ -447,7 +445,7 @@ public class DefaultPluginManager implements PluginManager {
if (!pluginStatusProvider.disablePlugin(pluginId)) {
return false;
}
-
+
log.info("Disabled plugin '{}:{}'", pluginDescriptor.getPluginId(), pluginDescriptor.getVersion());
return true;
@@ -508,29 +506,12 @@ public class DefaultPluginManager implements PluginManager {
}
File pluginFolder = new File(pluginsDirectory, pluginWrapper.getPluginPath());
- File pluginZip = null;
-
- FileFilter zipFilter = new ZipFileFilter();
- File[] zipFiles = pluginsDirectory.listFiles(zipFilter);
- if (zipFiles != null) {
- // strip prepended / from the plugin path
- String dirName = pluginWrapper.getPluginPath().substring(1);
- // find the zip file that matches the plugin path
- for (File zipFile : zipFiles) {
- String name = zipFile.getName().substring(0, zipFile.getName().lastIndexOf('.'));
- if (name.equals(dirName)) {
- pluginZip = zipFile;
- break;
- }
- }
- }
if (pluginFolder.exists()) {
FileUtils.delete(pluginFolder);
}
- if (pluginZip != null && pluginZip.exists()) {
- FileUtils.delete(pluginZip);
- }
+
+ pluginRepository.deletePluginArchive(pluginWrapper.getPluginPath());
return true;
}
@@ -651,8 +632,11 @@ public class DefaultPluginManager implements PluginManager {
return new DefaultPluginStatusProvider(pluginsDirectory);
}
- protected boolean isPluginDisabled(String pluginId) {
+ protected PluginRepository createPluginRepository() {
+ return new DefaultPluginRepository(pluginsDirectory, new ZipFileFilter());
+ }
+ protected boolean isPluginDisabled(String pluginId) {
return pluginStatusProvider.isPluginDisabled(pluginId);
}
@@ -729,11 +713,12 @@ public class DefaultPluginManager implements PluginManager {
pluginDescriptorFinder = createPluginDescriptorFinder();
extensionFinder = createExtensionFinder();
pluginStatusProvider = createPluginStatusProvider();
+ pluginRepository = createPluginRepository();
System.setProperty("pf4j.pluginsDir", pluginsDirectory.getAbsolutePath());
}
- private PluginWrapper loadPluginDirectory(File pluginDirectory) throws PluginException {
+ private PluginWrapper loadPluginDirectory(File pluginDirectory) throws PluginException {
// try to load the plugin
String pluginName = pluginDirectory.getName();
String pluginPath = "/".concat(pluginName);
diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginRepository.java b/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginRepository.java
new file mode 100644
index 0000000..15f6ca3
--- /dev/null
+++ b/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginRepository.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Decebal Suiu
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with
+ * the License. You may obtain a copy of the License in the LICENSE file, or 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 ro.fortsoft.pf4j;
+
+import ro.fortsoft.pf4j.util.FileUtils;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Decebal Suiu
+ * @author Mário Franco
+ */
+public class DefaultPluginRepository implements PluginRepository {
+
+ private final File directory;
+ private final FileFilter filter;
+
+ public DefaultPluginRepository(File directory, FileFilter filter) {
+ this.directory = directory;
+ this.filter = filter;
+ }
+
+ @Override
+ public List<File> getPluginArchives() {
+ File[] files = directory.listFiles(filter);
+
+ return (files != null) ? Arrays.asList(files) : Collections.<File>emptyList();
+ }
+
+ @Override
+ public boolean deletePluginArchive(String pluginPath) {
+ File[] files = directory.listFiles(filter);
+ if (files != null) {
+ File pluginArchive = null;
+ // strip prepended "/" from the plugin path
+ String dirName = pluginPath.substring(1);
+ // find the zip file that matches the plugin path
+ for (File archive : files) {
+ String name = archive.getName().substring(0, archive.getName().lastIndexOf('.'));
+ if (name.equals(dirName)) {
+ pluginArchive = archive;
+ break;
+ }
+ }
+ if (pluginArchive != null && pluginArchive.exists()) {
+ return FileUtils.delete(pluginArchive);
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/PluginRepository.java b/pf4j/src/main/java/ro/fortsoft/pf4j/PluginRepository.java
new file mode 100644
index 0000000..dcdcc42
--- /dev/null
+++ b/pf4j/src/main/java/ro/fortsoft/pf4j/PluginRepository.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Decebal Suiu
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with
+ * the License. You may obtain a copy of the License in the LICENSE file, or 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 ro.fortsoft.pf4j;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Directory whose contents are .zip files used as plugins.
+ *
+ * @author Decebal Suiu
+ * @author Mário Franco
+ */
+public interface PluginRepository {
+
+ /**
+ * List all plugin archive filed.
+ *
+ * @return a list of files
+ */
+ public List<File> getPluginArchives();
+
+ /**
+ * Removes a plugin from the repository.
+ *
+ * @param pluginPath the plugin path
+ * @return true if deleted
+ */
+ public boolean deletePluginArchive(String pluginPath);
+
+}