001 package EVolve;
002
003 /* EVolve - an Extensible Software Visualization Framework
004 * Copyright (C) 2001-2002 Qin Wang
005 *
006 * This library is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Library General Public
008 * License as published by the Free Software Foundation; either
009 * version 2 of the License, or (at your option) any later version.
010 *
011 * This library is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Library General Public License for more details.
015 *
016 * You should have received a copy of the GNU Library General Public
017 * License along with this library; if not, write to the
018 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
019 * Boston, MA 02111-1307, USA.
020 */
021
022 /*
023 * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
024 */
025
026 import EVolve.*;
027 import EVolve.util.NumericStringComparator;
028 //import EVolve.util.InstructionAnalyzeRunner;
029 import EVolve.data.*;
030 import java.io.*;
031 import java.util.*;
032 import javax.swing.*;
033
034 public class DemoSource implements DataSource {
035 private RandomAccessFile file;
036
037 private EntityBuilder classBuilder;
038
039 private EntityBuilder threadBuilder;
040
041 private EntityBuilder methodBuilder;
042 private FieldDefinition methodDefiningClass;
043
044 private EntityBuilder locationBuilder;
045
046 private EntityBuilder sizeBuilder;
047
048 private EventBuilder allocationBuilder;
049 private FieldDefinition allocationObjectCount;
050 private FieldDefinition allocationObjectSize;
051 private FieldDefinition allocationBytecode;
052 private FieldDefinition allocationObjectType;
053 private FieldDefinition allocationThread;
054 private FieldDefinition allocationMethod;
055 private FieldDefinition allocationLocation;
056 private FieldDefinition allocationSize;
057 private FieldDefinition allocationFieldSum;
058 private FieldDefinition allocationFieldCounter;
059
060 private EventBuilder invocationBuilder;
061 private FieldDefinition invocationNumber;
062 private FieldDefinition invocationBytecode;
063 private FieldDefinition invocationThread;
064 private FieldDefinition invocationMethod;
065 private FieldDefinition invocationLocation;
066 private FieldDefinition invocationStart;
067 private FieldDefinition invocationEnd;
068 private FieldDefinition invocationFieldCounter;
069
070
071 private ElementDefinition[] definition;
072 private int definitionCounter;
073
074 private TreeMap classMap;
075 private TreeMap threadMap;
076 private TreeMap methodMap;
077 private TreeMap locationMap;
078 private TreeMap sizeMap;
079
080 // private InstructionAnalyzeRunner runner;
081
082 public void init() throws DataProcessingException {
083 String fn = Scene.getDataFileName();
084 //runner = Scene.getToolsManager().getInstructionAnalyzeRunner();
085 if (fn == null) {
086 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastDataDir());
087 if (fc.showOpenDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
088 try {
089 file = new RandomAccessFile(fc.getSelectedFile(), "r");
090 Scene.setDataFilename(fc.getSelectedFile().getPath());
091 Scene.getUIManager().setLastDataDir(fc.getSelectedFile().getPath());
092 Scene.setDataFilename(null);
093 } catch (IOException e) {
094 throw new DataProcessingException("File loading failed.");
095 }
096 } else {
097 throw new DataProcessingException("File loading canceled.");
098 }
099 } else {
100 try {
101 file = new RandomAccessFile(fn, "r");
102 } catch (IOException e) {
103 throw new DataProcessingException("File loading failed.");
104 }
105 }
106
107
108 }
109
110 public void startBuildDefinition() throws DataProcessingException {
111 String[] propertySum = {"time","sum"};
112 String[] propertyCount = {"time","count","Dotplot time"};
113 String[] propertyAmount = {"amount"};
114 String[] propertyCoordinate = {"coordinate","time"};
115 String[] propertyIndicator = {"indicator"};
116
117 definition = new ElementDefinition[7];
118
119 classBuilder = new EntityBuilder("Class", "Class");
120 definition[0] = classBuilder.buildDefinition();
121
122 threadBuilder = new EntityBuilder("Thread", "Thread");
123 definition[1] = threadBuilder.buildDefinition();
124
125 methodBuilder = new EntityBuilder("Method", "Method");
126 methodDefiningClass = methodBuilder.buildReferenceDefinition("Defining Class", classBuilder, null, "Defining class of the method");
127 definition[2] = methodBuilder.buildDefinition();
128
129 locationBuilder = new EntityBuilder("Location", "Location in Method");
130 definition[3] = locationBuilder.buildDefinition();
131
132 sizeBuilder = new EntityBuilder("Size", "Object Size");
133 sizeBuilder.addComparator(new NumericStringComparator());
134 definition[4] = sizeBuilder.buildDefinition();
135
136 allocationBuilder = new EventBuilder("Object Allocation", "Object allocation event");
137 allocationFieldSum = allocationBuilder.buildValueDefinition("Memory Allocated", propertySum, "Size of memory allocated");
138 allocationFieldCounter = allocationBuilder.buildValueDefinition("Allocations", propertyCount, "Number of objects allocated");
139 allocationObjectCount = allocationBuilder.buildValueDefinition("Object Count", propertyAmount, "Number of objects allocated");
140 allocationObjectSize = allocationBuilder.buildValueDefinition("Memory Allocated", propertyAmount, "Size of memory allocated");
141 allocationBytecode = allocationBuilder.buildValueDefinition("Bytecode", propertyCoordinate, "Bytecode sequence");
142 allocationObjectType = allocationBuilder.buildReferenceDefinition("Object Type", classBuilder, null, "Type of the object");
143 allocationThread = allocationBuilder.buildReferenceDefinition("Thread", threadBuilder, null, "Thread in which the object is allocated");
144 allocationMethod = allocationBuilder.buildReferenceDefinition("Allocating Methods", methodBuilder, null, "Method that creates the object");
145 allocationLocation = allocationBuilder.buildReferenceDefinition("Allocating Locations", locationBuilder, null, "Location where the object is created");
146 allocationSize = allocationBuilder.buildReferenceDefinition("Allocation Size", sizeBuilder, null, "Allocation Size");
147 definition[5] = allocationBuilder.buildDefinition();
148
149 invocationBuilder = new EventBuilder("Method Invocation", "Method invocation event");
150 invocationFieldCounter = invocationBuilder.buildValueDefinition("Invocations", propertyCount, "Total number of invocations");
151 invocationNumber = invocationBuilder.buildValueDefinition("Number of Invocations", propertyAmount, "Total number of invocations");
152 invocationBytecode = invocationBuilder.buildValueDefinition("Bytecode", propertyCoordinate, "Bytecode sequence");
153 invocationThread = invocationBuilder.buildReferenceDefinition("Thread", threadBuilder, null, "Thread in which the method is invoked");
154 invocationMethod = invocationBuilder.buildReferenceDefinition("Method", methodBuilder, null, "Method that is invoked");
155 invocationLocation = invocationBuilder.buildReferenceDefinition("Invoking Locations", locationBuilder, null, "Location where the method is invoked");
156 invocationStart = invocationBuilder.buildValueDefinition("Invoking start",propertyIndicator,"Start of invocation");
157 invocationEnd = invocationBuilder.buildValueDefinition("Invoking end",propertyIndicator,"End of invocation");
158 definition[6] = invocationBuilder.buildDefinition();
159
160 definitionCounter = -1;
161 }
162
163 public ElementDefinition getNextDefinition() throws DataProcessingException {
164 definitionCounter++;
165 if (definitionCounter < definition.length) {
166 return definition[definitionCounter];
167 } else {
168 return null;
169 }
170 }
171
172 private String getSub(String line, int part) {
173 int start = line.indexOf(' ') + 1;
174 int i = 1;
175 while (i < part) {
176 start = line.indexOf(' ', start) + 1;
177 i++;
178 }
179 int end = line.indexOf(' ', start);
180 if (end == -1) {
181 return line.substring(start);
182 } else {
183 return line.substring(start, end);
184 }
185 }
186
187 public void startBuildEntity() throws DataProcessingException {
188 try {
189 file.seek(0);
190
191 classMap = new TreeMap();
192 threadMap = new TreeMap();
193 methodMap = new TreeMap();
194 locationMap = new TreeMap();
195 sizeMap = new TreeMap();
196 } catch (IOException e) {
197 throw new DataProcessingException("File processing failed.");
198 }
199 }
200
201 public Entity getNextEntity() throws DataProcessingException {
202 try {
203 Entity returnVal = null;
204 String line = file.readLine();
205
206 while ((returnVal == null) && (line != null) &&(line.length()>0)) {
207 line = line.trim();
208 char ch = line.charAt(0);
209
210 if (ch == 'C') {
211 classBuilder.newEntity(getSub(line, 1));
212 returnVal = classBuilder.buildEntity();
213 classMap.put(getSub(line, 2), returnVal);
214 //runner.addClass(Integer.parseInt(getSub(line,2)),getSub(line,1));
215 } else if (ch == 'T') {
216 threadBuilder.newEntity(getSub(line, 1));
217 returnVal = threadBuilder.buildEntity();
218 threadMap.put(getSub(line, 2), returnVal);
219 } else if (ch == 'M') {
220 methodBuilder.newEntity(getSub(line, 1));
221 methodBuilder.addReferenceField(methodDefiningClass, (Entity)(classMap.get(getSub(line, 3))));
222 returnVal = methodBuilder.buildEntity();
223 methodMap.put(getSub(line, 2), returnVal);
224 //runner.addMethod(Integer.parseInt(getSub(line,3)),Integer.parseInt(getSub(line,2)),getSub(line,1));
225 } else if (ch == 'L') {
226 locationBuilder.newEntity(getSub(line, 1));
227 returnVal = locationBuilder.buildEntity();
228 locationMap.put(getSub(line, 2), returnVal);
229 } else if (ch == 'O') {
230 String size = getSub(line, 6);
231 if (!sizeMap.containsKey(size)) {
232 sizeBuilder.newEntity(size);
233 returnVal = sizeBuilder.buildEntity();
234 sizeMap.put(size, returnVal);
235 }
236 }
237
238 if (returnVal == null) {
239 line = file.readLine();
240 }
241 }
242
243 return returnVal;
244 } catch (IOException e) {
245 throw new DataProcessingException("File processing failed.");
246 }
247 }
248
249 public void startBuildEvent() throws DataProcessingException {
250 try {
251 file.seek(0);
252 } catch (IOException e) {
253 throw new DataProcessingException("File processing failed.");
254 }
255 }
256
257 public Event getNextEvent() throws DataProcessingException {
258 try {
259 Event returnVal = null;
260 String line = file.readLine();
261
262 while ((returnVal == null) && (line != null)) {
263 line = line.trim();
264 char ch = line.charAt(0);
265
266 if (ch == 'O') {
267 allocationBuilder.newEvent();
268 String size = getSub(line, 6);
269 allocationBuilder.addValueField(allocationObjectCount, 1);
270 allocationBuilder.addValueField(allocationObjectSize, Integer.parseInt(getSub(line, 6)));
271 allocationBuilder.addValueField(allocationFieldCounter, 1);
272 allocationBuilder.addValueField(allocationFieldSum, Integer.parseInt(getSub(line, 6)));
273 allocationBuilder.addValueField(allocationBytecode, Integer.parseInt(getSub(line, 1)));
274 allocationBuilder.addReferenceField(allocationObjectType, (Entity)(classMap.get(getSub(line, 5))));
275 allocationBuilder.addReferenceField(allocationThread, (Entity)(threadMap.get(getSub(line, 2))));
276 allocationBuilder.addReferenceField(allocationMethod, (Entity)(methodMap.get(getSub(line, 3))));
277 allocationBuilder.addReferenceField(allocationLocation, (Entity)(locationMap.get(getSub(line, 4))));
278 allocationBuilder.addReferenceField(allocationSize, (Entity)(sizeMap.get(size)));
279 returnVal = allocationBuilder.buildEvent();
280 } else if (ch == '+') {
281 invocationBuilder.newEvent();
282 invocationBuilder.addValueField(invocationNumber, 1);
283 invocationBuilder.addValueField(invocationFieldCounter, 1);
284 invocationBuilder.addValueField(invocationBytecode, Integer.parseInt(getSub(line, 1)));
285 invocationBuilder.addReferenceField(invocationThread, (Entity)(threadMap.get(getSub(line, 2))));
286 invocationBuilder.addReferenceField(invocationMethod, (Entity)(methodMap.get(getSub(line, 3))));
287 invocationBuilder.addReferenceField(invocationLocation, (Entity)(locationMap.get(getSub(line, 4))));
288 invocationBuilder.addValueField(invocationStart,Integer.MIN_VALUE);
289 returnVal = invocationBuilder.buildEvent();
290 } else if (ch == '-') {
291 invocationBuilder.newEvent();
292 invocationBuilder.addValueField(invocationNumber, 1);
293 invocationBuilder.addValueField(invocationBytecode, Integer.parseInt(getSub(line, 1)));
294 invocationBuilder.addReferenceField(invocationThread, (Entity)(threadMap.get(getSub(line, 2))));
295 invocationBuilder.addReferenceField(invocationMethod, (Entity)(methodMap.get(getSub(line, 3))));
296 invocationBuilder.addReferenceField(invocationLocation, (Entity)(locationMap.get(getSub(line, 4))));
297 invocationBuilder.addValueField(invocationEnd,Integer.MAX_VALUE);
298 returnVal = invocationBuilder.buildEvent();
299 }
300
301 if (returnVal == null) {
302 line = file.readLine();
303 }
304 }
305
306 return returnVal;
307 } catch (IOException e) {
308 throw new DataProcessingException("File processing failed.");
309 }
310 }
311
312 }