package com.tinkerpop.blueprints.util.wrappers.event; import com.tinkerpop.blueprints.CloseableIterable; import com.tinkerpop.blueprints.Edge; import com.tinkerpop.blueprints.Element; import com.tinkerpop.blueprints.Index; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.util.StringFactory; /** * An index that wraps graph elements in the "evented" way. This class does not directly raise graph events, but * passes the GraphChangedListener to the edges and vertices returned from indices so that they may raise graph * events. * * @author Stephen Mallette */ public class EventIndex<T extends Element> implements Index<T> { protected final Index<T> rawIndex; private final EventGraph eventGraph; public EventIndex(final Index<T> rawIndex, final EventGraph eventGraph) { this.rawIndex = rawIndex; this.eventGraph = eventGraph; } public void remove(final String key, final Object value, final T element) { this.rawIndex.remove(key, value, (T) ((EventElement) element).getBaseElement()); } public void put(final String key, final Object value, final T element) { this.rawIndex.put(key, value, (T) ((EventElement) element).getBaseElement()); } public CloseableIterable<T> get(final String key, final Object value) { if (Vertex.class.isAssignableFrom(this.getIndexClass())) { return (CloseableIterable<T>) new EventVertexIterable((Iterable<Vertex>) this.rawIndex.get(key, value), this.eventGraph); } else { return (CloseableIterable<T>) new EventEdgeIterable((Iterable<Edge>) this.rawIndex.get(key, value), this.eventGraph); } } public CloseableIterable<T> query(final String key, final Object query) { if (Vertex.class.isAssignableFrom(this.getIndexClass())) { return (CloseableIterable<T>) new EventVertexIterable((Iterable<Vertex>) this.rawIndex.query(key, query), this.eventGraph); } else { return (CloseableIterable<T>) new EventEdgeIterable((Iterable<Edge>) this.rawIndex.query(key, query), this.eventGraph); } } public long count(final String key, final Object value) { return this.rawIndex.count(key, value); } public String getIndexName() { return this.rawIndex.getIndexName(); } public Class<T> getIndexClass() { return this.rawIndex.getIndexClass(); } public String toString() { return StringFactory.indexString(this); } }