/*
* To change this template, choose Tools | Templates
*/
package context.core.task.lexisnexis;
import context.core.util.MyPair;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gephi.graph.api.Edge;
import org.gephi.graph.api.GraphController;
import org.gephi.graph.api.GraphModel;
import org.gephi.graph.api.Node;
import org.gephi.graph.api.UndirectedGraph;
import org.gephi.io.exporter.api.ExportController;
import org.gephi.project.api.ProjectController;
import org.gephi.project.api.Workspace;
import org.openide.util.Lookup;
/**
*
* @author Aale
*/
public class GephiNetworkGenerator {
private Map<CodebookEntity, List<MyPair<CodebookEntity, Integer>>> graph = new HashMap<CodebookEntity, List<MyPair<CodebookEntity, Integer>>>();
String gexfOutputFile;
/**
*
* @param graph
* @param gexfOutputFile
*/
public GephiNetworkGenerator(Map<CodebookEntity, List<MyPair<CodebookEntity, Integer>>> graph, String gexfOutputFile) {
this.graph = graph;
this.gexfOutputFile = gexfOutputFile;
}
/**
*
*/
public void script() {
//Init a project - and therefore a workspace
ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);
pc.newProject();
Workspace workspace = pc.getCurrentWorkspace();
//Get a graph model - it exists because we have a workspace
GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();
final UndirectedGraph undirectedGraph = graphModel.getUndirectedGraph();
//Create three nodes
for (CodebookEntity node : graph.keySet()) {
Node n0 = graphModel.factory().newNode(node.getName());
n0.getNodeData().setLabel(node.getName().replace('_', ' '));
n0.getAttributes().setValue("Type", node.getType());
n0.getAttributes().setValue("Weight", 0);
undirectedGraph.addNode(n0);
}
for (int i = 0; i < undirectedGraph.getNodeCount(); i++) {
//System.out.println("node" + i + ": " + directedGraph.getNode(i));
}
for (CodebookEntity node : graph.keySet()) {
Node s1 = undirectedGraph.getNode(node.getName());
for (MyPair<CodebookEntity, Integer> other : graph.get(node)) {
Node s2 = undirectedGraph.getNode(other.getFirst().getName());
float weight = other.getSecond();
addWeight(s1, weight);
//System.out.println("");
//System.out.println("s1=" + s1 + " s2=" + s2 + " weight=" + weight);
Edge e0 = graphModel.factory().newEdge(s1, s2, weight, false);
s1.getNodeData().setSize(s1.getNodeData().getSize() + weight);
// s2.getNodeData().setSize(s2.getNodeData().getSize() + weight);
s1.getNodeData().getTextData().setSize(s1.getNodeData().getTextData().getSize() + weight);
// s2.getNodeData().getTextData().setSize(s2.getNodeData().getTextData().getSize() + weight);
undirectedGraph.addEdge(e0);
}
}
// for (CodebookEntity node : graph.keySet()) {
// Node n0 = undirectedGraph.getNode(node.getName());
// n0.getAttributes().setValue("Size", n0.getNodeData().getSize());
// }
float minsize = Integer.MAX_VALUE;
float maxsize = Integer.MIN_VALUE;
float desiredMinSize = 5;
float desiredMaxSize = 50;
for (Node n : undirectedGraph.getNodes()) {
final float size = n.getNodeData().getSize();
if (size < minsize) {
minsize = size;
}
if (size > maxsize) {
maxsize = size;
}
}
float scale = (desiredMaxSize - desiredMinSize) / (maxsize - minsize);
for (Node n : undirectedGraph.getNodes()) {
float size = n.getNodeData().getSize();
size = (size - minsize) * scale + desiredMinSize;
n.getNodeData().setSize(size);
n.getNodeData().getTextData().setSize(size);
}
// //Preview configuration
// PreviewController previewController = Lookup.getDefault().lookup(PreviewController.class);
// PreviewModel previewModel = previewController.getModel();
// previewModel.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);
// previewModel.getProperties().putValue(PreviewProperty.NODE_LABEL_COLOR, new DependantOriginalColor(Color.WHITE));
// previewModel.getProperties().putValue(PreviewProperty.EDGE_CURVED, Boolean.TRUE);
// previewModel.getProperties().putValue(PreviewProperty.EDGE_OPACITY, 3);
// previewModel.getProperties().putValue(PreviewProperty.EDGE_RADIUS, 10f);
// previewModel.getProperties().putValue(PreviewProperty.BACKGROUND_COLOR, Color.BLACK);
// previewController.refreshPreview();
//
// //New Processing target, get the PApplet
// ProcessingTarget target = (ProcessingTarget) previewController.getRenderTarget(RenderTarget.PROCESSING_TARGET);
// PApplet applet = target.getApplet();
// applet.init();
//
// //Refresh the preview and reset the zoom
// previewController.render(target);
// target.refresh();
// target.resetZoom();
//
// //Add the applet to a JFrame and display
// JFrame frame = new JFrame("Test Preview");
// frame.setLayout(new BorderLayout());
//
// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.add(applet, BorderLayout.CENTER);
//
// frame.pack();
// frame.setVisible(true);
System.out.println("Nodes#: " + graphModel.getUndirectedGraph().getNodeCount());
System.out.println("Directed Edges#: " + graphModel.getDirectedGraph().getEdgeCount());
System.out.println("Undirected Edges#: " + graphModel.getUndirectedGraph().getEdgeCount());
//Export full graph
ExportController ec = Lookup.getDefault().lookup(ExportController.class);
try {
ec.exportFile(new File(gexfOutputFile));
} catch (IOException ex) {
ex.printStackTrace();
return;
}
//Export to Writer
// Exporter exporterGraphML = ec.getExporter("graphml"); //Get GraphML exporter
// exporterGraphML.setWorkspace(workspace);
// StringWriter stringWriter = new StringWriter();
// ec.exportWriter(stringWriter, (CharacterExporter) exporterGraphML);
//System.out.println(stringWriter.toString()); //Uncomment this line
//PDF Exporter config and export to Byte array
// PDFExporter pdfExporter = (PDFExporter) ec.getExporter("pdf");
// pdfExporter.setPageSize(PageSize.A0);
// pdfExporter.setWorkspace(workspace);
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// ec.exportStream(baos, pdfExporter);
// byte[] pdf = baos.toByteArray();
}
private void addWeight(Node s1, float weight) {
Integer v1 = (Integer) s1.getAttributes().getValue("Weight");
s1.getAttributes().setValue("Weight", v1 + weight);
}
}