package org.jboss.windup.graph; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.jboss.windup.graph.model.WindupVertexFrame; import org.jboss.windup.util.exception.WindupException; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Edge; import com.tinkerpop.blueprints.Element; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.frames.FramedGraph; import com.tinkerpop.frames.modules.MethodHandler; public class MapInAdjacentVerticesHandler implements MethodHandler<MapInAdjacentVertices> { @Override public Class<MapInAdjacentVertices> getAnnotationType() { return MapInAdjacentVertices.class; } @Override public Object processElement(Object frame, Method method, Object[] arguments, MapInAdjacentVertices annotation, FramedGraph<?> framedGraph, Element element) { if (!(element instanceof Vertex)) throw new WindupException("@" + MapInAdjacentVertices.class.getSimpleName() + " is only supported on Vertexes."); String methodName = method.getName(); if (methodName.startsWith("get")) { return handleGetter((Vertex) element, method, arguments, annotation, framedGraph); } else if (methodName.startsWith("set")) { handleSetter((Vertex) element, method, arguments, annotation, framedGraph); return null; } throw new WindupException("Only get* and set* method names are supported."); } /** * Getter. */ private Map<String, WindupVertexFrame> handleGetter(Vertex vertex, Method method, Object[] arguments, MapInAdjacentVertices annotation, FramedGraph<?> framedGraph) { if (arguments != null && arguments.length != 0) throw new WindupException("Method must take zero arguments: " + method.getName()); Map<String, WindupVertexFrame> result = new HashMap<>(); Iterable<Edge> edges = vertex.getEdges(Direction.IN, annotation.label()); for (Edge edge : edges) { String key = edge.getProperty(annotation.mapKeyField()); Vertex v = edge.getVertex(Direction.OUT); WindupVertexFrame frame = framedGraph.frame(v, WindupVertexFrame.class); result.put(key, frame); } return result; } /** * Setter. */ private void handleSetter(Vertex vertex, Method method, Object[] arguments, MapInAdjacentVertices annotation, FramedGraph<?> framedGraph) { if (arguments == null || arguments.length != 1) throw new WindupException("Method must take only one argument: " + method.getName()); Iterable<Edge> edges = vertex.getEdges(Direction.IN, annotation.label()); for (Edge edge : edges) { framedGraph.removeEdge(edge); } @SuppressWarnings("unchecked") Map<String, WindupVertexFrame> map = (Map<String, WindupVertexFrame>) arguments[0]; for (Map.Entry<String, WindupVertexFrame> entry : map.entrySet()) { Edge edge = framedGraph.addEdge(null, entry.getValue().asVertex(), vertex, annotation.label()); edge.setProperty(annotation.mapKeyField(), entry.getKey()); } } }