--- /dev/null
+/*
+ * 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;
+ }
+
+}
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;
private ExtensionFactory extensionFactory;
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;
}
// 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
if (!pluginStatusProvider.disablePlugin(pluginId)) {
return false;
}
-
+
log.info("Disabled plugin '{}:{}'", pluginDescriptor.getPluginId(), pluginDescriptor.getVersion());
return true;
}
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;
}
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);
}
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);
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+
+}