Java tutorial
/* * Copyright (c) 2003, the JUNG Project and the Regents of the University of * California All rights reserved. * * This software is open-source under the BSD license; see either "license.txt" * or http://jung.sourceforge.net/license.txt for a description. * */ import edu.uci.ics.jung.algorithms.layout.AbstractLayout; import edu.uci.ics.jung.algorithms.layout.FRLayout; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.algorithms.layout.SpringLayout; import edu.uci.ics.jung.algorithms.layout.StaticLayout; import edu.uci.ics.jung.algorithms.layout.util.Relaxer; import edu.uci.ics.jung.algorithms.layout.util.VisRunner; import edu.uci.ics.jung.algorithms.util.IterativeContext; import edu.uci.ics.jung.graph.DirectedSparseMultigraph; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.ObservableGraph; import edu.uci.ics.jung.graph.event.GraphEvent; import edu.uci.ics.jung.graph.event.GraphEventListener; import edu.uci.ics.jung.graph.util.Graphs; import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse; import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; import edu.uci.ics.jung.visualization.layout.LayoutTransition; import edu.uci.ics.jung.visualization.renderers.Renderer; import edu.uci.ics.jung.visualization.util.Animator; import org.apache.commons.collections15.functors.ConstantTransformer; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.Timer; import java.util.TimerTask; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JRootPane; import java.util.*; import java.net.*; import net.sf.json.*; import java.io.*; import java.util.logging.*; /** * A variation of AddNodeDemo that animates transitions between graph states. * * @author Tom Nelson */ public class AnimatedMetadataGraph extends javax.swing.JApplet { private static Logger logger = Logger.getLogger(Object.class.getPackage().getName()); private static HashMap<String, JSONObject> rmap = new HashMap<String, JSONObject>(); /** * */ private static final long serialVersionUID = -5345319851341875800L; private Graph<String, String> g = null; private VisualizationViewer<String, String> vv = null; private AbstractLayout<String, String> layout = null; Timer timer; boolean done; protected JButton switchLayout; public static final int EDGE_LENGTH = 100; @Override public void init() { //create a graph Graph<String, String> ig = Graphs .<String, String>synchronizedDirectedGraph(new DirectedSparseMultigraph<String, String>()); ObservableGraph<String, String> og = new ObservableGraph<String, String>(ig); og.addGraphEventListener(new GraphEventListener<String, String>() { public void handleGraphEvent(GraphEvent<String, String> evt) { System.err.println("got " + evt); } }); this.g = og; //create a graphdraw layout = new FRLayout<String, String>(g); layout.setSize(new Dimension(600, 600)); Relaxer relaxer = new VisRunner((IterativeContext) layout); relaxer.stop(); relaxer.prerelax(); Layout<String, String> staticLayout = new StaticLayout<String, String>(g, layout); vv = new VisualizationViewer<String, String>(staticLayout, new Dimension(600, 600)); JRootPane rp = this.getRootPane(); rp.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE); getContentPane().setLayout(new BorderLayout()); getContentPane().setBackground(java.awt.Color.lightGray); getContentPane().setFont(new Font("Serif", Font.PLAIN, 12)); vv.setGraphMouse(new DefaultModalGraphMouse<Number, Number>()); vv.getRenderer().getVertexLabelRenderer().setPosition(Renderer.VertexLabel.Position.CNTR); vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<String>()); vv.setForeground(Color.black); vv.addComponentListener(new ComponentAdapter() { /** * @see java.awt.event.ComponentAdapter#componentResized(java.awt.event.ComponentEvent) */ @Override public void componentResized(ComponentEvent arg0) { super.componentResized(arg0); System.err.println("resized"); layout.setSize(arg0.getComponent().getSize()); } }); getContentPane().add(vv); switchLayout = new JButton("Switch to SpringLayout"); switchLayout.addActionListener(new ActionListener() { @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent ae) { Dimension d = vv.getSize();//new Dimension(600,600); if (switchLayout.getText().indexOf("Spring") > 0) { switchLayout.setText("Switch to FRLayout"); layout = new SpringLayout<String, String>(g, new ConstantTransformer(EDGE_LENGTH)); layout.setSize(d); Relaxer relaxer = new VisRunner((IterativeContext) layout); relaxer.stop(); relaxer.prerelax(); StaticLayout<String, String> staticLayout = new StaticLayout<String, String>(g, layout); LayoutTransition<String, String> lt = new LayoutTransition<String, String>(vv, vv.getGraphLayout(), staticLayout); Animator animator = new Animator(lt); animator.start(); // vv.getRenderContext().getMultiLayerTransformer().setToIdentity(); vv.repaint(); } else { switchLayout.setText("Switch to SpringLayout"); layout = new FRLayout<String, String>(g, d); layout.setSize(d); Relaxer relaxer = new VisRunner((IterativeContext) layout); relaxer.stop(); relaxer.prerelax(); StaticLayout<String, String> staticLayout = new StaticLayout<String, String>(g, layout); LayoutTransition<String, String> lt = new LayoutTransition<String, String>(vv, vv.getGraphLayout(), staticLayout); Animator animator = new Animator(lt); animator.start(); // vv.getRenderContext().getMultiLayerTransformer().setToIdentity(); vv.repaint(); } } }); getContentPane().add(switchLayout, BorderLayout.SOUTH); timer = new Timer(); } @Override public void start() { validate(); //set timer so applet will change timer.schedule(new RemindTask(), 5000, 5000); //subsequent rate vv.repaint(); } Integer v_prev = null; public void process() { vv.getRenderContext().getPickedVertexState().clear(); vv.getRenderContext().getPickedEdgeState().clear(); try { if (g.getVertexCount() < 100) { //add a vertex Integer v1 = new Integer(g.getVertexCount()); g.addVertex(v1.toString()); vv.getRenderContext().getPickedVertexState().pick(v1.toString(), true); // wire it to some edges if (v_prev != null) { Integer edge = g.getEdgeCount(); vv.getRenderContext().getPickedEdgeState().pick((new Integer(edge)).toString(), true); g.addEdge((new Integer(edge)).toString(), v_prev.toString(), v1.toString()); // let's connect to a random vertex, too! int rand = (int) (Math.random() * g.getVertexCount()); edge = g.getEdgeCount(); vv.getRenderContext().getPickedEdgeState().pick((new Integer(edge)).toString(), true); g.addEdge((new Integer(edge)).toString(), v1.toString(), (new Integer(rand)).toString()); } v_prev = v1; layout.initialize(); Relaxer relaxer = new VisRunner((IterativeContext) layout); relaxer.stop(); relaxer.prerelax(); StaticLayout<String, String> staticLayout = new StaticLayout<String, String>(g, layout); LayoutTransition<String, String> lt = new LayoutTransition<String, String>(vv, vv.getGraphLayout(), staticLayout); Animator animator = new Animator(lt); animator.start(); // vv.getRenderContext().getMultiLayerTransformer().setToIdentity(); vv.repaint(); } else { done = true; } } catch (Exception e) { System.out.println(e); } } JSONObject lastResourceMap = null; public void process2() { try { //URL local = new URL("http://localhost:8081"); URL local = new URL("http://192.168.1.104:8081"); JSONObject resources = AnimatedMetadataGraph.getAllResources(local); //System.out.println(resources.toString()); //add all the vertices first //since we don't know the order in which vertices will appear on the list //we want to make sure we can add the necessary edges Iterator keys = resources.keys(); while (keys.hasNext()) { String rName = (String) keys.next(); String rType = resources.getJSONObject(rName).getString("type"); if (!g.containsVertex(rName)) { g.addVertex(rName); //vv.getRenderContext().getPickedVertexState().pick(rType.toString(), true); } } //add all the edges between them keys = resources.keys(); while (keys.hasNext()) { String rName = (String) keys.next(); String rType = resources.getJSONObject(rName).getString("type"); String parent = getParentPath(rName); String parent2 = null; if (parent != null) { if (parent.endsWith("/")) parent2 = parent.substring(0, parent.length() - 1); else parent2 = parent + "/"; } if (g.containsVertex(rName) && (g.containsVertex(parent) || g.containsVertex(parent2)) && !g.isNeighbor(parent, rName)) { Integer edge = g.getEdgeCount(); System.out.println("Adding Edge: (" + parent + ", " + rName + ")"); vv.getRenderContext().getPickedEdgeState().pick(rType, true); if (g.containsVertex(parent)) g.addEdge(edge.toString(), parent, rName); else g.addEdge(edge.toString(), parent2, rName); } } //remove any vertices that are no longer part of the resource graph if (lastResourceMap != null) { keys = lastResourceMap.keys(); while (keys.hasNext()) { String thisVertexName = (String) keys.next(); if (!resources.containsKey(thisVertexName) && g.containsVertex(thisVertexName)) g.removeVertex(thisVertexName); } } lastResourceMap = resources; layout.initialize(); Relaxer relaxer = new VisRunner((IterativeContext) layout); relaxer.stop(); relaxer.prerelax(); StaticLayout<String, String> staticLayout = new StaticLayout<String, String>(g, layout); LayoutTransition<String, String> lt = new LayoutTransition<String, String>(vv, vv.getGraphLayout(), staticLayout); Animator animator = new Animator(lt); animator.start(); // vv.getRenderContext().getMultiLayerTransformer().setToIdentity(); vv.repaint(); } catch (Exception e) { e.printStackTrace(); } } class RemindTask extends TimerTask { @Override public void run() { process2(); if (done) cancel(); } } public static void main(String[] args) { AnimatedMetadataGraph and = new AnimatedMetadataGraph(); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(and); and.init(); and.start(); frame.pack(); frame.setVisible(true); } public static JSONObject getAllResources(URL sfsUrl) { if (sfsUrl != null) { try { URL sfsGetRsrcsUrl = new URL(sfsUrl.toString() + "/admin/listrsrcs/"); URLConnection smapConn = sfsGetRsrcsUrl.openConnection(); smapConn.setConnectTimeout(5000); smapConn.connect(); //GET reply BufferedReader reader = new BufferedReader(new InputStreamReader(smapConn.getInputStream())); StringBuffer lineBuffer = new StringBuffer(); String line = null; while ((line = reader.readLine()) != null) lineBuffer.append(line); line = lineBuffer.toString(); reader.close(); return (JSONObject) JSONSerializer.toJSON(line); } catch (Exception e) { logger.log(Level.WARNING, "", e); return null; } } return null; } public static JSONArray getChildren(URL sfsUrl, String path) { if (sfsUrl != null) { try { URL sfsGetRsrcsUrl = new URL(sfsUrl.toString() + path); URLConnection smapConn = sfsGetRsrcsUrl.openConnection(); smapConn.setConnectTimeout(5000); smapConn.connect(); //GET reply BufferedReader reader = new BufferedReader(new InputStreamReader(smapConn.getInputStream())); StringBuffer lineBuffer = new StringBuffer(); String line = null; while ((line = reader.readLine()) != null) lineBuffer.append(line); line = lineBuffer.toString(); reader.close(); JSONObject resp = (JSONObject) JSONSerializer.toJSON(line); return resp.optJSONArray("children"); } catch (Exception e) { logger.log(Level.WARNING, "", e); return null; } } return null; } public static String getParentPath(String childPath) { if (!childPath.equals("/")) { Vector<String> pathElements = new Vector<String>(); StringTokenizer tokenizer = new StringTokenizer(childPath, "/"); while (tokenizer.hasMoreTokens()) pathElements.add(tokenizer.nextToken()); StringBuffer parentPath = new StringBuffer().append("/"); for (int i = 0; i < pathElements.size() - 1; i++) parentPath.append(pathElements.get(i)).append("/"); return parentPath.toString(); } return null; } }