From 3308a839d6068a27f5d805a03092a6a2565dea81 Mon Sep 17 00:00:00 2001 From: James Blackburn Date: Mon, 16 Nov 2009 22:27:04 +0000 Subject: [PATCH] Related to fix for Bug 265282 -- don't lose previous unchanged environment on save. Add test. --- .../IEnvironmentVariableManagerTests.java | 59 +++++++++++++++++++ .../cdt/utils/envvar/StorableEnvironment.java | 26 ++++++-- 2 files changed, 81 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/envvar/IEnvironmentVariableManagerTests.java b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/envvar/IEnvironmentVariableManagerTests.java index 0b72ddbcfb0..52ae4ad7474 100644 --- a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/envvar/IEnvironmentVariableManagerTests.java +++ b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/envvar/IEnvironmentVariableManagerTests.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.cdt.core.envvar; +import java.io.ByteArrayInputStream; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -91,6 +93,63 @@ public class IEnvironmentVariableManagerTests extends TestCase { } + public void testNoChangeToOneVariable() throws Exception { + final IProject project = ResourceHelper.createCDTProjectWithConfig("envProject"); + + // Add another, derived configuration + ICProjectDescription prjDesc = CoreModel.getDefault().getProjectDescription(project); + ICConfigurationDescription desc = prjDesc.getActiveConfiguration(); + final String id1 = desc.getId(); + + IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager(); + IContributedEnvironment contribEnv = envManager.getContributedEnvironment(); + + // Try setting an environment variable + final IEnvironmentVariable var = new EnvironmentVariable("FOO", "BAR"); + final IEnvironmentVariable var1 = new EnvironmentVariable("FOO1", "BAR1"); + final IEnvironmentVariable var2 = new EnvironmentVariable("FOO2", "BAR2"); + contribEnv.addVariable(var, prjDesc.getConfigurationById(id1)); + contribEnv.addVariable(var1, prjDesc.getConfigurationById(id1)); + contribEnv.addVariable(var2, prjDesc.getConfigurationById(id1)); + + // Check that the variable exists on config1 + IEnvironmentVariable readVar = envManager.getVariable(var.getName(), prjDesc.getConfigurationById(id1), true); + assertEquals(var, readVar); + readVar = envManager.getVariable(var1.getName(), prjDesc.getConfigurationById(id1), true); + assertEquals(var1, readVar); + readVar = envManager.getVariable(var2.getName(), prjDesc.getConfigurationById(id1), true); + assertEquals(var2, readVar); + + // Save the project description + CoreModel.getDefault().setProjectDescription(project, prjDesc); + + // Close and open the project + project.close(null); + project.open(null); + prjDesc = CoreModel.getDefault().getProjectDescription(project); + final IEnvironmentVariable var3 = new EnvironmentVariable("FOO", "BAZ"); + contribEnv.addVariable(var3, prjDesc.getConfigurationById(id1)); + readVar = envManager.getVariable(var3.getName(), prjDesc.getConfigurationById(id1), true); + assertEquals(var3, readVar); + readVar = envManager.getVariable(var1.getName(), prjDesc.getConfigurationById(id1), true); + assertEquals(var1, readVar); + // Save the project description + CoreModel.getDefault().setProjectDescription(project, prjDesc); + + // Close and open the project + project.close(null); + project.open(null); + prjDesc = CoreModel.getDefault().getProjectDescription(project); + + readVar = envManager.getVariable(var3.getName(), prjDesc.getConfigurationById(id1), true); + assertEquals(var3, readVar); + readVar = envManager.getVariable(var1.getName(), prjDesc.getConfigurationById(id1), true); + assertEquals(var1, readVar); + readVar = envManager.getVariable(var2.getName(), prjDesc.getConfigurationById(id1), true); + assertEquals(var2, readVar); + } + + /** * This bug checks for an environment load race during project open / import. * diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/envvar/StorableEnvironment.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/envvar/StorableEnvironment.java index 3b605ec08c1..32b009b4e10 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/envvar/StorableEnvironment.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/envvar/StorableEnvironment.java @@ -178,19 +178,37 @@ public class StorableEnvironment /*implements Cloneable*/{ fIsDirty = false; fIsChanged = false; } - + + /** + * Serialize the Storable enviornment into the ICStorageElement + * + * NB assumes that any variables part of the ISerializeInfo will continue to be serialized + * @param element + */ public void serialize(ICStorageElement element){ + checkBackingSerializeInfo(); + Map map = new HashMap(); + if (fCachedSerialEnv != null) + map.putAll(fCachedSerialEnv); + if (fDeletedVariables != null) { + for (String rem : fDeletedVariables.keySet()) + map.remove(rem); + fDeletedVariables.clear(); + } + if (fVariables != null) + map.putAll(fVariables); + element.setAttribute(ATTRIBUTE_APPEND, Boolean.valueOf(fAppend).toString()); element.setAttribute(ATTRIBUTE_APPEND_CONTRIBUTED, Boolean.valueOf(fAppendContributedEnv).toString()); - if(fVariables != null){ - Iterator iter = fVariables.values().iterator(); + if(!map.isEmpty()){ + Iterator iter = map.values().iterator(); while(iter.hasNext()){ StorableEnvVar var = (StorableEnvVar)iter.next(); ICStorageElement varEl = element.createChild(StorableEnvVar.VARIABLE_ELEMENT_NAME); var.serialize(varEl); } } - + fIsDirty = false; }