001 /*
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: 2002-10-4
005 * Time: 16:54:10
006 * To change template for new class use
007 * Code Style | Class Templates options (Tools | IDE Options).
008 */
009 package EVolve.util;
010
011 import EVolve.util.Equators.Set;
012
013 import java.util.*;
014
015 public class DataTrace {
016 private ArrayList trace, stack;
017 private int invocationNum, setSize;
018 private Set currentSet;
019
020 public DataTrace() {
021 trace = new ArrayList();
022 stack = new ArrayList();
023 invocationNum = 0;
024 currentSet = null;
025 }
026
027 public DataTrace(Set workingSet) {
028 currentSet = workingSet;
029 trace = new ArrayList();
030 this.setSize = currentSet.size();
031 trace.add(currentSet);
032 }
033
034 public void updateTrace(int calleeId, boolean methodEntry) {
035 int[] methodFootprint = new int[2];
036
037 methodFootprint[0] = calleeId;
038 methodFootprint[1] = methodEntry ? 1 : 0; // 1 means a entry event, 0 means exit event
039 if (!methodEntry && (trace.size() == 0)) return;
040
041 if (methodEntry) invocationNum++;
042 trace.add(methodFootprint);
043 }
044
045 public void updateTrace2(int traceId) {
046 trace.add(new Integer(traceId));
047 }
048
049 public void updateTrace3(int traceId) {
050 if (currentSet.setFull()) {
051 currentSet = currentSet.newSet();
052 trace.add(currentSet);
053 }
054
055 currentSet.addElement(traceId);
056 }
057
058 public ArrayList getCallerChains(int callerId,int calleeId) {
059 ArrayList returnVal = new ArrayList();
060 ArrayList callerChain;
061 int footprint[];
062
063 stack.clear();
064 for (int i = 0; i<trace.size(); i++) {
065 footprint = (int[])trace.get(i);
066
067 if (footprint[1] == 0) {// method exit
068 if (stack.size() != 0) stack.remove(stack.size()-1);
069 }
070 else {
071 stack.add(new Integer(footprint[0]));
072 if ((stack.size()>=2) &&
073 (((Integer)stack.get(stack.size()-1)).intValue() == calleeId) &&
074 (((Integer)stack.get(stack.size()-2)).intValue() == callerId)) {
075 callerChain = (ArrayList)stack.clone();
076 callerChain.remove(callerChain.size()-1);
077 returnVal.add(callerChain);
078 }
079 }
080
081 }
082
083 // remove duplicates
084 ArrayList temp = new ArrayList(), tempReturnVal = new ArrayList();
085 for (int i = 1; i< returnVal.size(); i++) {
086 temp = (ArrayList)returnVal.get(i-1);
087 boolean found = false;
088 for (int j=i; j<returnVal.size(); j++) {
089 callerChain = (ArrayList)returnVal.get(j);
090 if (temp.size() != callerChain.size())
091 continue;
092 for (int k=0; k< temp.size(); k++) {
093 if (((Integer)temp.get(k)).intValue() != ((Integer)callerChain.get(k)).intValue()) {
094 found = false;
095 break;
096 }
097 found = true;
098 }
099 if (found) break;
100 }
101 if (!found)
102 tempReturnVal.add(temp);
103 }
104 if (tempReturnVal.size()>0)
105 returnVal = tempReturnVal;
106 return returnVal;
107 }
108
109 public ArrayList getCallerChain(int callerId, int calleeId) {
110 ArrayList callerChain = new ArrayList();
111 int[] footprint;
112
113 callerChain.add(new Integer(callerId));
114 stack.clear();
115 for (int i = 0; i<trace.size(); i++) {
116 footprint = (int[])trace.get(i);
117
118 if (footprint[1] == 0) { // method exit event
119 if (stack.size() != 0) stack.remove(stack.size()-1);
120 } else {
121 stack.add(new Integer(footprint[0]));
122 if ((stack.size()>=2) &&
123 (((Integer)stack.get(stack.size()-1)).intValue() == calleeId) &&
124 (((Integer)stack.get(stack.size()-2)).intValue() == callerId)) {
125 callerChain = (ArrayList)stack.clone();
126 callerChain.remove(callerChain.size()-1);
127 break;
128 }
129 }
130 }
131
132 return callerChain;
133 }
134
135 public ArrayList getCallees(int callerId, int calleeId) {
136 ArrayList callees = new ArrayList();
137 int footprint[],i;
138
139 stack.clear();
140 for (i = 0; i<trace.size(); i++) {
141 footprint = (int[])trace.get(i);
142
143 if (footprint[1] == 0) { // method exit event
144 if (stack.size() != 0) stack.remove(stack.size()-1);
145 } else {
146 stack.add(new Integer(footprint[0]));
147 if ((stack.size()>=3) &&
148 (((Integer)stack.get(stack.size()-2)).intValue() == calleeId) &&
149 (((Integer)stack.get(stack.size()-3)).intValue() == callerId)) {
150 callees.add(new Integer(footprint[0]));
151 }
152 }
153 }
154
155 // remove duplicates
156 ArrayList temp = new ArrayList();
157 for (i=0; i<callees.size();i++) {
158 int value = ((Integer)callees.get(i)).intValue();
159 boolean found = false;
160 if (i==0) {
161 temp.add(new Integer(value));
162 continue;
163 }
164 for (int j=0; j<temp.size();j++) {
165 if (value == ((Integer)temp.get(j)).intValue()) {
166 found = true;
167 break;
168 }
169 }
170 if (!found)
171 temp.add(new Integer(value));
172 }
173 callees = temp;
174 return callees;
175 }
176
177 public int size() {
178 return trace.size();
179 }
180
181 public ArrayList getTrace() {
182 return trace;
183 }
184 }