// expand all plugin archives\r
FileFilter zipFilter = new ZipFileFilter();\r
File[] zipFiles = pluginsDirectory.listFiles(zipFilter);\r
- for (File zipFile : zipFiles) {\r
- try {\r
- expandPluginArchive(zipFile);\r
- } catch (IOException e) {\r
- log.error(e.getMessage(), e);\r
- }\r
+ if (zipFiles != null) {\r
+ for (File zipFile : zipFiles) {\r
+ try {\r
+ expandPluginArchive(zipFile);\r
+ } catch (IOException e) {\r
+ log.error(e.getMessage(), e);\r
+ }\r
+ }\r
}\r
\r
// check for no plugins\r
filterList.add(new NotFileFilter(createHiddenPluginFilter()));\r
FileFilter pluginsFilter = new AndFileFilter(filterList);\r
File[] directories = pluginsDirectory.listFiles(pluginsFilter);\r
- log.debug("Found possible {} plugins: {}", directories.length, Arrays.asList(directories));\r
- if (directories.length == 0) {\r
+ List<File> dirArray = new ArrayList<File>();\r
+ if (directories != null) {\r
+ dirArray.addAll(Arrays.asList(directories));\r
+ }\r
+ log.debug("Found possible {} plugins: {}", dirArray.size(), dirArray);\r
+ if (dirArray.size() == 0) {\r
log.info("No plugins");\r
return;\r
}\r
\r
// load any plugin from plugins directory\r
- for (File directory : directories) {\r
- try {\r
- loadPlugin(directory);\r
- } catch (PluginException e) {\r
- log.error(e.getMessage(), e);\r
- }\r
- }\r
+ for (File directory : dirArray) {\r
+ try {\r
+ loadPlugin(directory);\r
+ } catch (PluginException e) {\r
+ log.error(e.getMessage(), e);\r
+ }\r
+ }\r
\r
// resolve 'unresolvedPlugins'\r
try {\r
return false;\r
}\r
\r
+ @Override\r
+ public boolean deletePlugin(String pluginId) {\r
+ if (!plugins.containsKey(pluginId)) {\r
+ throw new IllegalArgumentException(String.format("Unknown pluginId %s", pluginId));\r
+ }\r
+ PluginWrapper pw = getPlugin(pluginId);\r
+ PluginState state = stopPlugin(pluginId);\r
+\r
+ if (PluginState.STOPPED != state) {\r
+ log.error(String.format("Failed to stop plugin %s on delete", pluginId));\r
+ return false;\r
+ }\r
+\r
+ if (!unloadPlugin(pluginId)) {\r
+ log.error(String.format("Failed to unload plugin %s on delete", pluginId));\r
+ return false;\r
+ }\r
+\r
+ File pluginFolder = new File(pluginsDirectory, pw.getPluginPath());\r
+ File pluginZip = null;\r
+\r
+ FileFilter zipFilter = new ZipFileFilter();\r
+ File[] zipFiles = pluginsDirectory.listFiles(zipFilter);\r
+ if (zipFiles != null) {\r
+ // strip prepended / from the plugin path\r
+ String dirName = pw.getPluginPath().substring(1);\r
+ // find the zip file that matches the plugin path\r
+ for (File zipFile : zipFiles) {\r
+ String name = zipFile.getName().substring(0, zipFile.getName().lastIndexOf('.'));\r
+ if (name.equals(dirName)) {\r
+ pluginZip = zipFile;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (pluginFolder.exists()) {\r
+ FileUtils.delete(pluginFolder);\r
+ }\r
+ if (pluginZip != null && pluginZip.exists()) {\r
+ FileUtils.delete(pluginZip);\r
+ }\r
+ return true;\r
+ }\r
+\r
/**\r
* Get plugin class loader for this path.\r
*/\r
/*
* 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.
*/
public class FileUtils {
- public static List<String> readLines(File file, boolean ignoreComments) throws IOException {
+ public static List<String> readLines(File file, boolean ignoreComments) throws IOException {
if (!file.exists() || !file.isFile()) {
return Collections.emptyList();
}
-
+
List<String> lines = new ArrayList<String>();
BufferedReader reader = null;
reader.close();
}
}
-
+
return lines;
}
-
+
+ /**
+ * Delete a file or recursively delete a folder.
+ *
+ * @param fileOrFolder
+ * @return true, if successful
+ */
+ public static boolean delete(File fileOrFolder) {
+ boolean success = false;
+ if (fileOrFolder.isDirectory()) {
+ File [] files = fileOrFolder.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ if (file.isDirectory()) {
+ success |= delete(file);
+ } else {
+ success |= file.delete();
+ }
+ }
+ }
+ }
+ success |= fileOrFolder.delete();
+ return success;
+ }
}