package net.sf.egonet.network; import edu.uci.ics.jung.algorithms.layout.CircleLayout; import edu.uci.ics.jung.algorithms.layout.FRLayout; import edu.uci.ics.jung.algorithms.layout.ISOMLayout; import edu.uci.ics.jung.algorithms.layout.KKLayout; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.UndirectedSparseGraph; import edu.uci.ics.jung.visualization.VisualizationImageServer; import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Paint; import java.awt.Point; import java.awt.Stroke; import java.awt.image.BufferedImage; import java.awt.Shape; import org.apache.commons.collections15.Transformer; import net.sf.functionalj.tuple.PairUni; public class NetworkService { public static enum LayoutOption {KK,FR,Circle,ISOM} public static <N> BufferedImage createImage(Network<N> network, LayoutOption layoutOption, Color backgroundColor, Transformer<N,String> nodeLabeller) { return createImage(network, layoutOption, backgroundColor, nodeLabeller, null, null, null, null); } public static <N> BufferedImage createImage(Network<N> network, LayoutOption layoutOption, Color backgroundColor, Transformer<N,String> nodeLabeller, Transformer<N,Paint> nodeColorizer, Transformer<N,Shape> nodeShaper, Transformer<PairUni<N>,Stroke> edgeSizer, Transformer<PairUni<N>,Paint> edgeColorizer) { int width = 1600; int height = 800; return createImage(network, layoutOption, backgroundColor, width, height, nodeLabeller, nodeColorizer, nodeShaper, edgeSizer, edgeColorizer); } public static <N> Layout<N, PairUni<N>> createLayout(Network<N> network, LayoutOption layoutOption) { Graph<N,PairUni<N>> g = graphFromNetwork(network); Layout<N,PairUni<N>> layout = null; if(layoutOption == null || layoutOption.equals(LayoutOption.FR)) { layout = new FRLayout<N,PairUni<N>>(g); } else if(layoutOption.equals(LayoutOption.KK)) { layout = new KKLayout<N,PairUni<N>>(g); } else if(layoutOption.equals(LayoutOption.Circle)) { layout = new CircleLayout<N,PairUni<N>>(g); } else if(layoutOption.equals(LayoutOption.ISOM)) { layout = new ISOMLayout<N,PairUni<N>>(g); } return layout; } public static <N> BufferedImage createImage(Network<N> network, LayoutOption layoutOption, Color backgroundColor, int width, int height, Transformer<N,String> nodeLabeller, Transformer<N,Paint> nodeColorizer, Transformer<N,Shape> nodeShaper, Transformer<PairUni<N>,Stroke> edgeSizer, Transformer<PairUni<N>,Paint> edgeColorizer) { Layout<N, PairUni<N>> layout = createLayout(network, layoutOption); return createImage(network, layout, backgroundColor, width, height, nodeLabeller, nodeColorizer, nodeShaper, edgeSizer, edgeColorizer); } public static <N> BufferedImage createImage(Network<N> network, Layout<N, PairUni<N>> layout, Color backgroundColor, int width, int height, Transformer<N,String> nodeLabeller, Transformer<N,Paint> nodeColorizer, Transformer<N,Shape> nodeShaper, Transformer<PairUni<N>,Stroke> edgeSizer, Transformer<PairUni<N>,Paint> edgeColorizer) { final Color nodeColor = Color.GREEN; final boolean labelVertices = true; final boolean labelEdges = false; final Point center = new Point(0,0); final Stroke edgeStroke = new BasicStroke(); //-------------------- Dimension d = new Dimension(width, height); layout.setSize(d); VisualizationImageServer<N,PairUni<N>> vv = new VisualizationImageServer<N,PairUni<N>>(layout, d); vv.getRenderContext().setVertexFillPaintTransformer(newVertexPainter(network, nodeColor)); vv.setBackground(backgroundColor == null ? Color.WHITE : backgroundColor); vv.getRenderer().getVertexLabelRenderer().setPosition(Position.SE); if (labelVertices) { vv.getRenderContext().setVertexLabelTransformer( nodeLabeller == null ? new ToStringLabeller<N>() : nodeLabeller); } if (labelEdges) { vv.getRenderContext().setEdgeLabelTransformer( new ToStringLabeller<PairUni<N>>()); } if (nodeColorizer != null) { vv.getRenderContext().setVertexFillPaintTransformer(nodeColorizer); } if (nodeShaper != null) { vv.getRenderContext().setVertexShapeTransformer(nodeShaper); } if (edgeSizer != null) { vv.getRenderContext().setEdgeStrokeTransformer(edgeSizer); } else { vv.getRenderContext().setEdgeStrokeTransformer(newEdgeStrokeTransformer(network, edgeStroke)); } if (edgeColorizer != null) { vv.getRenderContext().setEdgeDrawPaintTransformer(edgeColorizer); } return (BufferedImage) vv.getImage(center, d); } // ---------------------------------------- private static <N> Transformer<N,Paint> newVertexPainter(Network<N> network, final Color c) { return new Transformer<N,Paint>() { public Paint transform(N n) { return c; } }; } private static <N> Transformer<PairUni<N>,Stroke> newEdgeStrokeTransformer(Network<N> network, final Stroke edgeStroke) { return new Transformer<PairUni<N>, Stroke>() { public Stroke transform(PairUni<N> e) { return edgeStroke; } }; } private static <N> Graph<N,PairUni<N>> graphFromNetwork(Network<N> network) { Graph<N,PairUni<N>> g = new UndirectedSparseGraph<N,PairUni<N>>(); for (N n : network.getNodes()) g.addVertex(n); for (PairUni<N> e : network.getEdges()) g.addEdge(e, e.getFirst(), e.getSecond()); return g; } }