package org.jboss.windup.exec.rulefilters; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.apache.commons.collections.CollectionUtils; import org.jboss.forge.furnace.util.Predicate; import org.jboss.windup.config.RuleProvider; /** * Accepts the given provider if it has any or all of requested include tags, or has not all or any of the requested * exclude tags. * * @author <a href="mailto:ozizka@redhat.com">Ondrej Zizka</a>, ozizka@redhat.com */ public class TaggedRuleProviderPredicate implements Predicate<RuleProvider> { private final Set<String> includeTags; private final Set<String> excludeTags; private boolean requireAllIncludeTags = false; private boolean requireAllExcludeTags = false; /** * Creates the {@link TaggedRuleProviderPredicate} with the given include and excludes. */ public TaggedRuleProviderPredicate(Collection<String> includeTags, Collection<String> excludeTags) { Set<String> emptySet = Collections.emptySet(); this.includeTags = includeTags == null ? emptySet : new HashSet<>(includeTags); this.excludeTags = excludeTags == null ? emptySet : new HashSet<>(excludeTags); } /** * Sets the rule to require all of the include tags. If this value is true, then a {@link RuleProvider} must have * all of the tags in the include list in order to be matched. If it is false, then having a single tag match is * sufficient. * * The default value is false. */ public TaggedRuleProviderPredicate setRequireAllIncludeTags(boolean requireAll) { this.requireAllIncludeTags = requireAll; return this; } /** * <p> * Sets the rule to require all of the exclude tags. If this value is false (the default), then this * {@link Predicate} will reject any {@link RuleProvider}s that have a tag that is also in the excludeTags list. * </p> * <p> * If this value is true, then it will reject only providers that have all of the tags in the exclude list. * </p> */ public TaggedRuleProviderPredicate setRequireAllExcludeTags(boolean requireAll) { this.requireAllExcludeTags = requireAll; return this; } @Override public boolean accept(RuleProvider provider) { Set<String> tags = provider.getMetadata().getTags(); boolean result = true; if (!includeTags.isEmpty()) { if (requireAllIncludeTags) result = tags.containsAll(includeTags); else result = CollectionUtils.containsAny(tags, includeTags); } if (result && !excludeTags.isEmpty()) { if (requireAllExcludeTags) result = !tags.containsAll(excludeTags); else result = !CollectionUtils.containsAny(tags, excludeTags); } return result; } @Override public String toString() { return "TaggedRuleProviderPredicate{incl " + includeTags.size() + ", excl" + excludeTags.size() + ", requireAllIncl=" + requireAllIncludeTags + ", requireAllExcl=" + requireAllExcludeTags + '}'; } }