List of usage examples for org.apache.commons.collections15 Transformer transform
public O transform(I input);
From source file:cl.b9.socialNetwork.jung.SNPajekNetWriter.java
/** * Writes <code>graph</code> to <code>w</code>. Labels for vertices may * be supplied by <code>vs</code> (defaults to no labels if null), * edge weights may be specified by <code>nev</code> * (defaults to weights of 1.0 if null), * and vertex locations may be specified by <code>vld</code> (defaults * to no locations if null). //from w w w .j a va2 s . c om */ @SuppressWarnings("unchecked") public void save(Graph<V, E> graph, Writer w, Transformer<V, String> vs, Transformer<E, Number> nev, Transformer<V, Point2D> vld, Transformer<V, String> shape) throws IOException { /* * TODO: Changes we might want to make: * - optionally writing out in list form */ BufferedWriter writer = new BufferedWriter(w); if (nev == null) nev = new Transformer<E, Number>() { public Number transform(E e) { return 1; } }; writer.write("*Vertices " + graph.getVertexCount()); writer.newLine(); List<V> id = new ArrayList<V>(graph.getVertices());//Indexer.getIndexer(graph); for (V currentVertex : graph.getVertices()) { // convert from 0-based to 1-based index int v_id = id.indexOf(currentVertex) + 1; writer.write("" + v_id); if (vs != null) { String label = vs.transform(currentVertex); if (label != null) writer.write(" \"" + label + "\""); } if (vld != null) { Point2D location = vld.transform(currentVertex); if (location != null) writer.write(" " + location.getX() + " " + location.getY()); } if (shape != null) { writer.write(" " + shape.transform(currentVertex) + " x_fact 1"); } writer.newLine(); } Collection<E> d_set = new HashSet<E>(); Collection<E> u_set = new HashSet<E>(); boolean directed = graph instanceof DirectedGraph; boolean undirected = graph instanceof UndirectedGraph; // if it's strictly one or the other, no need to create extra sets if (directed) d_set.addAll(graph.getEdges()); if (undirected) u_set.addAll(graph.getEdges()); if (!directed && !undirected) // mixed-mode graph { u_set.addAll(graph.getEdges()); d_set.addAll(graph.getEdges()); for (E e : graph.getEdges()) { if (graph.getEdgeType(e) == EdgeType.UNDIRECTED) { d_set.remove(e); } else { u_set.remove(e); } } } // write out directed edges if (!d_set.isEmpty()) { writer.write("*Arcs"); writer.newLine(); } for (E e : d_set) { int source_id = id.indexOf(graph.getEndpoints(e).getFirst()) + 1; int target_id = id.indexOf(graph.getEndpoints(e).getSecond()) + 1; // float weight = nev.get(e).floatValue(); float weight = nev.transform(e).floatValue(); writer.write(source_id + " " + target_id + " " + weight); writer.newLine(); } // write out undirected edges if (!u_set.isEmpty()) { writer.write("*Edges"); writer.newLine(); } for (E e : u_set) { Pair<V> endpoints = graph.getEndpoints(e); int v1_id = id.indexOf(endpoints.getFirst()) + 1; int v2_id = id.indexOf(endpoints.getSecond()) + 1; // float weight = nev.get(e).floatValue(); float weight = nev.transform(e).floatValue(); writer.write(v1_id + " " + v2_id + " " + weight); writer.newLine(); } writer.close(); }
From source file:com.net2plan.libraries.GraphTheoryMetrics.java
private void computeSPDistanceMetrics() { diameter = 0;//from www. ja v a2 s. co m averageSPLength = 0; heterogeneity = 0; Graph<Node, Link> aux_graph = getGraph_JUNG(); Transformer<Link, Double> aux_nev = getCostTransformer(); /* Compute network diameter using nave Floyd-Warshall algorithm */ double[][] costMatrix = new double[N][N]; for (int n = 0; n < N; n++) { Arrays.fill(costMatrix[n], Double.MAX_VALUE); costMatrix[n][n] = 0; } for (Link edge : aux_graph.getEdges()) { int a_e = edge.getOriginNode().getIndex(); int b_e = edge.getDestinationNode().getIndex(); double newCost = aux_nev.transform(edge); if (newCost < costMatrix[a_e][b_e]) costMatrix[a_e][b_e] = newCost; } for (int k = 0; k < N; k++) { for (int i = 0; i < N; i++) { if (i == k) continue; for (int j = 0; j < N; j++) { if (j == k || j == i) continue; double newValue = costMatrix[i][k] + costMatrix[k][j]; if (newValue < costMatrix[i][j]) costMatrix[i][j] = newValue; } } } int numPaths = 0; double sum = 0; double M = 0.0; double S = 0.0; for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { double dist_ij = costMatrix[i][j]; if (dist_ij < Double.MAX_VALUE) { sum += dist_ij; numPaths++; double tmpM = M; M += (dist_ij - tmpM) / numPaths; S += (dist_ij - tmpM) * (dist_ij - M); if (dist_ij > diameter) diameter = dist_ij; } double dist_ji = costMatrix[j][i]; if (dist_ji < Double.MAX_VALUE) { sum += dist_ji; numPaths++; double tmpM = M; M += (dist_ji - tmpM) / numPaths; S += (dist_ji - tmpM) * (dist_ji - M); if (dist_ji > diameter) diameter = dist_ji; } } } if (numPaths == 0) return; averageSPLength = numPaths == 0 ? 0 : sum / numPaths; heterogeneity = averageSPLength == 0 ? 0 : Math.sqrt(S / numPaths) / averageSPLength; }
From source file:edu.uci.ics.jung.io.TestGraphMLWriter.java
public <T extends Comparable<T>> void validateTopology(Graph<T, Number> g, Graph<T, Object> g2, Transformer<Number, String> edge_weight, Transformer<Object, String> edge_weight2) { Assert.assertEquals(g2.getEdgeCount(), g.getEdgeCount()); List<T> g_vertices = new ArrayList<T>(g.getVertices()); List<T> g2_vertices = new ArrayList<T>(g2.getVertices()); Collections.sort(g_vertices); Collections.sort(g2_vertices); Assert.assertEquals(g_vertices, g2_vertices); Set<String> g_edges = new HashSet<String>(); for (Number n : g.getEdges()) g_edges.add(String.valueOf(n)); Set<Object> g2_edges = new HashSet<Object>(g2.getEdges()); Assert.assertEquals(g_edges, g2_edges); for (T v : g2.getVertices()) { for (T w : g2.getVertices()) { Assert.assertEquals(g.isNeighbor(v, w), g2.isNeighbor(v, w)); Set<String> e = new HashSet<String>(); for (Number n : g.findEdgeSet(v, w)) e.add(String.valueOf(n)); Set<Object> e2 = new HashSet<Object>(g2.findEdgeSet(v, w)); Assert.assertEquals(e.size(), e2.size()); Assert.assertEquals(e, e2);// w ww . j av a 2 s . c om } } for (Object o : g2.getEdges()) { String weight = edge_weight.transform(new Double((String) o)); String weight2 = edge_weight2.transform(o); Assert.assertEquals(weight2, weight); } // Number n = g.findEdge(v, w); // Object o = g2.findEdge(v, w); // if (n != null) // { // String weight = edge_weight.transform(n); // String weight2 = edge_weight2.transform(o); // Assert.assertEquals(weight2, weight); // } // } // } }
From source file:de.tudarmstadt.ukp.dkpro.lexsemresource.graph.EntityGraphJUNG.java
public double getAverageShortestPathLengthJUNG() { // implementation with JUNG's GraphStatistics Transformer<Entity, Double> distanceTransformer = DistanceStatistics.averageDistances(undirectedGraph); // logger.info("Average distances: " + distances); double distanceSum = 0.0; for (Entity e : undirectedGraph.getVertices()) { distanceSum += distanceTransformer.transform(e); }/* w w w . j a v a 2s .c o m*/ return distanceSum / getNumberOfNodes(); }
From source file:edu.uci.ics.jung.io.CustomPajekNetWriter.java
/** * Writes <code>graph</code> to <code>w</code>. Labels for vertices may be * supplied by <code>vs</code> (defaults to no labels if null), edge weights * may be specified by <code>nev</code> (defaults to weights of 1.0 if * null), and vertex locations may be specified by <code>vld</code> * (defaults to no locations if null)./* w w w.ja v a2 s . c o m*/ */ public void save(MyGraph<V, E> graph, Writer w, Transformer<V, String> vs, Transformer<E, Number> nev, Transformer<V, Point2D> vld) throws IOException { /* * TODO: Changes we might want to make: * - optionally writing out in list form */ BufferedWriter writer = new BufferedWriter(w); if (nev == null) { nev = new Transformer<E, Number>() { public Number transform(E e) { return 1; } }; } writer.write("*Colors " + graph.getLayoutParameters().getBackgroundColorRgb() + "," + graph.getLayoutParameters().getEdgeColorRgb()); writer.newLine(); writer.write( "*Vertices " + graph.getVertexCount() + "," + graph.getLayoutParameters().areNodeIconsAllowed()); writer.newLine(); List<V> id = new ArrayList<V>(graph.getVertices());//Indexer.getIndexer(graph); for (V currentVertex : graph.getVertices()) { // convert from 0-based to 1-based index int v_id = id.indexOf(currentVertex) + 1; writer.write("" + v_id); if (vs != null) { String label = vs.transform(currentVertex); if (label != null) { writer.write(" \"" + label + "\""); } } if (vld != null) { Point2D location = vld.transform(currentVertex); if (location != null) { writer.write(" " + location.getX() + " " + location.getY() + " 0.0"); } } writer.newLine(); } Collection<E> d_set = new HashSet<E>(); Collection<E> u_set = new HashSet<E>(); boolean directed = graph instanceof DirectedGraph; boolean undirected = graph instanceof UndirectedGraph; // if it's strictly one or the other, no need to create extra sets if (directed) { d_set.addAll(graph.getEdges()); } if (undirected) { u_set.addAll(graph.getEdges()); } if (!directed && !undirected) // mixed-mode graph { u_set.addAll(graph.getEdges()); d_set.addAll(graph.getEdges()); for (E e : graph.getEdges()) { if (graph.getEdgeType(e) == EdgeType.UNDIRECTED) { d_set.remove(e); } else { u_set.remove(e); } } } // write out directed edges if (!d_set.isEmpty()) { writer.write("*Arcs"); writer.newLine(); } for (E e : d_set) { int source_id = id.indexOf(graph.getEndpoints(e).getFirst()) + 1; int target_id = id.indexOf(graph.getEndpoints(e).getSecond()) + 1; float weight = nev.transform(e).floatValue(); writer.write(source_id + " " + target_id + " " + weight); writer.newLine(); } // write out undirected edges if (!u_set.isEmpty()) { writer.write("*Edges"); writer.newLine(); } for (E e : u_set) { Pair<V> endpoints = graph.getEndpoints(e); int v1_id = id.indexOf(endpoints.getFirst()) + 1; int v2_id = id.indexOf(endpoints.getSecond()) + 1; float weight = nev.transform(e).floatValue(); writer.write(v1_id + " " + v2_id + " " + weight); writer.newLine(); } writer.close(); }
From source file:edu.uci.ics.jung.algorithms.scoring.BetweennessCentrality.java
protected void computeBetweenness(Queue<V> queue, Transformer<E, ? extends Number> edge_weights) { for (V v : graph.getVertices()) { // initialize the betweenness data for this new vertex for (V s : graph.getVertices()) this.vertex_data.put(s, new BetweennessData()); // if (v.equals(new Integer(0))) // System.out.println("pause"); vertex_data.get(v).numSPs = 1;/*from w w w .ja v a 2 s . co m*/ vertex_data.get(v).distance = 0; Stack<V> stack = new Stack<V>(); // Buffer<V> queue = new UnboundedFifoBuffer<V>(); // queue.add(v); queue.offer(v); while (!queue.isEmpty()) { // V w = queue.remove(); V w = queue.poll(); stack.push(w); BetweennessData w_data = vertex_data.get(w); for (E e : graph.getOutEdges(w)) { // TODO (jrtom): change this to getOtherVertices(w, e) V x = graph.getOpposite(w, e); if (x.equals(w)) continue; double wx_weight = edge_weights.transform(e).doubleValue(); // for(V x : graph.getSuccessors(w)) // { // if (x.equals(w)) // continue; // FIXME: the other problem is that I need to // keep putting the neighbors of things we've just // discovered in the queue, if they're undiscovered or // at greater distance. // FIXME: this is the problem, right here, I think: // need to update position in queue if distance changes // (which can only happen with weighted edges). // for each outgoing edge e from w, get other end x // if x not already visited (dist x < 0) // set x's distance to w's dist + edge weight // add x to queue; pri in queue is x's dist // if w's dist + edge weight < x's dist // update x's dist // update x in queue (MapBinaryHeap) // clear x's incoming edge list // if w's dist + edge weight = x's dist // add e to x's incoming edge list BetweennessData x_data = vertex_data.get(x); double x_potential_dist = w_data.distance + wx_weight; if (x_data.distance < 0) { // queue.add(x); // vertex_data.get(x).distance = vertex_data.get(w).distance + 1; x_data.distance = x_potential_dist; queue.offer(x); } // note: // (1) this can only happen with weighted edges // (2) x's SP count and incoming edges are updated below if (x_data.distance > x_potential_dist) { x_data.distance = x_potential_dist; // invalidate previously identified incoming edges // (we have a new shortest path distance to x) x_data.incomingEdges.clear(); // update x's position in queue ((MapBinaryHeap<V>) queue).update(x); } // if (vertex_data.get(x).distance == vertex_data.get(w).distance + 1) // // if (x_data.distance == x_potential_dist) // { // x_data.numSPs += w_data.numSPs; //// vertex_data.get(x).predecessors.add(w); // x_data.incomingEdges.add(e); // } } for (E e : graph.getOutEdges(w)) { V x = graph.getOpposite(w, e); if (x.equals(w)) continue; double e_weight = edge_weights.transform(e).doubleValue(); BetweennessData x_data = vertex_data.get(x); double x_potential_dist = w_data.distance + e_weight; if (x_data.distance == x_potential_dist) { x_data.numSPs += w_data.numSPs; // vertex_data.get(x).predecessors.add(w); x_data.incomingEdges.add(e); } } } while (!stack.isEmpty()) { V x = stack.pop(); // for (V w : vertex_data.get(x).predecessors) for (E e : vertex_data.get(x).incomingEdges) { V w = graph.getOpposite(x, e); double partialDependency = vertex_data.get(w).numSPs / vertex_data.get(x).numSPs * (1.0 + vertex_data.get(x).dependency); vertex_data.get(w).dependency += partialDependency; // E w_x = graph.findEdge(w, x); // double w_x_score = edge_scores.get(w_x).doubleValue(); // w_x_score += partialDependency; // edge_scores.put(w_x, w_x_score); double e_score = edge_scores.get(e).doubleValue(); edge_scores.put(e, e_score + partialDependency); } if (!x.equals(v)) { double x_score = vertex_scores.get(x).doubleValue(); x_score += vertex_data.get(x).dependency; vertex_scores.put(x, x_score); } } } if (graph instanceof UndirectedGraph) { for (V v : graph.getVertices()) { double v_score = vertex_scores.get(v).doubleValue(); v_score /= 2.0; vertex_scores.put(v, v_score); } for (E e : graph.getEdges()) { double e_score = edge_scores.get(e).doubleValue(); e_score /= 2.0; edge_scores.put(e, e_score); } } vertex_data.clear(); }
From source file:net.sf.eventgraphj.centrality.EgoNetworkBetweennessCentrality.java
protected void computeBetweenness(Queue<V> queue, Transformer<E, ? extends Number> edge_weights) { for (V v : graph.getVertices()) { // initialize the betweenness data for this new vertex for (V s : graph.getVertices()) this.vertex_data.put(s, new BetweennessData()); // if (v.equals(new Integer(0))) // System.out.println("pause"); vertex_data.get(v).numSPs = 1;//from w ww . ja va 2 s . c o m vertex_data.get(v).distance = 0; Stack<V> stack = new Stack<V>(); // Buffer<V> queue = new UnboundedFifoBuffer<V>(); // queue.add(v); queue.offer(v); while (!queue.isEmpty()) { // V w = queue.remove(); V w = queue.poll(); stack.push(w); BetweennessData w_data = vertex_data.get(w); for (E e : graph.getOutEdges(w)) { // TODO (jrtom): change this to getOtherVertices(w, e) V x = graph.getOpposite(w, e); if (x.equals(w)) continue; double wx_weight = edge_weights.transform(e).doubleValue(); // for(V x : graph.getSuccessors(w)) // { // if (x.equals(w)) // continue; // FIXME: the other problem is that I need to // keep putting the neighbors of things we've just // discovered in the queue, if they're undiscovered or // at greater distance. // FIXME: this is the problem, right here, I think: // need to update position in queue if distance changes // (which can only happen with weighted edges). // for each outgoing edge e from w, get other end x // if x not already visited (dist x < 0) // set x's distance to w's dist + edge weight // add x to queue; pri in queue is x's dist // if w's dist + edge weight < x's dist // update x's dist // update x in queue (MapBinaryHeap) // clear x's incoming edge list // if w's dist + edge weight = x's dist // add e to x's incoming edge list BetweennessData x_data = vertex_data.get(x); double x_potential_dist = w_data.distance + wx_weight; if (x_potential_dist > this.egoNetworkSize) continue; if (x_data.distance < 0) { // queue.add(x); // vertex_data.get(x).distance = vertex_data.get(w).distance + 1; x_data.distance = x_potential_dist; queue.offer(x); } // note: // (1) this can only happen with weighted edges // (2) x's SP count and incoming edges are updated below if (x_data.distance > x_potential_dist) { x_data.distance = x_potential_dist; // invalidate previously identified incoming edges // (we have a new shortest path distance to x) x_data.incomingEdges.clear(); // update x's position in queue ((MapBinaryHeap<V>) queue).update(x); } // if (vertex_data.get(x).distance == vertex_data.get(w).distance + 1) // // if (x_data.distance == x_potential_dist) // { // x_data.numSPs += w_data.numSPs; //// vertex_data.get(x).predecessors.add(w); // x_data.incomingEdges.add(e); // } } for (E e : graph.getOutEdges(w)) { V x = graph.getOpposite(w, e); if (x.equals(w)) continue; double e_weight = edge_weights.transform(e).doubleValue(); BetweennessData x_data = vertex_data.get(x); double x_potential_dist = w_data.distance + e_weight; if (x_data.distance == x_potential_dist) { x_data.numSPs += w_data.numSPs; // vertex_data.get(x).predecessors.add(w); x_data.incomingEdges.add(e); } } } while (!stack.isEmpty()) { V x = stack.pop(); // for (V w : vertex_data.get(x).predecessors) for (E e : vertex_data.get(x).incomingEdges) { V w = graph.getOpposite(x, e); double partialDependency = vertex_data.get(w).numSPs / vertex_data.get(x).numSPs * (1.0 + vertex_data.get(x).dependency); vertex_data.get(w).dependency += partialDependency; // E w_x = graph.findEdge(w, x); // double w_x_score = edge_scores.get(w_x).doubleValue(); // w_x_score += partialDependency; // edge_scores.put(w_x, w_x_score); double e_score = edge_scores.get(e).doubleValue(); edge_scores.put(e, e_score + partialDependency); } if (!x.equals(v)) { double x_score = vertex_scores.get(x).doubleValue(); x_score += vertex_data.get(x).dependency; vertex_scores.put(x, x_score); } } } if (graph instanceof UndirectedGraph) { for (V v : graph.getVertices()) { double v_score = vertex_scores.get(v).doubleValue(); v_score /= 2.0; vertex_scores.put(v, v_score); } for (E e : graph.getEdges()) { double e_score = edge_scores.get(e).doubleValue(); e_score /= 2.0; edge_scores.put(e, e_score); } } vertex_data.clear(); }
From source file:com.diversityarrays.dal.server.SqlWorker.java
public Response createResponse(SqlResponseType rtype, String sql, String metaTagName, Transformer<Boolean, DalResponseBuilder> builderFactory) { if (metaTagName == null && !rtype.isText()) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); new IllegalArgumentException("No metaTagName supplied for rtype=" + rtype).printStackTrace(pw); pw.close();// w ww.ja v a 2s . c o m return new Response(Response.Status.INTERNAL_ERROR, NanoHTTPD.MIME_PLAINTEXT, sw.toString()); } Response result; Statement stmt = null; ResultSet rs = null; try { Connection conn = getConnection(); stmt = conn.createStatement(); if (rtype.isText()) { StringBuilder sb = new StringBuilder("<html><body>"); sb.append("<code>").append(DbUtil.htmlEscape(sql)).append("</code><hr/>"); boolean hasResultSet = stmt.execute(sql); if (hasResultSet) { rs = stmt.getResultSet(); DalServerUtil.appendResultSetRowsAsTable("No data rows returned", rs, sb); sb.append("</body></html>"); } else { int n = stmt.getUpdateCount(); sb.append("Update count=").append(n); } result = new Response(Response.Status.OK, NanoHTTPD.MIME_HTML, sb.toString()); } else { if (verbose) { System.err.println("sql: " + sql); } DalResponseBuilder builder = builderFactory == null ? DalServerUtil.createBuilder(rtype.isJson()) : builderFactory.transform(rtype.isJson()); boolean hasResultSet = stmt.execute(sql); if (hasResultSet) { rs = stmt.getResultSet(); DalServerUtil.appendResultSetRows(rs, builder, metaTagName); result = builder.build(Response.Status.OK); } else { int n = stmt.getUpdateCount(); builder.startTag(DALClient.TAG_INFO).attribute(DALClient.ATTR_MESSAGE, "Update Count=" + n) .endTag(); result = builder.build(Response.Status.OK); } } } catch (SQLException e) { // Once for the log e.printStackTrace(); if (SqlResponseType.TEXT == rtype) { // Browser request gets it all as text StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); pw.close(); result = new Response(Response.Status.OK, NanoHTTPD.MIME_PLAINTEXT, sw.toString()); } else { // DAL client gets just the message part result = DalServerUtil.buildErrorResponse(SqlResponseType.JSON == rtype, e.getMessage()); } } catch (DalDbException e) { result = DalServerUtil.buildErrorResponse(SqlResponseType.JSON == rtype, e.getMessage()); } finally { SqlUtil.closeSandRS(stmt, rs); } return result; }
From source file:com.diversityarrays.kdxplore.curate.StatsData.java
public void setTraitInstances(List<TraitInstance> tiList, Transformer<TraitInstance, List<KdxSample>> sampleProvider) { traitInstances.clear();/* w ww.ja va 2 s . c o m*/ if (tiList != null) { traitInstances.addAll(tiList); } // FIXME optimise this by only updating the Stats whose traitInstances have changed statsNameByTi.clear(); for (TraitInstance ti : traitInstances) { String traitName = ti.trait == null ? "Trait#" + ti.getTraitId() //$NON-NLS-1$ : ti.trait.getAliasOrName(); String statsName = traitNameStyle.makeTraitInstanceName(traitName, ti.getInstanceNumber()); statsNameByTi.put(ti, statsName); } instanceNumbers.clear(); for (TraitInstance ti : traitInstances) { String statsName = statsNameByTi.get(ti); // Don't bother with "instance number" for CALC if (ti.trait == null || TraitDataType.CALC != ti.trait.getTraitDataType()) { instanceNumbers.add(ti.getInstanceNumber()); } if (TraitDataType.TEXT == ti.getTraitDataType()) { expressionByTraitInstance.put(ti, ""); //$NON-NLS-1$ } else { try { ValidationRule rule = ValidationRule.create(ti.trait.getTraitValRule()); validationRuleByTraitInstance.put(ti, rule); expressionByTraitInstance.put(ti, rule.getExpression()); } catch (InvalidRuleException e) { invalidRuleByTraitInstance.put(ti, e); } } Trait trait = ti.trait; if (trait != null) { // TODO: make caller give all of the devices and we create a tab for each // deviceType as well as for <null> (if there is more than one device) List<KdxSample> list = sampleProvider.transform(ti); SimpleStatistics<?> statistics = StatsUtil.createStatistics(statsName, nStdDevForOutlier, trialPlantingDate, trait, list); if (statistics != null) { statsByTraitInstance.put(ti, statistics); } } } sortTraitInstances(); }
From source file:lu.lippmann.cdb.graph.GraphViewImpl.java
/** * {@inheritDoc}/*from w ww . j a va2 s . c om*/ */ @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void init() { this.setBackground(new Color(235, 240, 245)); //this.setBackground(Color.WHITE); this.removeAll(); //normal init final CadralShapeRenderer vlasr = new CadralShapeRenderer(null, vv.getRenderContext()); // ----------------------------- // customize the render context // ----------------------------- final Transformer<CNode, String> vertexLabelTransformer = new Transformer<CNode, String>() { @Override public String transform(final CNode node) { final String tagString = (!node.getTags().isEmpty()) ? " [TAGGED!]" : ""; final FontMetrics fm = vv.getFontMetrics(vv.getFont()); final int textWidth = fm.stringWidth(node.getName()); final int tagWidth = fm.stringWidth(tagString); int nodeWidth = (int) ShapeFactory.createShape(node.getShape()).getBounds().getWidth(); final boolean hasTags = !node.getTags().isEmpty(); final int realTextWidth = textWidth + (hasTags ? tagWidth : 0); final String modifiedNodeName = node.getName() + (hasTags ? tagString : ""); if (realTextWidth > nodeWidth - 10) { int maxSubStringIndex = -1; for (int subStringIndex = node.getName().length(); subStringIndex >= 1; subStringIndex--) { String newString = node.getName().substring(0, subStringIndex) + "..." + tagString; if (fm.stringWidth(newString) < nodeWidth - 10) { maxSubStringIndex = subStringIndex; break; } } return node.getName().substring(0, maxSubStringIndex) + "..." + tagString; } else { return modifiedNodeName; } } }; vv.getRenderContext().setVertexLabelTransformer(vertexLabelTransformer); vv2.getRenderContext().setVertexLabelTransformer(vertexLabelTransformer); final Transformer<CNode, String> vertexTooltipTransformer = new Transformer<CNode, String>() { @Override public String transform(final CNode input) { if (!input.getTags().isEmpty()) { return buildTooltipFromTags(input.getName(), input.getTags()); } else { if (!input.getName().equals(vertexLabelTransformer.transform(input))) { return input.getName(); } else { return null; } } } }; vv.setVertexToolTipTransformer(vertexTooltipTransformer); vv2.setVertexToolTipTransformer(vertexTooltipTransformer); final Transformer<CEdge, String> edgeTooltipTransformer = new Transformer<CEdge, String>() { @Override public String transform(final CEdge input) { if (!input.getTags().isEmpty()) { return buildTooltipFromTags(input.getName(), input.getTags()); } else { return input.getName(); } } }; vv.setEdgeToolTipTransformer(edgeTooltipTransformer); vv2.setEdgeToolTipTransformer(edgeTooltipTransformer); vv.getRenderContext().setVertexFillPaintTransformer(new CadralVertexColorRenderer()); vv2.getRenderContext().setVertexFillPaintTransformer(new CadralVertexColorRenderer()); final CadralFontTransformer cadralFontTransformer = new CadralFontTransformer(); vv.getRenderContext().setVertexFontTransformer(cadralFontTransformer); vv.getRenderContext().setVertexShapeTransformer(vlasr); vv2.getRenderContext().setVertexShapeTransformer(vlasr); //VERTEX LABEL RENDERER vv.getRenderer().setVertexLabelRenderer(vlasr); vv2.getRenderer().setVertexLabelRenderer(vlasr); //FIXME : magic number vv.getRenderContext().setLabelOffset(16); vv2.getRenderContext().setLabelOffset(16); // custom edges final Transformer<CEdge, String> edgeLabelTransformer = new Transformer<CEdge, String>() { @Override public String transform(final CEdge input) { return input.getExpression() + (input.getTags().isEmpty() ? "" : " [TAGGED!]"); } }; vv.getRenderContext().setEdgeLabelTransformer(edgeLabelTransformer); vv2.getRenderContext().setEdgeLabelTransformer(edgeLabelTransformer); final Font myFont = new Font("Helvetica", 0, 12); //FAST EDGE LABEL RENDERER BUT NOT GOOD ENOUGH //sun.font.FontManager.getFont2D(myFont); vv.getRenderContext().setEdgeFontTransformer(cadralFontTransformer); vv2.getRenderContext().setEdgeFontTransformer(new ConstantTransformer(myFont)); vv.getRenderContext().setEdgeLabelClosenessTransformer(new ConstantTransformer(0.5)); vv2.getRenderContext().setEdgeLabelClosenessTransformer(new ConstantTransformer(0.5)); vv.getRenderContext().setEdgeDrawPaintTransformer(getDefaultEdgeDrawPaintTransformer()); vv2.getRenderContext().setEdgeDrawPaintTransformer(getDefaultEdgeDrawPaintTransformer()); vv.getRenderContext().setEdgeLabelRenderer(new DefaultEdgeLabelRenderer(Color.BLUE, false)); vv2.getRenderContext().setEdgeLabelRenderer(new DefaultEdgeLabelRenderer(Color.BLUE, false)); vv.getRenderContext().setArrowDrawPaintTransformer( new PickableEdgePaintTransformer<CEdge>(vv.getPickedEdgeState(), Color.BLACK, Color.BLUE)); vv.getRenderContext().setArrowFillPaintTransformer( new PickableEdgePaintTransformer<CEdge>(vv.getPickedEdgeState(), Color.BLACK, Color.BLUE)); vv2.getRenderContext().setArrowDrawPaintTransformer( new PickableEdgePaintTransformer<CEdge>(vv.getPickedEdgeState(), Color.BLACK, Color.BLUE)); vv2.getRenderContext().setArrowFillPaintTransformer( new PickableEdgePaintTransformer<CEdge>(vv.getPickedEdgeState(), Color.BLACK, Color.BLUE)); //Manage Zoom vv.addMouseWheelListener(new MouseWheelListener() { private int zoom = 0; @Override public void mouseWheelMoved(MouseWheelEvent e) { if (e.getWheelRotation() < 0) { zoom++; } else { zoom--; } if (zoom > 0) { if (zoom < 9) { double scale = 1 + zoom / 6.0; CadralShapeRenderer.setScale(scale); cadralFontTransformer.setScale(scale); } } else { CadralShapeRenderer.setScale(1); cadralFontTransformer.setScale(1); } } }); final Container panel = new JPanel(new BorderLayout()); final Container rightPanel = new JPanel(new GridLayout(2, 1)); panel.add(vv); final JPanel top = new JPanel(); final JButton button = new JButton("Rescale"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { rescaleSatelliteView(); } }); top.add(button); rightPanel.add(top); rightPanel.add(vv2); panel.add(rightPanel, BorderLayout.EAST); setLayout(new BorderLayout()); add(metaInfosPanel, BorderLayout.NORTH); if (!USE_EXPERIMENTAL_SATELLITE_VIEW) { add(vv, BorderLayout.EAST); } else { add(panel, BorderLayout.EAST); } add(sharedLabel, BorderLayout.SOUTH); add(aboutPanel, BorderLayout.CENTER); validate(); repaint(); }