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