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) @@ -1589,8 +1589,16 @@ String name = requireAttribute(var, "name"); String value = requireAttribute(var, "value"); String conditionid = var.getAttribute("condition"); + List dynvars = null; if (dynamicvariables.containsKey(name)) - parseWarn(var, "DynamicVariable '" + name + "' being overwritten"); + { + dynvars = (List) dynamicvariables.get(name); + } + else + { + dynvars = new ArrayList(); + dynamicvariables.put(name, dynvars); + } DynamicVariable dynvar = new DynamicVariable(); dynvar.setName(name); dynvar.setValue(value); @@ -1595,7 +1603,14 @@ dynvar.setName(name); dynvar.setValue(value); dynvar.setConditionid(conditionid); - dynamicvariables.put(name, dynvar); + if (!dynvars.contains(dynvar)) + { + dynvars.add(dynvar); + } + else + { + parseWarn(var, "DynamicVariable '" + name + "' being overwritten"); + } } 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/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) @@ -283,22 +283,32 @@ private void refreshDynamicVariables() { if (dynamicvariables != null) { Iterator iter = dynamicvariables.keySet().iterator(); - while (iter.hasNext()) { + while (iter.hasNext()) + { String dynvarname = (String) iter.next(); - DynamicVariable dynvar = (DynamicVariable) 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; + List dynvars = (List) dynamicvariables.get(dynvarname); + DynamicVariable dynvarToUse = null; + for (int i = 0; i < dynvars.size(); i++) + { + DynamicVariable dynvar = (DynamicVariable) dynvars.get(i); + 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); } } }