package org.cytoscape.d3.internal.serializer; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.cytoscape.model.CyEdge; import org.cytoscape.model.CyNetwork; import org.cytoscape.model.CyNode; import org.cytoscape.view.model.CyNetworkView; import org.cytoscape.view.model.View; import org.cytoscape.view.presentation.property.BasicVisualLexicon; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.SerializerProvider; public class D3JsonBuilder { private static final String NODE = "nodes"; private static final String EDGE = "links"; private static final String SOURCE = "source"; private static final String TARGET= "target"; private static final String ID = "id"; private static final String X = "x"; private static final String Y = "y"; protected final void serializeNetwork(final CyNetwork network, final CyNetworkView view, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { // Write array final List<CyNode> nodes = network.getNodeList(); final List<CyEdge> edges = network.getEdgeList(); final Map<CyNode, Long> node2Index = new HashMap<CyNode, Long>(); jgen.useDefaultPrettyPrinter(); jgen.writeStartObject(); long index = 0; jgen.writeArrayFieldStart(NODE); for (final CyNode node : nodes) { jgen.writeStartObject(); jgen.writeStringField(ID, node.getSUID().toString()); if(view != null) { // View is available. Pick (x,y) final View<CyNode> nodeView = view.getNodeView(node); jgen.writeNumberField(X, nodeView.getVisualProperty(BasicVisualLexicon.NODE_X_LOCATION)); jgen.writeNumberField(Y, nodeView.getVisualProperty(BasicVisualLexicon.NODE_Y_LOCATION)); } // Write CyRow in "data" field jgen.writeObject(network.getRow(node)); jgen.writeEndObject(); node2Index.put(node, index); index++; } jgen.writeEndArray(); jgen.writeArrayFieldStart(EDGE); for (final CyEdge edge : edges) { jgen.writeStartObject(); jgen.writeStringField(ID, edge.getSUID().toString()); jgen.writeNumberField(SOURCE, node2Index.get(edge.getSource())); jgen.writeNumberField(TARGET, node2Index.get(edge.getTarget())); // Write CyRow in "data" field jgen.writeObject(network.getRow(edge)); jgen.writeEndObject(); } jgen.writeEndArray(); jgen.writeEndObject(); } }