package liquibase.changelog.filter;
import liquibase.changelog.ChangeSet;
import liquibase.changelog.RanChangeSet;
import liquibase.exception.RollbackFailedException;
import liquibase.util.StringUtils;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class AfterTagChangeSetFilter implements ChangeSetFilter {
private final String tag;
private Set<String> changeLogsAfterTag = new HashSet<String>();
public AfterTagChangeSetFilter(String tag, List<RanChangeSet> ranChangeSets) throws RollbackFailedException {
this.tag = tag;
boolean seenTag = false;
for (RanChangeSet ranChangeSet : ranChangeSets) {
if (seenTag && !tag.equalsIgnoreCase(ranChangeSet.getTag())) {
changeLogsAfterTag.add(changeLogToString(ranChangeSet.getId(), ranChangeSet.getAuthor(), ranChangeSet.getChangeLog()));
}
if (!seenTag && tag.equalsIgnoreCase(ranChangeSet.getTag())) {
seenTag = true;
if (StringUtils.trimToEmpty(ranChangeSet.getDescription()).equals("tagDatabase")) { //changeSet is just tagging the database. Also remove it.
changeLogsAfterTag.add(changeLogToString(ranChangeSet.getId(), ranChangeSet.getAuthor(), ranChangeSet.getChangeLog()));
}
}
}
if (!seenTag) {
throw new RollbackFailedException("Could not find tag '"+tag+"' in the database");
}
}
private String changeLogToString(String id, String author, String changeLog) {
return id+":"+author+":"+changeLog;
}
@Override
public ChangeSetFilterResult accepts(ChangeSet changeSet) {
if (changeLogsAfterTag.contains(changeLogToString(changeSet.getId(), changeSet.getAuthor(), changeSet.getFilePath()))) {
return new ChangeSetFilterResult(true, "Change set is before tag '"+tag+"'", this.getClass());
} else {
return new ChangeSetFilterResult(false, "Change set after tag '"+tag+"'", this.getClass());
}
}
}