1 package liquibase.changelog; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.List; 7 8 import liquibase.changelog.filter.ChangeSetFilter; 9 import liquibase.changelog.visitor.ChangeSetVisitor; 10 import liquibase.database.Database; 11 import liquibase.exception.LiquibaseException; 12 13 public class ChangeLogIterator { 14 private DatabaseChangeLog databaseChangeLog; 15 private List<ChangeSetFilter> changeSetFilters; 16 17 public ChangeLogIterator(DatabaseChangeLog databaseChangeLog, ChangeSetFilter... changeSetFilters) { 18 this.databaseChangeLog = databaseChangeLog; 19 this.changeSetFilters = Arrays.asList(changeSetFilters); 20 } 21 22 public ChangeLogIterator(List<RanChangeSet> changeSetList, DatabaseChangeLog changeLog, 23 ChangeSetFilter... changeSetFilters) { 24 final List<ChangeSet> changeSets = new ArrayList<ChangeSet>(); 25 for (RanChangeSet ranChangeSet : changeSetList) { 26 ChangeSet changeSet = changeLog.getChangeSet(ranChangeSet); 27 if (changeSet != null) { 28 changeSets.add(changeSet); 29 } 30 } 31 this.databaseChangeLog = (new DatabaseChangeLog() { 32 @Override 33 public List<ChangeSet> getChangeSets() { 34 return changeSets; 35 } 36 }); 37 38 this.changeSetFilters = Arrays.asList(changeSetFilters); 39 } 40 41 public void run(ChangeSetVisitor visitor, Database database) throws LiquibaseException { 42 List<ChangeSet> changeSetList = databaseChangeLog.getChangeSets(); 43 if (visitor.getDirection().equals(ChangeSetVisitor.Direction.REVERSE)) { 44 Collections.reverse(changeSetList); 45 } 46 47 for (ChangeSet changeSet : changeSetList) { 48 boolean shouldVisit = true; 49 if (changeSetFilters != null) { 50 for (ChangeSetFilter filter : changeSetFilters) { 51 if (!filter.accepts(changeSet)) { 52 shouldVisit = false; 53 break; 54 } 55 } 56 } 57 58 if (shouldVisit) { 59 visitor.visit(changeSet, databaseChangeLog, database); 60 } 61 } 62 } 63 }