package tc.oc.pgm.filters.operator; import java.util.Arrays; import tc.oc.pgm.filters.Filter; import tc.oc.pgm.filters.matcher.StaticFilter; import tc.oc.pgm.filters.query.IQuery; /** * Return a fixed response if any child filter returns ALLOW, otherwise return ABSTAIN. */ public class FallthroughFilter extends MultiFilterFunction { private final QueryResponse response; public FallthroughFilter(QueryResponse response, Filter... filters) { this(response, Arrays.asList(filters)); } public FallthroughFilter(QueryResponse response, Iterable<? extends Filter> filters) { super(filters); this.response = response; } public static Filter of(QueryResponse response, Filter... filters) { return of(response, Arrays.asList(filters)); } public static Filter of(QueryResponse response, Iterable<? extends Filter> filters) { if(filters.iterator().hasNext()) { return new FallthroughFilter(response, filters); } else { return StaticFilter.ABSTAIN; } } public static Filter allow(Iterable<? extends Filter> filters) { return of(QueryResponse.ALLOW, filters); } public static Filter deny(Iterable<? extends Filter> filters) { return of(QueryResponse.DENY, filters); } public static Filter deny(Filter... filters) { return deny(Arrays.asList(filters)); } @Override public boolean respondsTo(Class<? extends IQuery> queryType) { return false; } @Override public QueryResponse query(IQuery query) { for(Filter filter : filters) { if(filter.query(query) == QueryResponse.ALLOW) return response; } return QueryResponse.ABSTAIN; } }