package liquibase.changelog.filter;
import liquibase.changelog.ChangeSet;
import liquibase.changelog.RanChangeSet;
import liquibase.exception.RollbackFailedException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class AfterTagChangeSetFilter implements ChangeSetFilter {
private Set<String> changeLogsAfterTag = new HashSet<String>();
public AfterTagChangeSetFilter(String tag, List<RanChangeSet> ranChangeSets) throws RollbackFailedException {
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 (!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;
}
public boolean accepts(ChangeSet changeSet) {
return changeLogsAfterTag.contains(changeLogToString(changeSet.getId(), changeSet.getAuthor(), changeSet.getFilePath()));
}
}