From 7a70c997ae0c75c773f81142fbc604aafd7ae2e2 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 28 Feb 2012 10:49:05 +0000
Subject: [PATCH] LMS-2612 update disabled plugins property in DSS
 service.properties

SVN: 24582
---
 .../SetDisableTechnologiesVariableAction.java | 80 +++++++++++++++++--
 ...DisableTechnologiesVariableActionTest.java | 50 ++++++++++++
 2 files changed, 125 insertions(+), 5 deletions(-)

diff --git a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableAction.java b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableAction.java
index 5ec25a2b2a6..18a88524e81 100644
--- a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableAction.java
+++ b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableAction.java
@@ -22,7 +22,10 @@ import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.commons.io.IOUtils;
 
@@ -32,6 +35,7 @@ import com.izforge.izpack.api.handler.AbstractUIHandler;
 import com.izforge.izpack.data.PanelAction;
 
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
+import ch.systemsx.cisd.common.utilities.CommaSeparatedListBuilder;
 
 /**
  * Action which sets the variable <code>DISABLED_TECHNOLOGIES_VARNAME</code> or updates
@@ -42,6 +46,7 @@ import ch.systemsx.cisd.common.filesystem.FileUtilities;
 public class SetDisableTechnologiesVariableAction implements PanelAction
 {
     static final String DISABLED_TECHNOLOGIES_VARNAME = "DISABLED_TECHNOLOGIES";
+    static final String DISABLED_CORE_PLUGINS_KEY = "disabled-core-plugins";
 
     public void initialize(PanelActionConfiguration configuration)
     {
@@ -97,20 +102,85 @@ public class SetDisableTechnologiesVariableAction implements PanelAction
                 appendEntryToConfigFile(configFile, propertiesEntry);
             }
         }
+        updateDisabledDssPluginsProperty(data, installDir);
     }
-
-    private String createListOfDisabledTechnologies(AutomatedInstallData data)
+    
+    private void updateDisabledDssPluginsProperty(AutomatedInstallData data, File installDir)
     {
-        StringBuilder builder = new StringBuilder();
+        Set<String> disabledTechnologies = new LinkedHashSet<String>();
+        Set<String> technologies = new HashSet<String>();
         for (String technology : GlobalInstallationContext.TECHNOLOGIES)
         {
             String technologyFlag = data.getVariable(technology);
             if (Boolean.FALSE.toString().equalsIgnoreCase(technologyFlag))
             {
-                if (builder.length() > 0)
+                disabledTechnologies.add(technology.toLowerCase());
+            }
+            technologies.add(technology.toLowerCase());
+        }
+        File configFile = new File(installDir, Utils.DSS_PATH + Utils.SERVICE_PROPERTIES_PATH);
+        List<String> list = FileUtilities.loadToStringList(configFile);
+        updateDisabledDssPluginsProperty(list, technologies, disabledTechnologies);
+        updateConfigFile(configFile, list);
+    }
+
+    private void updateDisabledDssPluginsProperty(List<String> list, Set<String> technologies,
+            Set<String> disabledTechnologies)
+    {
+        for (int i = 0; i < list.size(); i++)
+        {
+            String line = list.get(i);
+            if (line.startsWith(DISABLED_CORE_PLUGINS_KEY))
+            {
+                String[] property = line.split("=");
+                String oldPluginsList = property.length < 2 ? "" : property[1];
+                String pluginsList =
+                        mergeWithDisabledPluginsList(oldPluginsList, technologies,
+                                disabledTechnologies);
+                list.set(i, DISABLED_CORE_PLUGINS_KEY + " = " + pluginsList);
+                return;
+            }
+        }
+        String pluginsList = mergeWithDisabledPluginsList("", technologies, disabledTechnologies);
+        list.add(DISABLED_CORE_PLUGINS_KEY + " = " + pluginsList);
+    }
+    
+    private String mergeWithDisabledPluginsList(String disabledPlugins, Set<String> technologies,
+            Set<String> disabledTechnologies)
+    {
+        CommaSeparatedListBuilder builder = new CommaSeparatedListBuilder();
+        Set<String> plugins = new HashSet<String>();
+        String[] terms = disabledPlugins.split(",");
+        for (String term : terms)
+        {
+            String plugin = term.trim();
+            if (plugin.length() > 0)
+            {
+                if (technologies.contains(plugin) == false || disabledTechnologies.contains(plugin))
                 {
-                    builder.append(", ");
+                    builder.append(plugin);
+                    plugins.add(plugin);
                 }
+            }
+        }
+        for (String disabledTechnology : disabledTechnologies)
+        {
+            if (plugins.contains(disabledTechnology) == false)
+            {
+                builder.append(disabledTechnology);
+            }
+        }
+        return builder.toString();
+    }
+
+    private String createListOfDisabledTechnologies(AutomatedInstallData data)
+    {
+        CommaSeparatedListBuilder builder = new CommaSeparatedListBuilder();
+        for (String technology : GlobalInstallationContext.TECHNOLOGIES)
+        {
+            String technologyFlag = data.getVariable(technology);
+            if (Boolean.FALSE.toString().equalsIgnoreCase(technologyFlag))
+            {
                 builder.append(technology.toLowerCase());
             }
         }
diff --git a/installation/sourceTest/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableActionTest.java b/installation/sourceTest/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableActionTest.java
index 998ebda69b9..f1a3827c8a2 100644
--- a/installation/sourceTest/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableActionTest.java
+++ b/installation/sourceTest/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableActionTest.java
@@ -18,10 +18,12 @@ package ch.systemsx.cisd.openbis.installer.izpack;
 
 import static ch.systemsx.cisd.openbis.installer.izpack.GlobalInstallationContext.TECHNOLOGY_PROTEOMICS;
 import static ch.systemsx.cisd.openbis.installer.izpack.GlobalInstallationContext.TECHNOLOGY_SCREENING;
+import static ch.systemsx.cisd.openbis.installer.izpack.SetDisableTechnologiesVariableAction.DISABLED_CORE_PLUGINS_KEY;
 import static ch.systemsx.cisd.openbis.installer.izpack.SetDisableTechnologiesVariableAction.DISABLED_TECHNOLOGIES_VARNAME;
 import static ch.systemsx.cisd.openbis.installer.izpack.SetTechnologyCheckBoxesAction.DISABLED_TECHNOLOGIES_KEY;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Properties;
 
 import org.testng.annotations.AfterMethod;
@@ -32,6 +34,7 @@ import com.izforge.izpack.api.data.AutomatedInstallData;
 import com.izforge.izpack.core.substitutor.VariableSubstitutorImpl;
 import com.izforge.izpack.installer.data.InstallData;
 
+import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 
@@ -43,6 +46,7 @@ import ch.systemsx.cisd.common.filesystem.FileUtilities;
 public class SetDisableTechnologiesVariableActionTest extends AbstractFileSystemTestCase
 {
     private File configFile;
+    private File dssConfigFile;
 
     @Override
     @BeforeMethod
@@ -50,12 +54,22 @@ public class SetDisableTechnologiesVariableActionTest extends AbstractFileSystem
     {
         configFile = new File(workingDirectory, Utils.AS_PATH + Utils.SERVICE_PROPERTIES_PATH);
         configFile.getParentFile().mkdirs();
+        dssConfigFile = new File(workingDirectory, Utils.DSS_PATH + Utils.SERVICE_PROPERTIES_PATH);
+        dssConfigFile.getParentFile().mkdirs();
+        try
+        {
+            dssConfigFile.createNewFile();
+        } catch (IOException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        }
     }
     
     @AfterMethod
     public void tearDown()
     {
         configFile.delete();
+        dssConfigFile.delete();
     }
     
     @Test
@@ -80,6 +94,8 @@ public class SetDisableTechnologiesVariableActionTest extends AbstractFileSystem
         AutomatedInstallData data = updateDisabledTechnologyProperties(variables, true);
 
         assertEquals("proteomics, screening", data.getVariable(DISABLED_TECHNOLOGIES_VARNAME));
+        assertEquals("[" + DISABLED_CORE_PLUGINS_KEY + " = proteomics, screening]", FileUtilities
+                .loadToStringList(dssConfigFile).toString());
     }
     
     @Test
@@ -129,6 +145,8 @@ public class SetDisableTechnologiesVariableActionTest extends AbstractFileSystem
         
         assertEquals("[abc = 123, " + DISABLED_TECHNOLOGIES_KEY + " = , answer = 42]", FileUtilities
                 .loadToStringList(configFile).toString());
+        assertEquals("[" + DISABLED_CORE_PLUGINS_KEY + " = ]", FileUtilities
+                .loadToStringList(dssConfigFile).toString());
     }
     
     @Test
@@ -143,6 +161,38 @@ public class SetDisableTechnologiesVariableActionTest extends AbstractFileSystem
         
         assertEquals("[abc = 123, " + DISABLED_TECHNOLOGIES_KEY + " = proteomics]", FileUtilities
                 .loadToStringList(configFile).toString());
+        assertEquals("[" + DISABLED_CORE_PLUGINS_KEY + " = proteomics]", FileUtilities
+                .loadToStringList(dssConfigFile).toString());
+    }
+
+    @Test
+    public void testUpdateDisabledPluginsForSwitchedTechnologies()
+    {
+        FileUtilities.writeToFile(dssConfigFile, "a = b\n" + DISABLED_CORE_PLUGINS_KEY
+                + "= screening, proteomics:a:b\n" + "gamma = alpha");
+        Properties variables = new Properties();
+        variables.setProperty(TECHNOLOGY_PROTEOMICS, "false");
+        variables.setProperty(TECHNOLOGY_SCREENING, "true");
+
+        updateDisabledTechnologyProperties(variables, true);
+
+        assertEquals("[a = b, " + DISABLED_CORE_PLUGINS_KEY + " = proteomics:a:b, proteomics, "
+                + "gamma = alpha]", FileUtilities.loadToStringList(dssConfigFile).toString());
+    }
+    
+    @Test
+    public void testUpdateDisabledPluginsForSameTechnology()
+    {
+        FileUtilities.writeToFile(dssConfigFile, "a = b\n" + DISABLED_CORE_PLUGINS_KEY
+                + "= proteomics, proteomics:a:b\n" + "gamma = alpha");
+        Properties variables = new Properties();
+        variables.setProperty(TECHNOLOGY_PROTEOMICS, "false");
+        variables.setProperty(TECHNOLOGY_SCREENING, "true");
+        
+        updateDisabledTechnologyProperties(variables, true);
+        
+        assertEquals("[a = b, " + DISABLED_CORE_PLUGINS_KEY + " = proteomics, proteomics:a:b, "
+                + "gamma = alpha]", FileUtilities.loadToStringList(dssConfigFile).toString());
     }
 
     private AutomatedInstallData updateDisabledTechnologyProperties(Properties variables,
-- 
GitLab