package liquibase.changelog.filter; import liquibase.changelog.ChangeSet; import liquibase.util.StringUtils; import liquibase.sql.visitor.SqlVisitor; import java.util.*; public class ContextChangeSetFilter implements ChangeSetFilter { private Set<String> contexts; public ContextChangeSetFilter(String... contexts) { this.contexts = new HashSet<String>(); if (contexts != null) { for (int i=0; i<contexts.length; i++) { if (contexts[i] != null) { contexts[i] = contexts[i].toLowerCase(); } } if (contexts.length == 1) { if (contexts[0] == null) { //do nothing } else if (contexts[0].indexOf(",") >= 0) { this.contexts.addAll(StringUtils.splitAndTrim(contexts[0], ",")); } else { this.contexts.add(contexts[0]); } } else { this.contexts.addAll(Arrays.asList(contexts)); } } } public boolean accepts(ChangeSet changeSet) { List<SqlVisitor> visitorsToRemove = new ArrayList<SqlVisitor>(); for (SqlVisitor visitor : changeSet.getSqlVisitors()) { if (visitor.getContexts() != null && visitor.getContexts().size() > 0) { boolean shouldRemove = true; for (String context : contexts) { if (visitor.getContexts().contains(context.toLowerCase())) { shouldRemove = false; } } if (shouldRemove) { visitorsToRemove.add(visitor); } } } changeSet.getSqlVisitors().removeAll(visitorsToRemove); if (contexts == null || contexts.size() == 0) { return true; } if (changeSet.getContexts() == null) { return true; } for (String context : changeSet.getContexts()) { if (contexts.contains(context.toLowerCase())) { return true; } } return false; } }