diff --git a/liquibase-core/src/main/java/liquibase/changelog/ChangeLogParameters.java b/liquibase-core/src/main/java/liquibase/changelog/ChangeLogParameters.java index 5d7f1e5ad0a..37deddb9332 100644 --- a/liquibase-core/src/main/java/liquibase/changelog/ChangeLogParameters.java +++ b/liquibase-core/src/main/java/liquibase/changelog/ChangeLogParameters.java @@ -124,7 +124,7 @@ public void set(String key, String value, ContextExpression contexts, Labels lab if (globalParam) { // if it is global param remove duplicate non-global parameters ChangeLogParameter param = findParameter(key, null); - if (param != null && ! param.isGlobal()) { + if (param != null && isDuplicate(param) && ! param.isGlobal()) { changeLogParameters.remove(param); } // okay add it @@ -132,7 +132,7 @@ public void set(String key, String value, ContextExpression contexts, Labels lab changeLog)); } else { ChangeLogParameter param = findParameter(key, changeLog); - if (param != null && ! param.isGlobal() && param.getChangeLog() == changeLog) { + if (param != null && isDuplicate(param) && ! param.isGlobal() && param.getChangeLog() == changeLog) { changeLogParameters.remove(param); } //this is a non-global param, just add it @@ -140,6 +140,15 @@ public void set(String key, String value, ContextExpression contexts, Labels lab } } + private boolean isDuplicate(ChangeLogParameter param) { + for (ChangeLogParameter parameter : changeLogParameters) { + if (param != parameter && param.isDuplicate(parameter)) { + return true; + } + } + return false; + } + /** * Return the value of a parameter * @@ -343,6 +352,19 @@ public boolean isValid() { return isValid; } + public boolean isDuplicate(ChangeLogParameter other) { + String contextString = (this.getValidContexts() != null ? this.getValidContexts().toString() : null); + String labelsString = (this.getLabels() != null ? this.getLabels().toString() : null); + String databases = (this.getValidDatabases() != null ? StringUtil.join(this.getValidDatabases(), ",") : null); + + String otherContextString = (other.getValidContexts() != null ? other.getValidContexts().toString() : null); + String otherLabelsString = (other.getLabels() != null ? other.getLabels().toString() : null); + String otherDatabases = (other.getValidDatabases() != null ? StringUtil.join(other.getValidDatabases(), ",") : null); + return StringUtil.equalsIgnoreCaseAndEmpty(contextString, otherContextString) && + StringUtil.equalsIgnoreCaseAndEmpty(labelsString, otherLabelsString) && + StringUtil.equalsIgnoreCaseAndEmpty(databases, otherDatabases); + } + public boolean isGlobal() { return global; } diff --git a/liquibase-core/src/test/java/liquibase/changelog/ChangeLogParametersTest.java b/liquibase-core/src/test/java/liquibase/changelog/ChangeLogParametersTest.java index 278d59b2e6a..eefc1ba5c45 100644 --- a/liquibase-core/src/test/java/liquibase/changelog/ChangeLogParametersTest.java +++ b/liquibase-core/src/test/java/liquibase/changelog/ChangeLogParametersTest.java @@ -4,13 +4,15 @@ import liquibase.Contexts; import liquibase.Labels; import liquibase.database.core.H2Database; +import liquibase.database.core.MySQLDatabase; +import liquibase.database.core.OracleDatabase; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -public class ChangeLogParametersTest { +public class ChangeLogParametersTest { @Test public void setParameterValue_doubleSet() { @@ -22,6 +24,28 @@ public void setParameterValue_doubleSet() { assertEquals("re-setting a param should not overwrite the value (like how ant works)", "originalValue", changeLogParameters.getValue("doubleSet", null)); } + @Test + public void setParameterValue_doubleSet_withDbms() throws Exception { + final DatabaseChangeLog changelog = new DatabaseChangeLog("com/example/changelog.txt"); + + ChangeLogParameters h2Params = new ChangeLogParameters(new H2Database()); + ChangeLogParameters oracleParams = new ChangeLogParameters(new OracleDatabase()); + ChangeLogParameters mysqlParams = new ChangeLogParameters(new MySQLDatabase()); + + h2Params.set("dbmsProperty", "h2 value", new ContextExpression(), new Labels(), "h2", false, changelog); + h2Params.set("dbmsProperty", "oracle value", new ContextExpression(), new Labels(), "oracle", false, changelog); + + oracleParams.set("dbmsProperty", "h2 value", new ContextExpression(), new Labels(), "h2", false, changelog); + oracleParams.set("dbmsProperty", "oracle value", new ContextExpression(), new Labels(), "oracle", false, changelog); + + mysqlParams.set("dbmsProperty", "h2 value", new ContextExpression(), new Labels(), "h2", false, changelog); + mysqlParams.set("dbmsProperty", "oracle value", new ContextExpression(), new Labels(), "oracle", false, changelog); + + assertEquals("h2 value", h2Params.getValue("dbmsProperty", changelog)); + assertEquals("oracle value", oracleParams.getValue("dbmsProperty", changelog)); + assertNull(mysqlParams.getValue("dbmsProperty", changelog)); + } + @Test public void getParameterValue_envVariable() { ChangeLogParameters changeLogParameters = new ChangeLogParameters(); @@ -64,7 +88,8 @@ public void setParameterValue_rightDBWrongContext() { assertNull(changeLogParameters.getValue("doubleSet", null)); } - @Test + + @Test public void setParameterValue_rightDBRightContext() { ChangeLogParameters changeLogParameters = new ChangeLogParameters(new H2Database()); changeLogParameters.setContexts(new Contexts("junit"));