Index: U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/Compiler.java =================================================================== --- U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/Compiler.java (revision 2144) +++ U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/Compiler.java (working copy) @@ -31,7 +31,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; @@ -893,7 +892,7 @@ this.packager.setRules(conditions); } - public Map getDynamicVariables() + public Map> getDynamicVariables() { return this.packager.getDynamicVariables(); } @@ -899,7 +898,7 @@ } - public void setDynamicVariables(Map dynamicvariables) + public void setDynamicVariables(Map> dynamicvariables) { this.packager.setDynamicVariables(dynamicvariables); } Index: U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/CompilerConfig.java =================================================================== --- U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/CompilerConfig.java (revision 2144) +++ U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/CompilerConfig.java (working copy) @@ -39,7 +39,6 @@ import com.izforge.izpack.rules.Condition; import com.izforge.izpack.rules.RulesEngine; import com.izforge.izpack.util.Debug; -import com.izforge.izpack.util.Log; import com.izforge.izpack.util.OsConstraint; import com.izforge.izpack.util.VariableSubstitutor; import net.n3.nanoxml.IXMLParser; @@ -1605,7 +1604,7 @@ XMLElement root = data.getFirstChildNamed("dynamicvariables"); if (root == null) return; - Map dynamicvariables = compiler.getDynamicVariables(); + Map> dynamicvariables = compiler.getDynamicVariables(); Iterator iter = root.getChildrenNamed("variable").iterator(); while (iter.hasNext()) @@ -1614,8 +1613,13 @@ String name = requireAttribute(var, "name"); String value = requireAttribute(var, "value"); String conditionid = var.getAttribute("condition"); - if (dynamicvariables.containsKey(name)) - parseWarn(var, "DynamicVariable '" + name + "' being overwritten"); + List dynvars = null; + if (dynamicvariables.containsKey(name)) { + dynvars = dynamicvariables.get(name); + } else { + dynvars = new ArrayList(); + dynamicvariables.put(name, dynvars); + } DynamicVariable dynvar = new DynamicVariable(); dynvar.setName(name); dynvar.setValue(value); @@ -1620,7 +1624,10 @@ dynvar.setName(name); dynvar.setValue(value); dynvar.setConditionid(conditionid); - dynamicvariables.put(name, dynvar); + if (dynvars.remove(dynvar)) { + parseWarn(var, "DynamicVariable '" + name + "' being overwritten"); + } + dynvars.add(dynvar); } notifyCompilerListener("addDynamicVariables", CompilerListener.END, data); } Index: U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/DynamicVariable.java =================================================================== --- U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/DynamicVariable.java (revision 2144) +++ U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/DynamicVariable.java (working copy) @@ -89,6 +89,22 @@ this.conditionid = conditionid; } - + public boolean equals(Object obj) + { + if (obj == null) { return false; } + + if (getClass() != obj.getClass()) { return false; } + + DynamicVariable other = (DynamicVariable) obj; + return (name != null ? name.equals(other.name) : other.name == null) && conditionid != null ? conditionid + .equals(other.conditionid) + : other.conditionid == null; + } + + public int hashCode() + { + return (name != null ? name.hashCode() : 0) + ^ (conditionid != null ? conditionid.hashCode() : 0); + } } Index: U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/IPackager.java =================================================================== --- U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/IPackager.java (revision 2144) +++ U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/IPackager.java (working copy) @@ -199,7 +199,7 @@ * Returns a map of dynamically refreshed variables * @return the map */ - public abstract Map getDynamicVariables(); + public abstract Map> getDynamicVariables(); /** * @@ -205,5 +205,5 @@ * * @param dynamicvariables */ - public abstract void setDynamicVariables(Map dynamicvariables); + public abstract void setDynamicVariables(Map> dynamicvariables); } Index: U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/PackagerBase.java =================================================================== --- U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/PackagerBase.java (revision 2144) +++ U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/compiler/PackagerBase.java (working copy) @@ -89,7 +89,7 @@ protected Map rules = new HashMap(); /** dynamic variables */ - protected Map dynamicvariables = new HashMap(); + protected Map> dynamicvariables = new HashMap>(); /** Jar file URLs who's contents will be copied into the installer. */ protected Set includedJarURLs = new HashSet(); @@ -349,7 +349,7 @@ /** * @return the dynamicvariables */ - public Map getDynamicVariables() + public Map> getDynamicVariables() { return this.dynamicvariables; } @@ -358,7 +358,7 @@ /** * @param dynamicvariables the dynamicvariables to set */ - public void setDynamicVariables(Map dynamicvariables) + public void setDynamicVariables(Map> dynamicvariables) { this.dynamicvariables = dynamicvariables; } Index: U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/installer/InstallerFrame.java =================================================================== --- U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/installer/InstallerFrame.java (revision 2144) +++ U:/workspaces/work2/IzPack/src/lib/com/izforge/izpack/installer/InstallerFrame.java (working copy) @@ -233,7 +233,7 @@ */ private static final String CUSTOM_ICONS_RESOURCEFILE = "customicons.xml"; - private Map dynamicvariables; + private Map> dynamicvariables; private VariableSubstitutor substitutor; private Debugger debugger; @@ -283,23 +283,28 @@ */ private void refreshDynamicVariables() { if (dynamicvariables != null) { - Iterator iter = dynamicvariables.keySet().iterator(); - while (iter.hasNext()) { - String dynvarname = iter.next(); - DynamicVariable dynvar = dynamicvariables.get(dynvarname); - boolean refresh = false; - if (dynvar.getConditionid() != null) { - if ((rules != null) && rules.isConditionTrue(dynvar.getConditionid())) { - // condition for this rule is true - refresh = true; - } - } - else { - refresh = true; + for (String dynvarname: dynamicvariables.keySet()) { + List dynvars = dynamicvariables.get(dynvarname); + DynamicVariable dynvarToUse = null; + for (DynamicVariable dynvar : dynvars) + { + if (dynvar.getConditionid() != null) + { + if ((rules != null) && rules.isConditionTrue(dynvar.getConditionid())) + { + // condition for this rule is true + dynvarToUse = dynvar; + break; + } + } + else + { + dynvarToUse = dynvar; + } } - if (refresh) { - String newvalue = substitutor.substitute(dynvar.getValue(), null); - installdata.variables.setProperty(dynvar.getName(), newvalue); + if (dynvarToUse != null) { + String newvalue = substitutor.substitute(dynvarToUse.getValue(), null); + installdata.variables.setProperty(dynvarToUse.getName(), newvalue); } } } @@ -314,7 +319,7 @@ try { InputStream in = InstallerFrame.class.getResourceAsStream("/dynvariables"); ObjectInputStream objIn = new ObjectInputStream(in); - dynamicvariables = (Map) objIn.readObject(); + dynamicvariables = (Map>) objIn.readObject(); objIn.close(); } catch (Exception e) {