package co.smartreceipts.android.filters; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; import co.smartreceipts.android.R; /** * A filter implementation that combines multiple other {@link Filter} * implementations in the manner of a logical NOT operation. * * @author Will Baumann * @since July 12, 2014 * */ public abstract class NotFilter<T> implements Filter<T> { private static final String NOT_FILTER = "not_filter"; private final Filter<T> mFilter; /** * A logical "NOT" filter * * @param filter - the {@link Filter} to not */ public NotFilter(Filter<T> filter) { mFilter = filter; } /** * A package-private constructor that enables us to recreate this filter via * a {@link JSONObject} representation * * @param json - the {@link JSONObject} representation of this filter * @throws JSONException - throw if our provide {@link JSONObject} is invalid */ protected NotFilter(JSONObject json) throws JSONException { final JSONObject filterJson = json.getJSONObject(NOT_FILTER); mFilter = getFilter(filterJson); } /** * Retrieves a {@link Filter} implementation from a given JSON object. This * is required in order to properly reconstruct our filters from JSON * * @param json - the {@link JSONObject} representing a particular filter * @return a {@link Filter} implementation * @throws JSONException - throw if our provide {@link JSONObject} is invalid */ abstract Filter<T> getFilter(JSONObject json) throws JSONException; @Override public boolean accept(T t) { return !mFilter.accept(t); } @Override public JSONObject getJsonRepresentation() throws JSONException { final JSONObject json = new JSONObject(); json.put(FilterFactory.CLASS_NAME, this.getClass().getName()); json.put(NOT_FILTER, mFilter.getJsonRepresentation()); return json; } @Override public List<Filter<T>> getChildren() { final ArrayList<Filter<T>> children = new ArrayList<>(); children.add(mFilter); return children; } @Override public int getNameResource() { return R.string.filter_name_not; } @Override public FilterType getType() { return FilterType.Composite; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((mFilter == null) ? 0 : mFilter.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; NotFilter<?> other = (NotFilter<?>) obj; if (mFilter == null) { if (other.mFilter != null) return false; } else if (!mFilter.equals(other.mFilter)) return false; return true; } }