package liquibase.changelog.filter; import liquibase.changelog.ChangeSet; import liquibase.changelog.RanChangeSet; import liquibase.database.Database; import liquibase.exception.DatabaseException; import liquibase.executor.ExecutorService; import liquibase.sql.visitor.SqlVisitor; import liquibase.statement.core.UpdateStatement; import java.util.ArrayList; import java.util.List; public class ShouldRunChangeSetFilter implements ChangeSetFilter { public List<RanChangeSet> ranChangeSets; private Database database; public ShouldRunChangeSetFilter(Database database) throws DatabaseException { this.database = database; this.ranChangeSets = database.getRanChangeSetList(); } @SuppressWarnings({"RedundantIfStatement"}) public boolean accepts(ChangeSet changeSet) { for (RanChangeSet ranChangeSet : ranChangeSets) { if (ranChangeSet.getId().equals(changeSet.getId()) && ranChangeSet.getAuthor().equals(changeSet.getAuthor()) && isPathEquals(changeSet, ranChangeSet)) { if (changeSet.shouldAlwaysRun() && ranChangeSet.getLastCheckSum() != null) { return true; } else if (changeSet.shouldRunOnChange() && !changeSet.generateCheckSum().equals(ranChangeSet.getLastCheckSum())) { return true; } else { return false; } } } return true; } private boolean isPathEquals(ChangeSet changeSet, RanChangeSet ranChangeSet) { if (System.getProperty("os.name").toLowerCase().startsWith("win")) { return ranChangeSet.getChangeLog().equalsIgnoreCase(changeSet.getFilePath()); } else { return ranChangeSet.getChangeLog().equalsIgnoreCase(changeSet.getFilePath()); } } }