package de.twenty11.skysail.server.ext.osgimonitor.resources; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.restlet.data.MediaType; import org.restlet.representation.Representation; import org.restlet.representation.StringRepresentation; import org.restlet.resource.ClientResource; import org.restlet.resource.Get; import org.restlet.resource.ResourceException; import de.twenty11.skysail.common.graphs.EdgeProvider; import de.twenty11.skysail.common.graphs.NodeProvider; import de.twenty11.skysail.common.responses.SkysailResponse; import de.twenty11.skysail.server.core.restlet.SkysailServerResource2; import de.twenty11.skysail.server.ext.osgimonitor.OsgiMonitorViewerApplication; /** * */ public class BundlesAsJsGraphResource extends SkysailServerResource2 { // extends ListServerResource<NodeProvider> { private List<Bundle> bundles; /** deals with json objects */ private final ObjectMapper mapper = new ObjectMapper(); public BundlesAsJsGraphResource() { setName("osgimonitor 'bundles as Javascript Graph' resource"); setDescription("The resource containing the list of bundles displayed as a graph"); } @Override protected void doInit() throws ResourceException { OsgiMonitorViewerApplication app = (OsgiMonitorViewerApplication) getApplication(); BundleContext bundleContext = app.getBundleContext(); if (bundleContext == null) { bundles = Collections.emptyList(); } else { bundles = Arrays.asList(bundleContext.getBundles()); } } @Get public Representation getJSGraph() throws JsonParseException, JsonMappingException, IOException { List<NodeProvider> graphRepresentation = getGraphRepresentation(); List<String> nodes = new ArrayList<String>(); StringBuffer edgesHtml = new StringBuffer(); StringBuffer nodesHtml = new StringBuffer(); for (NodeProvider node : graphRepresentation) { for (EdgeProvider edge : node.getEdges()) { if (!nodes.contains(edge.getSource())) { nodes.add(edge.getSource()); nodesHtml .append(" g.addNode(\"") .append(edge.getSource()) .append("\", { label : \"" + getNodeLabel(graphRepresentation, edge.getSource()) + "\" });\n"); } if (!nodes.contains(edge.getTarget())) { nodes.add(edge.getTarget()); nodesHtml .append(" g.addNode(\"") .append(edge.getTarget()) .append("\", { label : \"" + getNodeLabel(graphRepresentation, edge.getTarget()) + "\" });\n"); } edgesHtml.append(" g.addEdge(\"").append(edge.getSource()).append("\", \"").append(edge.getTarget()) .append("\");\n"); } } // @formatter:off StringBuffer sb = new StringBuffer("<!DOCTYPE html>\n") .append("<html><head><title>Skysail Json Html Viewer</title>\n") .append("<link rel=\"stylesheet\" type=\"text/css\" href=\"/../static/css/default.css\">\n") .append("<script type=\"text/javascript\" src=\"/../static/js/graphdracula/raphael-min.js\"></script>\n") .append("<script type=\"text/javascript\" src=\"/../static/js/graphdracula/dracula_graffle.js\"></script>\n") .append("<script type=\"text/javascript\" src=\"/../static/js/graphdracula/jquery-1.4.2.min.js\"></script>\n") .append("<script type=\"text/javascript\" src=\"/../static/js/graphdracula/dracula_graph.js\"></script>\n") .append("<script type=\"text/javascript\">\n") .append("var redraw, g, renderer;\n\n") .append("window.onload = function() {\n") .append(" var width = $(document).width() - 20;\n") .append(" var height = $(document).height() - 60;\n") .append(" g = new Graph();\n") .append(" ").append(nodesHtml) .append(" ").append(edgesHtml) //.append(" g.addNode(\"cherry\");\n") //.append(" g.addEdge(\"strawberry\", \"cherry\");\n") .append(" var layouter = new Graph.Layout.Spring(g);\n") .append(" renderer = new Graph.Renderer.Raphael('canvas', g, width, height);\n") //.append(" redraw = function() {\n") //.append(" layouter.layout();\n") .append(" renderer.draw();\n") //.append(" };\n") .append("};\n") .append("</script>\n") .append("</head>\n<body><div id=\"canvas\"></div>\n") .append("\n</body>\n</html>"); // @formatter:on Representation representation = new StringRepresentation(sb.toString()); representation.setMediaType(MediaType.TEXT_HTML); return representation; } private List<NodeProvider> getGraphRepresentation() throws IOException, JsonParseException, JsonMappingException { ClientResource columns = new ClientResource("riap://application/bundles/asGraph"); columns.setChallengeResponse(getChallengeResponse()); Representation representation = columns.get(); SkysailResponse<List<NodeProvider>> response = mapper.readValue(representation.getText(), new TypeReference<SkysailResponse<List<NodeProvider>>>() { }); return response.getData(); } private String getNodeLabel(List<NodeProvider> payload, String nodeId) { for (NodeProvider node : payload) { if (node.getNodeId().equals(nodeId)) { return node.getNodeLabel(); } } return "unknown"; } }