package com.tinkerpop.frames.structures;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.frames.FramedGraph;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class FramedVertexMap<T> implements Map<T, Object> {
private final Map<Vertex, Object> map;
protected final Class<T> kind;
protected final FramedGraph<? extends Graph> framedGraph;
public FramedVertexMap(final FramedGraph<? extends Graph> framedGraph, final Map<Vertex, Object> map, final Class<T> kind) {
this.framedGraph = framedGraph;
this.map = map;
this.kind = kind;
}
public Object get(final Object key) {
return this.map.get(key);
}
public Object remove(final Object key) {
return this.map.remove(key);
}
public int size() {
return this.map.size();
}
public boolean isEmpty() {
return this.map.isEmpty();
}
public Object put(final T key, final Object value) {
throw new UnsupportedOperationException();
}
public void putAll(final Map otherMap) {
throw new UnsupportedOperationException();
}
public boolean containsValue(final Object value) {
return this.map.containsValue(value);
}
public boolean containsKey(final Object key) {
return this.map.containsKey(key);
}
public Set<T> keySet() {
return new FramedVertexSet<T>(framedGraph, this.map.keySet(), kind);
}
public Collection<Object> values() {
return this.map.values();
}
public Set<Entry<T, Object>> entrySet() {
final Set<Entry<T, Object>> entries = new LinkedHashSet<Entry<T, Object>>();
for (final Entry<Vertex, Object> entry : this.map.entrySet()) {
entries.add(new FramedEntry<T>(entry));
}
return entries;
}
public void clear() {
this.map.clear();
}
private class FramedEntry<T> implements Entry<T, Object> {
private final Entry<Vertex, Object> entry;
public FramedEntry(final Entry<Vertex, Object> entry) {
this.entry = entry;
}
public Object setValue(final Object object) {
return this.entry.setValue(object);
}
public Object getValue() {
return entry.getValue();
}
public T getKey() {
return (T) framedGraph.frame(entry.getKey(), kind);
}
}
}