| ExtendedGraph.java |
1 /****************************************************************************
2 * This demo file is part of yFiles for Java 2.14.
3 * Copyright (c) 2000-2017 by yWorks GmbH, Vor dem Kreuzberg 28,
4 * 72070 Tuebingen, Germany. All rights reserved.
5 *
6 * yFiles demo files exhibit yFiles for Java functionalities. Any redistribution
7 * of demo files in source code or binary form, with or without
8 * modification, is not permitted.
9 *
10 * Owners of a valid software license for a yFiles for Java version that this
11 * demo is shipped with are allowed to use the demo source code as basis
12 * for their own yFiles for Java powered applications. Use of such programs is
13 * governed by the rights and conditions as set out in the yFiles for Java
14 * license agreement.
15 *
16 * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
19 * NO EVENT SHALL yWorks BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 ***************************************************************************/
28
29 package demo.base;
30
31 import y.base.EdgeMap;
32 import y.base.Graph;
33 import y.base.Edge;
34 import y.base.NodeMap;
35 import y.base.Node;
36 import y.util.YRandom;
37 import y.base.EdgeCursor;
38 import y.base.NodeCursor;
39 import y.util.D;
40
41 /**
42 * This class represents an extended Graph object whose nodes
43 * and edges carry additional data. The yFiles way of adding additional
44 * features to nodes and edges is not to extend the node and edge
45 * objects themselves but to extend the graph that contains the
46 * nodes and edges. The graph stores the extra data in internal Node-
47 * and/or EdgeMaps. Access to the additional node and edge data is provided
48 * by setter and getter methods of the extended graph.
49 * <br>
50 * There is a main method in this class that serves as a test driver for
51 * the implementation.
52 *
53 * @see <a href="http://docs.yworks.com/yfiles/doc/api/index.html#/dguide/custom_data#custom_data" target="_blank">Section Binding Data to Graph Elements</a> in the yFiles for Java Developer's Guide
54 */
55 public class ExtendedGraph extends Graph
56 {
57 /**
58 * internal NodeMap that stores additional node data
59 */
60 private NodeMap extraNodeData;
61
62 /**
63 * internal EdgeMap that stores additional edge data
64 */
65 private EdgeMap extraEdgeData;
66
67 /////////////////////////////////////////////////////////////////////////////
68 // CONSTRUCTION /////////////////////////////////////////////////////////////
69 /////////////////////////////////////////////////////////////////////////////
70
71 /** Creates a new instance of ExtendedGraph */
72 public ExtendedGraph()
73 {
74 extraNodeData = createNodeMap();
75 extraEdgeData = createEdgeMap();
76 }
77
78 /** Creates a graph of type ExtendedGraph */
79 public Graph createGraph()
80 {
81 return new ExtendedGraph();
82 }
83
84 /////////////////////////////////////////////////////////////////////////////
85 // SETTER AND GETTER ////////////////////////////////////////////////////////
86 /////////////////////////////////////////////////////////////////////////////
87
88 /**
89 * Returns the edge weight associated with the given edge.
90 * By default 0 will be returned.
91 */
92 public double getEdgeWeight(Edge e)
93 {
94 return extraEdgeData.getDouble(e);
95 }
96
97 /**
98 * Sets the edge weight associated with the given edge.
99 */
100 public void setEdgeWeight(Edge e, double weight)
101 {
102 extraEdgeData.setDouble(e, weight);
103 }
104
105 /**
106 * Returns the node info associated with the given node.
107 *
108 * By default 0 will be returned.
109 */
110 public NodeInfo getNodeInfo(Node v)
111 {
112 NodeInfo info = (NodeInfo)extraNodeData.get(v);
113
114 //lazy default initialisation could be performed here
115 // if(info == null)
116 // {
117 // info = new NodeInfo();
118 // setNodeInfo(v, info);
119 // }
120
121 return info;
122
123 }
124
125 public void setNodeInfo(Node v, NodeInfo info)
126 {
127 extraNodeData.set(v, info);
128 }
129
130 public static class NodeInfo
131 {
132 public String name;
133 public String type;
134 public int version;
135
136 public NodeInfo()
137 {
138 this("unknown","unknown",0);
139 }
140
141 public NodeInfo(String name, String type, int version)
142 {
143 this.name = name;
144 this.type = type;
145 this.version = version;
146 }
147
148 public String toString()
149 {
150 return "Name=" + name + " Type=" + type + " Version=" + version;
151 }
152 }
153
154
155 public static void main(String[] args)
156 {
157 ExtendedGraph graph = new ExtendedGraph();
158 RandomGraphGenerator rg = new RandomGraphGenerator(0);
159 rg.setNodeCount(10);
160 rg.setEdgeCount(10);
161 rg.generate(graph);
162 YRandom random = new YRandom(0);
163 for(EdgeCursor ec = graph.edges(); ec.ok(); ec.next())
164 {
165 graph.setEdgeWeight(ec.edge(), random.nextDouble(0.0,10.0));
166 }
167 for(NodeCursor nc = graph.nodes(); nc.ok(); nc.next())
168 {
169 Node v = nc.node();
170 NodeInfo info = new NodeInfo("Node #" + v.index(),"Extra Node",1);
171 graph.setNodeInfo(v, info);
172 }
173
174 for(NodeCursor nc = graph.nodes(); nc.ok(); nc.next())
175 {
176 D.bug(graph.getNodeInfo(nc.node()));
177 }
178 for(EdgeCursor ec = graph.edges(); ec.ok(); ec.next())
179 {
180 D.bug("Edge " + ec.edge().index() + " weight= " + graph.getEdgeWeight(ec.edge()));
181 }
182
183 }
184 }
185