001: package liquibase.parser.visitor;
002:
003: import liquibase.ChangeSet;
004: import liquibase.DatabaseChangeLog;
005: import liquibase.RanChangeSet;
006: import liquibase.change.Change;
007: import liquibase.database.Database;
008: import liquibase.exception.PreconditionFailedException;
009: import liquibase.exception.SetupException;
010: import liquibase.preconditions.AndPrecondition;
011: import liquibase.preconditions.FailedPrecondition;
012:
013: import java.util.ArrayList;
014: import java.util.HashSet;
015: import java.util.List;
016: import java.util.Set;
017:
018: public class ValidatingVisitor implements ChangeSetVisitor {
019:
020: private List<ChangeSet> invalidMD5Sums = new ArrayList<ChangeSet>();
021: private List<FailedPrecondition> failedPreconditions = new ArrayList<FailedPrecondition>();
022: private Set<ChangeSet> duplicateChangeSets = new HashSet<ChangeSet>();
023: private List<SetupException> setupExceptions = new ArrayList<SetupException>();
024:
025: private Set<String> seenChangeSets = new HashSet<String>();
026:
027: private List<RanChangeSet> ranChangeSets;
028:
029: public ValidatingVisitor(List<RanChangeSet> ranChangeSets) {
030: this .ranChangeSets = ranChangeSets;
031: }
032:
033: public void checkPreconditions(Database database,
034: DatabaseChangeLog changeLog) {
035: try {
036: AndPrecondition precondition = changeLog.getPreconditions();
037: if (precondition == null) {
038: return;
039: }
040: precondition.check(database, changeLog);
041: } catch (PreconditionFailedException e) {
042: failedPreconditions.addAll(e.getFailedPreconditions());
043: }
044: }
045:
046: public Direction getDirection() {
047: return ChangeSetVisitor.Direction.FORWARD;
048: }
049:
050: public void visit(ChangeSet changeSet) {
051: for (Change change : changeSet.getChanges()) {
052: try {
053: change.setUp();
054: } catch (SetupException se) {
055: setupExceptions.add(se);
056: }
057: }
058:
059: for (RanChangeSet ranChangeSet : ranChangeSets) {
060: if (ranChangeSet.getId().equals(changeSet.getId())
061: && ranChangeSet.getAuthor().equals(
062: changeSet.getAuthor())
063: && ranChangeSet.getChangeLog().equals(
064: changeSet.getFilePath())) {
065: if (ranChangeSet.getMd5sum() != null
066: && !ranChangeSet.getMd5sum().equals(
067: changeSet.getMd5sum())) {
068: if (!changeSet.shouldRunOnChange()) {
069: invalidMD5Sums.add(changeSet);
070: }
071: }
072: }
073: }
074:
075: String changeSetString = changeSet.toString(false);
076: if (seenChangeSets.contains(changeSetString)) {
077: duplicateChangeSets.add(changeSet);
078: } else {
079: seenChangeSets.add(changeSetString);
080: }
081: }
082:
083: public List<ChangeSet> getInvalidMD5Sums() {
084: return invalidMD5Sums;
085: }
086:
087: public List<FailedPrecondition> getFailedPreconditions() {
088: return failedPreconditions;
089: }
090:
091: public Set<ChangeSet> getDuplicateChangeSets() {
092: return duplicateChangeSets;
093: }
094:
095: public List<SetupException> getSetupExceptions() {
096: return setupExceptions;
097: }
098:
099: public boolean validationPassed() {
100: return invalidMD5Sums.size() == 0
101: && failedPreconditions.size() == 0
102: && duplicateChangeSets.size() == 0
103: && setupExceptions.size() == 0;
104: }
105:
106: }
|