/* * (C) Copyright 2003-2023, by Barak Naveh and Contributors. * * JGraphT : a free Java graph-theory library * * See the CONTRIBUTORS.md file distributed with this work for additional * information regarding copyright ownership. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0, or the * GNU Lesser General Public License v2.1 or later * which is available at * http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html. * * SPDX-License-Identifier: EPL-2.0 OR LGPL-2.1-or-later */ package org.jgrapht.demo; //@example:uriCreate:begin import org.jgrapht.*; import org.jgrapht.graph.*; import org.jgrapht.nio.*; import org.jgrapht.nio.dot.*; import org.jgrapht.traverse.*; import java.io.*; import java.net.*; import java.util.*; //@example:uriCreate:end //@example:render:begin //@example:render:end //@example:uriCreate:begin //@example:uriCreate:end /** * A simple introduction to using JGraphT. * * @author Barak Naveh */ public final class HelloJGraphT { private HelloJGraphT() { } // ensure non-instantiability. /** * The starting point for the demo. * * @param args ignored. * * @throws URISyntaxException if invalid URI is constructed. * @throws ExportException if graph cannot be exported. */ public static void main(String[] args) throws URISyntaxException, ExportException { Graph stringGraph = createStringGraph(); // note undirected edges are printed as: {,} System.out.println("-- toString output"); // @example:toString:begin System.out.println(stringGraph.toString()); // @example:toString:end System.out.println(); // @example:traverse:begin // create a graph based on URI objects Graph hrefGraph = createHrefGraph(); // find the vertex corresponding to www.jgrapht.org // @example:findVertex:begin URI start = hrefGraph .vertexSet().stream().filter(uri -> uri.getHost().equals("www.jgrapht.org")).findAny() .get(); // @example:findVertex:end // @example:traverse:end // perform a graph traversal starting from that vertex System.out.println("-- traverseHrefGraph output"); traverseHrefGraph(hrefGraph, start); System.out.println(); System.out.println("-- renderHrefGraph output"); renderHrefGraph(hrefGraph); System.out.println(); } /** * Creates a toy directed graph based on URI objects that represents link structure. * * @return a graph based on URI objects. */ private static Graph createHrefGraph() throws URISyntaxException { // @example:uriCreate:begin Graph g = new DefaultDirectedGraph<>(DefaultEdge.class); URI google = new URI("http://www.google.com"); URI wikipedia = new URI("http://www.wikipedia.org"); URI jgrapht = new URI("http://www.jgrapht.org"); // add the vertices g.addVertex(google); g.addVertex(wikipedia); g.addVertex(jgrapht); // add edges to create linking structure g.addEdge(jgrapht, wikipedia); g.addEdge(google, jgrapht); g.addEdge(google, wikipedia); g.addEdge(wikipedia, google); // @example:uriCreate:end return g; } /** * Traverse a graph in depth-first order and print the vertices. * * @param hrefGraph a graph based on URI objects * * @param start the vertex where the traversal should start */ private static void traverseHrefGraph(Graph hrefGraph, URI start) { // @example:traverse:begin Iterator iterator = new DepthFirstIterator<>(hrefGraph, start); while (iterator.hasNext()) { URI uri = iterator.next(); System.out.println(uri); } // @example:traverse:end } /** * Render a graph in DOT format. * * @param hrefGraph a graph based on URI objects */ private static void renderHrefGraph(Graph hrefGraph) throws ExportException { // @example:render:begin DOTExporter exporter = new DOTExporter<>(v -> v.getHost().replace('.', '_')); exporter.setVertexAttributeProvider((v) -> { Map map = new LinkedHashMap<>(); map.put("label", DefaultAttribute.createAttribute(v.toString())); return map; }); Writer writer = new StringWriter(); exporter.exportGraph(hrefGraph, writer); System.out.println(writer.toString()); // @example:render:end } /** * Create a toy graph based on String objects. * * @return a graph based on String objects. */ private static Graph createStringGraph() { Graph g = new SimpleGraph<>(DefaultEdge.class); String v1 = "v1"; String v2 = "v2"; String v3 = "v3"; String v4 = "v4"; // add the vertices g.addVertex(v1); g.addVertex(v2); g.addVertex(v3); g.addVertex(v4); // add edges to create a circuit g.addEdge(v1, v2); g.addEdge(v2, v3); g.addEdge(v3, v4); g.addEdge(v4, v1); return g; } }