package com.tinkerpop.pipes.filter; import com.tinkerpop.blueprints.Contains; import com.tinkerpop.pipes.AbstractPipe; import com.tinkerpop.pipes.util.PipeHelper; import com.tinkerpop.pipes.util.structures.AsMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; /** * A CollectionFilterPipe will take a collection of objects and a Filter.NOT_EQUAL or Filter.EQUAL argument. * If an incoming object is contained (or not contained) in the provided collection, then it is emitted (or not emitted). * * @author Marko A. Rodriguez (http://markorodriguez.com) */ public abstract class CollectionFilterPipe<S> extends AbstractPipe<S, S> implements FilterPipe<S> { private final Collection<S> storedCollection; private final Contains contains; public CollectionFilterPipe(final Collection<S> storedCollection, final Contains contains) { this.storedCollection = storedCollection; this.contains = contains; } public CollectionFilterPipe(final Contains contains, final AsMap asMap, final String... namedSteps) { this.storedCollection = new DynamicList<S>(asMap, namedSteps); this.contains = contains; } protected S processNextStart() { while (true) { final S s = this.starts.next(); if (this.contains.evaluate(s, storedCollection)) { return s; } } } public String toString() { if (this.storedCollection instanceof DynamicList) return PipeHelper.makePipeString(this, this.contains, ((DynamicList) this.storedCollection).toString()); else return PipeHelper.makePipeString(this, this.contains); } private class DynamicList<S> extends ArrayList<S> { private final AsMap asMap; private final String[] namedSteps; public DynamicList(final AsMap asMap, final String... namedSteps) { this.asMap = asMap; this.namedSteps = namedSteps; } @Override public boolean contains(final Object object) { for (final String namedStep : this.namedSteps) { if (null == object) { if (object == this.asMap.get(namedStep)) return true; } else if (object.equals(this.asMap.get(namedStep))) return true; } return false; } @Override public String toString() { return Arrays.asList(this.namedSteps).toString(); } } }