package com.tinkerpop.blueprints.util.wrappers.event;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Element;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.util.ElementHelper;
import com.tinkerpop.blueprints.util.wrappers.event.listener.EdgePropertyChangedEvent;
import com.tinkerpop.blueprints.util.wrappers.event.listener.EdgePropertyRemovedEvent;
import com.tinkerpop.blueprints.util.wrappers.event.listener.VertexPropertyChangedEvent;
import com.tinkerpop.blueprints.util.wrappers.event.listener.VertexPropertyRemovedEvent;
import java.util.Set;
/**
* An element with a GraphChangedListener attached. Those listeners are notified when changes occur to
* the properties of the element.
*
* @author Stephen Mallette
*/
public abstract class EventElement implements Element {
protected final EventGraph eventGraph;
protected final Element baseElement;
protected EventElement(final Element baseElement, final EventGraph eventGraph) {
this.baseElement = baseElement;
this.eventGraph = eventGraph;
}
protected void onVertexPropertyChanged(final Vertex vertex, final String key, final Object oldValue, final Object newValue) {
this.eventGraph.getTrigger().addEvent(new VertexPropertyChangedEvent(vertex, key, oldValue, newValue));
}
protected void onEdgePropertyChanged(final Edge edge, final String key, final Object oldValue, final Object newValue) {
this.eventGraph.getTrigger().addEvent(new EdgePropertyChangedEvent(edge, key, oldValue, newValue));
}
protected void onVertexPropertyRemoved(final Vertex vertex, final String key, final Object removedValue) {
this.eventGraph.getTrigger().addEvent(new VertexPropertyRemovedEvent(vertex, key, removedValue));
}
protected void onEdgePropertyRemoved(final Edge edge, final String key, final Object removedValue) {
this.eventGraph.getTrigger().addEvent(new EdgePropertyRemovedEvent(edge, key, removedValue));
}
public Set<String> getPropertyKeys() {
return this.baseElement.getPropertyKeys();
}
public Object getId() {
return this.baseElement.getId();
}
/**
* Raises a vertexPropertyRemoved or edgePropertyRemoved event.
*/
public <T> T removeProperty(final String key) {
final Object propertyRemoved = baseElement.removeProperty(key);
if (this instanceof Vertex) {
this.onVertexPropertyRemoved((Vertex) this, key, propertyRemoved);
} else if (this instanceof Edge) {
this.onEdgePropertyRemoved((Edge) this, key, propertyRemoved);
}
return (T) propertyRemoved;
}
public <T> T getProperty(final String key) {
return this.baseElement.getProperty(key);
}
/**
* Raises a vertexPropertyRemoved or edgePropertyChanged event.
*/
public void setProperty(final String key, final Object value) {
final Object oldValue = this.baseElement.getProperty(key);
this.baseElement.setProperty(key, value);
if (this instanceof Vertex) {
this.onVertexPropertyChanged((Vertex) this, key, oldValue, value);
} else if (this instanceof Edge) {
this.onEdgePropertyChanged((Edge) this, key, oldValue, value);
}
}
public String toString() {
return this.baseElement.toString();
}
public int hashCode() {
return this.baseElement.hashCode();
}
public boolean equals(final Object object) {
return ElementHelper.areEqual(this, object);
}
public Element getBaseElement() {
return this.baseElement;
}
public void remove() {
if (this instanceof Vertex)
this.eventGraph.removeVertex((Vertex) this);
else
this.eventGraph.removeEdge((Edge) this);
}
}