01: package liquibase.parser.filter;
02:
03: import liquibase.ChangeSet;
04: import liquibase.RanChangeSet;
05: import liquibase.database.Database;
06: import liquibase.database.sql.UpdateStatement;
07: import liquibase.exception.JDBCException;
08:
09: import java.util.List;
10:
11: public class ShouldRunChangeSetFilter implements ChangeSetFilter {
12:
13: public List<RanChangeSet> ranChangeSets;
14: private Database database;
15:
16: public ShouldRunChangeSetFilter(Database database)
17: throws JDBCException {
18: this .database = database;
19: this .ranChangeSets = database.getRanChangeSetList();
20: }
21:
22: @SuppressWarnings({"RedundantIfStatement"})
23: public boolean accepts(ChangeSet changeSet) {
24: for (RanChangeSet ranChangeSet : ranChangeSets) {
25: if (ranChangeSet.getId().equals(changeSet.getId())
26: && ranChangeSet.getAuthor().equals(
27: changeSet.getAuthor())
28: && isPathEquals(changeSet, ranChangeSet)) {
29:
30: if (!changeSet.getMd5sum().equals(
31: ranChangeSet.getMd5sum())) {
32: UpdateStatement md5sumUpdateStatement = new UpdateStatement(
33: database.getDefaultSchemaName(), database
34: .getDatabaseChangeLogTableName());
35: md5sumUpdateStatement.addNewColumnValue("MD5SUM",
36: changeSet.getMd5sum());
37: md5sumUpdateStatement
38: .setWhereClause("ID = ? AND AUTHOR = ? AND FILENAME = ?");
39: md5sumUpdateStatement.addWhereParameter(changeSet
40: .getId());
41: md5sumUpdateStatement.addWhereParameter(changeSet
42: .getAuthor());
43: md5sumUpdateStatement.addWhereParameter(changeSet
44: .getFilePath());
45:
46: try {
47: database.getJdbcTemplate().update(
48: md5sumUpdateStatement);
49: } catch (JDBCException e) {
50: throw new RuntimeException(e);
51: }
52: }
53:
54: if (changeSet.shouldAlwaysRun()) {
55: return true;
56: } else if (changeSet.shouldRunOnChange()
57: && !changeSet.getMd5sum().equals(
58: ranChangeSet.getMd5sum())) {
59: return true;
60: } else {
61: return false;
62: }
63: }
64: }
65: return true;
66: }
67:
68: private boolean isPathEquals(ChangeSet changeSet,
69: RanChangeSet ranChangeSet) {
70: if (System.getProperty("os.name").toLowerCase().startsWith(
71: "win")) {
72: return ranChangeSet.getChangeLog().equalsIgnoreCase(
73: changeSet.getFilePath());
74: } else {
75: return ranChangeSet.getChangeLog().equals(
76: changeSet.getFilePath());
77: }
78:
79: }
80: }
|