/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.vipr.client.core.filters; import java.net.URI; import com.emc.storageos.model.DataObjectRestRep; public class FilterChain<T extends DataObjectRestRep> implements ResourceFilter<T> { private ResourceFilter<T> filter; public FilterChain(ResourceFilter<T> filter) { this.filter = filter; } public FilterChain<T> not() { this.filter = new NotFilter<T>(this.filter); return this; } public FilterChain<T> notId() { this.filter = new NotIdFilter<T>(this.filter); return this; } @SuppressWarnings("unchecked") public FilterChain<T> and(ResourceFilter<T> filter) { this.filter = new AndFilter<T>(this.filter, filter); return this; } @SuppressWarnings("unchecked") public FilterChain<T> or(ResourceFilter<T> filter) { this.filter = new OrFilter<T>(this.filter, filter); return this; } @Override public boolean acceptId(URI id) { return filter.acceptId(id); } @Override public boolean accept(T item) { return filter.accept(item); } public static class NotFilter<T extends DataObjectRestRep> implements ResourceFilter<T> { private ResourceFilter<T> filter; public NotFilter(ResourceFilter<T> filter) { this.filter = filter; } @Override public boolean acceptId(URI id) { return filter.acceptId(id); } @Override public boolean accept(T item) { return !filter.accept(item); } } public static class NotIdFilter<T extends DataObjectRestRep> implements ResourceFilter<T> { private ResourceFilter<T> filter; public NotIdFilter(ResourceFilter<T> filter) { this.filter = filter; } @Override public boolean acceptId(URI id) { return !filter.acceptId(id); } @Override public boolean accept(T item) { return filter.accept(item); } } public static class AndFilter<T extends DataObjectRestRep> implements ResourceFilter<T> { private ResourceFilter<T>[] filters; public AndFilter(ResourceFilter<T>... filters) { this.filters = filters; } @Override public boolean acceptId(URI id) { for (ResourceFilter<T> filter : filters) { if (!filter.acceptId(id)) { return false; } } return filters.length > 0; } @Override public boolean accept(T item) { for (ResourceFilter<T> filter : filters) { if (!filter.accept(item)) { return false; } } return filters.length > 0; } } public static class OrFilter<T extends DataObjectRestRep> implements ResourceFilter<T> { private ResourceFilter<T>[] filters; public OrFilter(ResourceFilter<T>... filters) { this.filters = filters; } @Override public boolean acceptId(URI id) { for (ResourceFilter<T> filter : filters) { if (filter.acceptId(id)) { return true; } } return false; } @Override public boolean accept(T item) { for (ResourceFilter<T> filter : filters) { if (filter.accept(item)) { return true; } } return false; } } }