From e3a4bb66aab2516be36fbaaa26b9b46af82c19eb Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Thu, 23 Feb 2012 11:57:39 +0000 Subject: [PATCH] LMS-2612 CorePluginInjector: Allowing to disable core plugins SVN: 24536 --- .../shared/utils/CorePluginsInjector.java | 75 ++++++++++++++----- .../shared/utils/CorePluginsInjectorTest.java | 26 +++++++ 2 files changed, 84 insertions(+), 17 deletions(-) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjector.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjector.java index b32f6d88c35..36aab142216 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjector.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjector.java @@ -31,6 +31,7 @@ import java.util.Set; import java.util.TreeSet; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; @@ -46,7 +47,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CorePlugin; import ch.systemsx.cisd.openbis.generic.shared.coreplugin.CorePluginScanner; /** - * + * Injector of DSS plugin.properties from core plugins folder into service.properties. * * @author Franz-Josef Elmer */ @@ -56,6 +57,8 @@ class CorePluginsInjector static final String CORE_PLUGINS_FOLDER_KEY = "core-plugins-folder"; + static final String DISABLED_CORE_PLUGINS_KEY = "disabled-core-plugins"; + static final String PLUGIN_PROPERTIES_FILE_NAME = "plugin.properties"; enum PluginType @@ -126,11 +129,12 @@ class CorePluginsInjector { return; } + Set<String> disabledPlugins = getDisabledPlugins(properties); PluginKeyBundles pluginKeyBundles = new PluginKeyBundles(properties); Set<String> pluginNames = new HashSet<String>(); pluginKeyBundles.addAndCheckUniquePluginNames(pluginNames); Map<PluginType, Map<String, DssCorePlugin>> plugins = - scanForCorePlugins(corePluginsFolderPath, pluginNames); + scanForCorePlugins(corePluginsFolderPath, disabledPlugins, pluginNames); for (Entry<PluginType, Map<String, DssCorePlugin>> entry : plugins.entrySet()) { PluginType pluginType = entry.getKey(); @@ -168,9 +172,24 @@ class CorePluginsInjector } pluginKeyBundles.addOrReplaceKeyBundleIn(properties); } + + private Set<String> getDisabledPlugins(Properties properties) + { + Set<String> set = new HashSet<String>(); + String property = properties.getProperty(DISABLED_CORE_PLUGINS_KEY); + if (StringUtils.isNotBlank(property)) + { + String[] splittedProperty = property.split(","); + for (String term : splittedProperty) + { + set.add(term.trim()); + } + } + return set; + } private Map<PluginType, Map<String, DssCorePlugin>> scanForCorePlugins( - String corePluginsFolderPath, Set<String> pluginNames) + String corePluginsFolderPath, Set<String> disabledPlugins, Set<String> pluginNames) { Map<PluginType, Map<String, DssCorePlugin>> typeToPluginsMap = new LinkedHashMap<CorePluginsInjector.PluginType, Map<String, DssCorePlugin>>(); @@ -200,33 +219,41 @@ class CorePluginsInjector for (File pluginFolder : pluginFolders) { String pluginName = pluginFolder.getName(); - assertValidPluginName(pluginName); - Map<String, DssCorePlugin> map = typeToPluginsMap.get(pluginType); - if (map == null) - { - map = new LinkedHashMap<String, CorePluginsInjector.DssCorePlugin>(); - typeToPluginsMap.put(pluginType, map); - } + assertAndAddPluginName(pluginName, pluginNames, pluginType); DssCorePlugin plugin = new DssCorePlugin(technology, pluginType, pluginFolder); - if (pluginType.isUniquePluginNameRequired()) + String fullPluginName = plugin.getName(); + if (isDisabled(disabledPlugins, fullPluginName) == false) { - if (pluginNames.contains(pluginName)) + Map<String, DssCorePlugin> map = typeToPluginsMap.get(pluginType); + if (map == null) { - throw new ConfigurationFailureException( - "There is already a plugin named '" + pluginName + "'."); + map = new LinkedHashMap<String, CorePluginsInjector.DssCorePlugin>(); + typeToPluginsMap.put(pluginType, map); } - pluginNames.add(pluginName); + map.put(pluginName, plugin); } - map.put(pluginName, plugin); } } } } return typeToPluginsMap; } + + private boolean isDisabled(Set<String> disabledPlugins, String fullPluginName) + { + for (String disabledPlugin : disabledPlugins) + { + if (fullPluginName.startsWith(disabledPlugin)) + { + return true; + } + } + return false; + } - private void assertValidPluginName(String pluginName) + private void assertAndAddPluginName(String pluginName, Set<String> pluginNames, + PluginType pluginType) { for (int i = 0; i < UNALLOWED_PLUGIN_NAME_CHARACTERS.length(); i++) { @@ -237,6 +264,15 @@ class CorePluginsInjector + pluginName); } } + if (pluginType.isUniquePluginNameRequired()) + { + if (pluginNames.contains(pluginName)) + { + throw new ConfigurationFailureException( + "There is already a plugin named '" + pluginName + "'."); + } + pluginNames.add(pluginName); + } } /** @@ -415,6 +451,11 @@ class CorePluginsInjector } } + String getName() + { + return name; + } + File getDefiningFolder() { return definingFolder; diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjectorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjectorTest.java index 3e98dc5bbd8..a818d0e334c 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjectorTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/CorePluginsInjectorTest.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.utils; import static ch.systemsx.cisd.common.maintenance.MaintenanceTaskUtils.DEFAULT_MAINTENANCE_PLUGINS_PROPERTY_NAME; import static ch.systemsx.cisd.openbis.dss.generic.shared.Constants.INPUT_THREAD_NAMES; import static ch.systemsx.cisd.openbis.dss.generic.shared.Constants.REPORTING_PLUGIN_NAMES; +import static ch.systemsx.cisd.openbis.dss.generic.shared.utils.CorePluginsInjector.DISABLED_CORE_PLUGINS_KEY; import static ch.systemsx.cisd.openbis.dss.generic.shared.utils.CorePluginsInjector.PLUGIN_PROPERTIES_FILE_NAME; import java.io.File; @@ -272,6 +273,31 @@ public class CorePluginsInjectorTest extends AbstractFileSystemTestCase context.assertIsSatisfied(); } + @Test + public void testDisabledPlugins() + { + new File(corePluginsFolder, "screening/1/dss/miscellaneous/a").mkdirs(); + new File(corePluginsFolder, "screening/1/dss/miscellaneous/b").mkdirs(); + new File(corePluginsFolder, "screening/1/dss/drop-boxes/dp1").mkdirs(); + File dp2 = new File(corePluginsFolder, "screening/1/dss/drop-boxes/dp2"); + dp2.mkdirs(); + FileUtilities.writeToFile(new File(dp2, PLUGIN_PROPERTIES_FILE_NAME), ""); + new File(corePluginsFolder, "proteomics/1/dss/drop-boxes/dp3").mkdirs(); + new File(corePluginsFolder, "proteomics/1/dss/reporting-plugins/r1").mkdirs(); + Properties properties = createProperties(); + properties.setProperty(DISABLED_CORE_PLUGINS_KEY, + "proteomics, screening:miscellaneous, screening:drop-boxes:dp1"); + preparePluginNameLog("screening:drop-boxes:dp2 [" + dp2 + "]"); + + injector.injectCorePlugins(properties); + + assertProperties(corePluginsFolderProperty + + "disabled-core-plugins = proteomics, screening:miscellaneous, " + + "screening:drop-boxes:dp1\n" + "inputs = dp2\n", properties); + + context.assertIsSatisfied(); + } + private void preparePluginNameLog(final String... fullPluginNames) { context.checking(new Expectations() -- GitLab