001 /* EVolve - an Extensible Software Visualization Framework
002 * Copyright (C) 2001-2002 Qin Wang
003 *
004 * This library is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Library General Public
006 * License as published by the Free Software Foundation; either
007 * version 2 of the License, or (at your option) any later version.
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Library General Public License for more details.
013 *
014 * You should have received a copy of the GNU Library General Public
015 * License along with this library; if not, write to the
016 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017 * Boston, MA 02111-1307, USA.
018 */
019
020 /*
021 * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022 */
023
024 package EVolve.data;
025
026 import EVolve.*;
027 import EVolve.visualization.*;
028 import java.awt.*;
029 import java.util.*;
030
031 public class DataManager {
032 private DataSource dataSource;
033 private ElementDefinition[] definition;
034 private ReferenceLink[] link;
035 private Entity[][] entity;
036 private ElementFilter[][] elementFilter;
037 private Color color;
038 private int colorRGB;
039 private int eventCounter;
040 private int[] eventInterval;
041 private int currentInterval;
042 private boolean dataProcessed;
043
044 public DataManager(DataSource dataSource) {
045 this.dataSource = dataSource;
046 this.eventCounter = 0;
047 }
048
049 public void init() throws DataProcessingException {
050 ElementBuilder.init();
051
052 dataSource.init();
053
054 dataSource.startBuildDefinition();
055
056 ArrayList definitionList = new ArrayList();
057 ElementDefinition nextDefinition = dataSource.getNextDefinition();
058 while (nextDefinition != null) {
059 definitionList.add(nextDefinition);
060 nextDefinition = dataSource.getNextDefinition();
061 }
062
063 definition = new ElementDefinition[definitionList.size()];
064 for (int i = 0; i < definition.length; i++) {
065 definition[((ElementDefinition)(definitionList.get(i))).getType()] = (ElementDefinition)(definitionList.get(i));
066 }
067
068 ArrayList[] entityList = new ArrayList[definition.length];
069 for (int i = 0; i < entityList.length; i++) {
070 entityList[i] = new ArrayList();
071 }
072
073 dataSource.startBuildEntity();
074
075 Entity nextEntity = dataSource.getNextEntity();
076 while (nextEntity != null) {
077 entityList[nextEntity.getType()].add(nextEntity);
078 nextEntity = dataSource.getNextEntity();
079 }
080
081 entity = new Entity[entityList.length][];
082
083 for (int i = 0; i < entity.length; i++) {
084 entity[i] = new Entity[entityList[i].size()];
085 for (int j = 0; j < entity[i].length; j++) {
086 entity[i][((Entity)(entityList[i].get(j))).getId()] = (Entity)(entityList[i].get(j));
087 }
088 }
089
090 // creates links
091 ArrayList list = new ArrayList();
092 for (int i = 0; i < definition.length; i++) {
093 for (int j = 0; j < definition[i].getFieldDefinition().length; j++) {
094 if ((definition[i].getFieldDefinition()[j].getReference() != -1) && (definition[i].getFieldDefinition()[j].getReference() != i)) {
095 list.add(new ReferenceLink(definition[i].getFieldDefinition()[j].getName(), i, j, definition[i].getFieldDefinition()[j].getReference(), definition[i].getFieldDefinition()[j].getDescription()));
096 }
097 }
098 }
099
100 int head = 0;
101 int tail = list.size();
102 int initSize = list.size();
103
104 while (head < tail) {
105 for (int i = head; i < tail; i++) {
106 for (int j = 0; j < initSize; j++) {
107 ReferenceLink from = (ReferenceLink)(list.get(j));
108 ReferenceLink to = (ReferenceLink)(list.get(i));
109 if ((from.getTargetType() == to.getSourceType()) && (from.getSourceType() != to.getTargetType())) {
110 list.add(new ReferenceLink(from, to));
111 }
112 }
113 }
114 head = tail;
115 tail = list.size();
116 }
117
118 link = new ReferenceLink[list.size()];
119 for (int i = 0; i < link.length; i++) {
120 link[i] = (ReferenceLink)(list.get(i));
121 }
122 }
123
124 public void sendEvents() throws DataProcessingException {
125 Selection[] selection = Scene.getFilter().getSelection();
126 Selection activeSelection = Scene.getFilter().getActiveSelection();
127 dataProcessed = false;
128 if (activeSelection != null) {
129 eventInterval = new int[4];
130 eventInterval[0] = 0;
131 eventInterval[1] = activeSelection.getStart();
132 eventInterval[2] = activeSelection.getEnd();
133 eventInterval[3] = Integer.MAX_VALUE;
134 } else {
135 eventInterval = new int[2];
136 eventInterval[0] = 0;
137 eventInterval[1] = Integer.MAX_VALUE;
138 }
139
140 elementFilter = new ElementFilter[eventInterval.length - 1][definition.length];
141 for (int i = 0; i < elementFilter.length; i++) {
142 boolean isIncluded = activeSelection == null ? true : false;
143 for (int j = 0; j < selection.length; j++) {
144 if ((selection[j] == activeSelection)&&(selection[j].getStart() >= eventInterval[i])&&(selection[j].getEnd() <= eventInterval[i+1])) {
145 isIncluded = true;
146 break;
147 }
148 }
149
150 if (isIncluded)
151 {
152 ArrayList list = new ArrayList();
153 if (activeSelection != null) list.add(activeSelection);
154 for (int j = 0; j < selection.length; j++) {
155 if ((selection[j].getColor()!=null) && (selection[j] != activeSelection)) {
156 list.add(selection[j].specialClone());
157 }
158 }
159 Selection[] tempSelection = new Selection[list.size()];
160 for (int j = 0; j < tempSelection.length; j++) {
161 tempSelection[j] = (Selection)(list.get(j));
162 }
163
164 for (int j = 0; j < definition.length; j++) {
165 if (Scene.getVisualizationManager().getVisualizationType().indexOf("" + j + "") != -1) {
166 elementFilter[i][j] = new ElementFilter(definition[j], tempSelection);
167 } else {
168 elementFilter[i][j] = null;
169 }
170 }
171 } else {
172 elementFilter[i] = null;
173 }
174
175 }
176
177 currentInterval = 0;
178
179 dataSource.startBuildEvent();
180 eventCounter = 0;
181
182 Event nextEvent = dataSource.getNextEvent();
183 while (nextEvent != null) {
184 if ((elementFilter[currentInterval] != null) && (elementFilter[currentInterval][nextEvent.getType()] != null)) {
185 color = elementFilter[currentInterval][nextEvent.getType()].getColor(nextEvent);
186 if (color != null)
187 {
188 colorRGB = color.getRGB();
189 Scene.getVisualizationManager().receiveEvent(nextEvent);
190 }
191 }
192
193 if (eventCounter == eventInterval[currentInterval + 1]) {
194 currentInterval++;
195 }
196
197 eventCounter++;
198 nextEvent = dataSource.getNextEvent();
199 }
200 dataProcessed = true;
201 }
202
203 public Entity[][] getEntity() {
204 return entity;
205 }
206
207 public ElementDefinition[] getElementDefinition() {
208 return definition;
209 }
210
211 public ElementDefinition[] getElementDefinition(VisualizationDefinition visualizationDefinition) {
212 ArrayList list = new ArrayList();
213 for (int i = 0; i < definition.length; i++) {
214 boolean add = true;
215 for (int j = 0; j < visualizationDefinition.getDimensionDefinition().length; j++) {
216 DataFilter[] temp = getDataFilter(definition[i], visualizationDefinition.getDimensionDefinition()[j].getProperty());
217 if (temp.length == 0) {
218 add = false;
219 break;
220 }
221 }
222 if (add) {
223 list.add(definition[i]);
224 }
225 }
226
227 ElementDefinition[] returnVal = new ElementDefinition[list.size()];
228 for (int i = 0; i < returnVal.length; i++) {
229 returnVal[i] = (ElementDefinition)(list.get(i));
230 }
231
232 return returnVal;
233 }
234
235 public DataFilter[] getDataFilter(ElementDefinition subjectDefinition, String property) {
236 ArrayList list = new ArrayList();
237 FieldDefinition fd;
238 if (property.equals("reference")) {
239 for (int i = 0; i < link.length; i++) {
240 if (link[i].getSourceType() == subjectDefinition.getType()) {
241 list.add(new DataFilter(link[i].getName(), link[i].getSourceIndex(), link[i], link[i].getDescription(),null));
242 }
243 }
244 } else {
245 for (int i = 0; i < subjectDefinition.getFieldDefinition().length; i++) {
246 fd = subjectDefinition.getFieldDefinition()[i];
247 if (subjectDefinition.getFieldDefinition()[i].hasProperty(property)) {
248 list.add(new DataFilter(subjectDefinition.getFieldDefinition()[i].getName(), i,
249 null, subjectDefinition.getFieldDefinition()[i].getDescription(),fd.getProperties()));
250 }
251 }
252 }
253
254 DataFilter[] returnVal = new DataFilter[list.size()];
255 for (int i = 0; i < returnVal.length; i++) {
256 returnVal[i] = (DataFilter)(list.get(i));
257 }
258
259 return returnVal;
260 }
261
262 public Color getColor() {
263 return color;
264 }
265
266 public int getColorRGB() {
267 return colorRGB;
268 }
269
270 public int getEventCounter() {
271 return eventCounter;
272 }
273
274 public ReferenceLink[] getReferenceLink() {
275 return link;
276 }
277
278 public boolean isCompleted() {
279 return dataProcessed;
280 }
281
282 private void getTraceSize() {
283 }
284
285 }