Adding changes to cvs...
[repair.git] / Repair / RepairCompiler / MCC / IR / GraphNode.java
1 package MCC.IR;
2
3 import java.util.*;
4 import java.io.*;
5
6 public class GraphNode {
7
8     public static boolean useEdgeLabels;
9
10     /* NodeStatus enumeration pattern ***********/
11     
12     public static final NodeStatus UNVISITED = new NodeStatus("UNVISITED");
13     public static final NodeStatus PROCESSING = new NodeStatus("PROCESSING");
14     public static final NodeStatus FINISHED = new NodeStatus("FINISHED");
15
16     public static class NodeStatus {
17         private static String name;
18         private NodeStatus(String name) { this.name = name; }
19         public String toString() { return name; }
20     }
21
22     /* Edge *****************/
23
24     public static class Edge {
25         
26         private String label;
27         private GraphNode target;
28         private String dotnodeparams = new String();
29
30         public Edge(String label, GraphNode target) {
31             this.label = label;
32             this.target = target;
33         }
34
35         public String getLabel() {
36             return label;
37         }
38
39         public GraphNode getTarget() {
40             return target;
41         }
42
43         public void setDotNodeParameters(String param) {
44             if (param == null) {
45                 throw new NullPointerException();
46             }
47             if (param.length() > 0) {
48                 dotnodeparams = "," + param;
49             } else {
50                 dotnodeparams = new String();
51             }
52         }
53
54     }
55
56     int discoverytime = -1;
57     int finishingtime = -1; /* used for searches */
58     Vector edges = new Vector();  
59     String nodelabel;
60     String textlabel;
61     NodeStatus status = UNVISITED;    
62     String dotnodeparams = new String();
63     Object owner = null;
64
65     public GraphNode(String label) {
66         this.nodelabel = label;
67         this.textlabel = label;
68     }
69
70     public GraphNode(String label, Object owner) {
71         this.nodelabel = label;
72         this.textlabel = label;
73         this.owner = owner;
74     }
75
76     public GraphNode(String label, String textlabel, Object owner) {
77         this.nodelabel = label;
78         this.textlabel = textlabel;
79         this.owner = owner;
80     }
81
82     public Object getOwner() {
83         return owner;
84     }
85
86     public static void computeclosure(Set nodes) {
87         Stack tovisit=new Stack();
88         tovisit.addAll(nodes);
89         while(!tovisit.isEmpty()) {
90             GraphNode gn=(GraphNode)tovisit.pop();
91             for(Iterator it=gn.edges();it.hasNext();) {
92                 Edge edge=(Edge)it.next();
93                 GraphNode target=edge.getTarget();
94                 if (!nodes.contains(target)) {
95                     nodes.add(target);
96                     tovisit.push(target);
97                 }
98             }
99         }
100     }
101
102     public void setDotNodeParameters(String param) {
103         if (param == null) {
104             throw new NullPointerException();
105         }
106         if (param.length() > 0) {
107             dotnodeparams = "," + param;
108         } else {
109             dotnodeparams = new String();
110         }
111     }
112     
113     public void setStatus(NodeStatus status) {
114         if (status == null) {
115             throw new NullPointerException();
116         }
117         this.status = status;
118     }
119
120     public String getLabel() {
121         return nodelabel;
122     }
123
124     public String getTextLabel() {
125         return textlabel;
126     }
127     
128     public NodeStatus getStatus() {
129         return this.status;
130     }
131
132     public Iterator edges() {
133         return edges.iterator();
134     }
135
136     public void addEdge(Edge newedge) {
137         edges.addElement(newedge);
138     }
139
140     public void reset() {
141         discoverytime = -1;
142         finishingtime = -1;
143         status = UNVISITED;
144     }
145
146     public void discover(int time) {
147         discoverytime = time++;
148         status = PROCESSING;
149     }
150
151     public void finish(int time) {
152         assert status == PROCESSING;
153         finishingtime = time++;
154         status = FINISHED;
155     }
156
157     public int getFinishingTime() {
158         return finishingtime;
159     }
160
161     public static class DOTVisitor {
162         
163         java.io.PrintWriter output;
164         int tokennumber;
165         int color;
166       
167         private DOTVisitor(java.io.OutputStream output) {
168             tokennumber = 0;
169             color = 0;
170             this.output = new java.io.PrintWriter(output, true);
171         }
172         
173         private String getNewID(String name) {
174             tokennumber = tokennumber + 1;
175             return new String (name+tokennumber);
176         }
177
178         Collection nodes;
179         
180         public static void visit(java.io.OutputStream output, Collection nodes) {
181             DOTVisitor visitor = new DOTVisitor(output);
182             visitor.nodes = nodes;
183             visitor.make();
184
185         }
186         
187         private void make() {
188             output.println("digraph dotvisitor {");
189             output.println("\trotate=90;");
190             /*            output.println("\tpage=\"8.5,11\";");
191                           output.println("\tnslimit=1000.0;");
192                           output.println("\tnslimit1=1000.0;");
193                           output.println("\tmclimit=1000.0;");
194                           output.println("\tremincross=true;");*/
195             output.println("\tnode [fontsize=10,height=\"0.1\", width=\"0.1\"];");
196             output.println("\tedge [fontsize=6];");
197
198             traverse();
199
200             output.println("}\n");
201         }
202                 
203         private void traverse() {            
204             Iterator i = nodes.iterator();
205             while (i.hasNext()) {
206                 GraphNode gn = (GraphNode) i.next();
207                 Iterator edges = gn.edges();
208                 String label = gn.getTextLabel(); // + " [" + gn.discoverytime + "," + gn.finishingtime + "];";
209                 output.println("\t" + gn.getLabel() + " [label=\"" + label + "\"" + gn.dotnodeparams + "];");
210
211                 while (edges.hasNext()) {
212                     Edge edge = (Edge) edges.next();
213                     GraphNode node = edge.getTarget();
214                     if (nodes.contains(node)) {
215                         String edgelabel = useEdgeLabels ? "label=\"" + edge.getLabel() + "\"" : "label=\"\"";
216                         output.println("\t" + gn.getLabel() + " -> " + node.getLabel() + " [" + edgelabel + edge.dotnodeparams + "];");
217                     }
218                 }
219             }
220         }
221     }
222     
223     /**
224      * DFS encapsulates the depth first search algorithm 
225      */
226     public static class DFS {
227
228         int time = 0;
229         Collection nodes;
230
231         private DFS(Collection nodes) { 
232             this.nodes = nodes;
233         }
234
235         public static void depthFirstSearch(Collection nodes) {
236             if (nodes == null) {
237                 throw new NullPointerException();
238             }
239             
240             DFS dfs = new DFS(nodes);
241             dfs.go();
242         }
243
244         private void go() {           
245             Iterator i;
246             time = 0;
247             
248             i = nodes.iterator();
249             while (i.hasNext()) {
250                 GraphNode gn = (GraphNode) i.next();
251                 gn.reset();            
252             }            
253
254             i = nodes.iterator();
255             while (i.hasNext()) {
256                 GraphNode gn = (GraphNode) i.next();
257                 assert gn.getStatus() != PROCESSING;                    
258                 if (gn.getStatus() == UNVISITED) {
259                     dfs(gn);
260                 } 
261             }
262         }
263
264         private void dfs(GraphNode gn) {
265             gn.discover(time++);            
266             Iterator edges = gn.edges();
267
268             while (edges.hasNext()) {
269                 Edge edge = (Edge) edges.next();
270                 GraphNode node = edge.getTarget();
271                 if (node.getStatus() == UNVISITED) {
272                     dfs(node);
273                 }
274             }
275
276             gn.finish(time++);
277         }                        
278
279     } /* end DFS */
280
281 }