package liquibase.changelog.filter;
import liquibase.changelog.ChangeSet;
import liquibase.database.Database;
import liquibase.database.DatabaseList;
import liquibase.sql.visitor.SqlVisitor;
import liquibase.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class DbmsChangeSetFilter implements ChangeSetFilter {
private Database database;
public DbmsChangeSetFilter(Database database) {
this.database = database;
}
@Override
public ChangeSetFilterResult accepts(ChangeSet changeSet) {
if (database == null) {
return new ChangeSetFilterResult(true, "No database connection, cannot evaluate dbms attribute", this.getClass());
}
List<SqlVisitor> visitorsToRemove = new ArrayList<SqlVisitor>();
for (SqlVisitor visitor : changeSet.getSqlVisitors()) {
if (!DatabaseList.definitionMatches(visitor.getApplicableDbms(), database, true)) {
visitorsToRemove.add(visitor);
}
}
changeSet.getSqlVisitors().removeAll(visitorsToRemove);
String dbmsList;
if (changeSet.getDbmsSet() == null || changeSet.getDbmsSet().size() == 0) {
dbmsList = "all databases";
} else {
dbmsList = "'"+StringUtils.join(changeSet.getDbmsSet(), ", ") + "'";
}
if (DatabaseList.definitionMatches(changeSet.getDbmsSet(), database, true)) {
return new ChangeSetFilterResult(true, "Database '" + database.getShortName() + "' matches " + dbmsList, this.getClass());
} else {
return new ChangeSetFilterResult(false, "Database '"+database.getShortName()+"' does not match "+dbmsList, this.getClass());
}
}
}