package com.tinkerpop.frames.modules.typedgraph;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Element;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.frames.EdgeFrame;
import com.tinkerpop.frames.FrameInitializer;
import com.tinkerpop.frames.FramedGraph;
import com.tinkerpop.frames.VertexFrame;
import com.tinkerpop.frames.modules.TypeResolver;
public class TypeManager implements TypeResolver, FrameInitializer {
private TypeRegistry typeRegistry;
public TypeManager(TypeRegistry typeRegistry) {
this.typeRegistry = typeRegistry;
}
@Override public Class<?>[] resolveTypes(Vertex v, Class<?> defaultType) {
return new Class<?>[] {resolve(v, defaultType), VertexFrame.class };
}
@Override public Class<?>[] resolveTypes(Edge e, Class<?> defaultType) {
return new Class<?>[] {resolve(e, defaultType), EdgeFrame.class };
}
private Class<?> resolve(Element e, Class<?> defaultType) {
Class<?> typeHoldingTypeField = typeRegistry.getTypeHoldingTypeField(defaultType);
if (typeHoldingTypeField != null) {
String value = e.getProperty(typeHoldingTypeField.getAnnotation(TypeField.class).value());
Class<?> type = value == null ? null : typeRegistry.getType(typeHoldingTypeField, value);
if (type != null) {
return type;
}
}
return defaultType;
}
@Override
public void initElement(Class<?> kind, FramedGraph<?> framedGraph, Element element) {
Class<?> typeHoldingTypeField = typeRegistry.getTypeHoldingTypeField(kind);
if (typeHoldingTypeField != null) {
TypeValue typeValue = kind.getAnnotation(TypeValue.class);
if (typeValue != null) {
element.setProperty(typeHoldingTypeField.getAnnotation(TypeField.class).value(), typeValue.value());
}
}
}
}