package liquibase.changelog.filter; import liquibase.Contexts; import liquibase.LabelExpression; import liquibase.changelog.ChangeSet; import liquibase.sql.visitor.SqlVisitor; import java.util.ArrayList; import java.util.List; public class LabelChangeSetFilter implements ChangeSetFilter { private LabelExpression labelExpression; public LabelChangeSetFilter() { this(new LabelExpression()); } public LabelChangeSetFilter(LabelExpression labels) { this.labelExpression = labels; } @Override public ChangeSetFilterResult accepts(ChangeSet changeSet) { List<SqlVisitor> visitorsToRemove = new ArrayList<SqlVisitor>(); for (SqlVisitor visitor : changeSet.getSqlVisitors()) { if (visitor.getLabels() != null && !labelExpression.matches(visitor.getLabels())) { visitorsToRemove.add(visitor); } } changeSet.getSqlVisitors().removeAll(visitorsToRemove); if (labelExpression == null || labelExpression.isEmpty()) { return new ChangeSetFilterResult(true, "No runtime labels specified, all labels will run", this.getClass()); } if (changeSet.getLabels() == null || changeSet.getLabels().isEmpty()) { return new ChangeSetFilterResult(true, "Change set runs under all labels", this.getClass()); } if (labelExpression.matches(changeSet.getLabels())) { return new ChangeSetFilterResult(true, "Labels matches '"+labelExpression.toString()+"'", this.getClass()); } else { return new ChangeSetFilterResult(false, "Labels does not match '"+labelExpression.toString()+"'", this.getClass()); } } }