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 java.util.*; 012 013 public class MethodInvokingTrace { 014 private ArrayList trace, stack; 015 private int invocationNum; 016 //private ReferenceDimension xAxis; 017 018 public MethodInvokingTrace() { 019 trace = new ArrayList(); 020 stack = new ArrayList(); 021 invocationNum = 0; 022 } 023 024 public void updateMethodTrace(int calleeId, boolean methodEntry) { 025 int[] methodFootprint = new int[2]; 026 027 methodFootprint[0] = calleeId; 028 methodFootprint[1] = methodEntry ? 1 : 0; // 1 means a entry event, 0 means exit event 029 if (!methodEntry && (trace.size() == 0)) return; 030 031 if (methodEntry) invocationNum++; 032 trace.add(methodFootprint); 033 } 034 035 public void updateMethodTrace2(int calleeId) { 036 trace.add(new Integer(calleeId)); 037 } 038 039 public ArrayList getCallerChains(int callerId,int calleeId) { 040 ArrayList returnVal = new ArrayList(); 041 ArrayList callerChain; 042 int footprint[]; 043 044 stack.clear(); 045 for (int i = 0; i<trace.size(); i++) { 046 footprint = (int[])trace.get(i); 047 048 if (footprint[1] == 0) {// method exit 049 if (stack.size() != 0) stack.remove(stack.size()-1); 050 } 051 else { 052 stack.add(new Integer(footprint[0])); 053 if ((stack.size()>=2) && 054 (((Integer)stack.get(stack.size()-1)).intValue() == calleeId) && 055 (((Integer)stack.get(stack.size()-2)).intValue() == callerId)) { 056 callerChain = (ArrayList)stack.clone(); 057 callerChain.remove(callerChain.size()-1); 058 returnVal.add(callerChain); 059 } 060 } 061 062 } 063 064 // remove duplicates 065 ArrayList temp = new ArrayList(), tempReturnVal = new ArrayList(); 066 for (int i = 1; i< returnVal.size(); i++) { 067 temp = (ArrayList)returnVal.get(i-1); 068 boolean found = false; 069 for (int j=i; j<returnVal.size(); j++) { 070 callerChain = (ArrayList)returnVal.get(j); 071 if (temp.size() != callerChain.size()) 072 continue; 073 for (int k=0; k< temp.size(); k++) { 074 if (((Integer)temp.get(k)).intValue() != ((Integer)callerChain.get(k)).intValue()) { 075 found = false; 076 break; 077 } 078 found = true; 079 } 080 if (found) break; 081 } 082 if (!found) 083 tempReturnVal.add(temp); 084 } 085 if (tempReturnVal.size()>0) 086 returnVal = tempReturnVal; 087 return returnVal; 088 } 089 090 public ArrayList getCallerChain(int callerId, int calleeId) { 091 ArrayList callerChain = new ArrayList(); 092 int[] footprint; 093 094 callerChain.add(new Integer(callerId)); 095 stack.clear(); 096 for (int i = 0; i<trace.size(); i++) { 097 footprint = (int[])trace.get(i); 098 099 if (footprint[1] == 0) { // method exit event 100 if (stack.size() != 0) stack.remove(stack.size()-1); 101 } else { 102 stack.add(new Integer(footprint[0])); 103 if ((stack.size()>=2) && 104 (((Integer)stack.get(stack.size()-1)).intValue() == calleeId) && 105 (((Integer)stack.get(stack.size()-2)).intValue() == callerId)) { 106 callerChain = (ArrayList)stack.clone(); 107 callerChain.remove(callerChain.size()-1); 108 break; 109 } 110 } 111 } 112 113 return callerChain; 114 } 115 116 public ArrayList getCallees(int callerId, int calleeId) { 117 ArrayList callees = new ArrayList(); 118 int footprint[],i; 119 120 stack.clear(); 121 for (i = 0; i<trace.size(); i++) { 122 footprint = (int[])trace.get(i); 123 124 if (footprint[1] == 0) { // method exit event 125 if (stack.size() != 0) stack.remove(stack.size()-1); 126 } else { 127 stack.add(new Integer(footprint[0])); 128 if ((stack.size()>=3) && 129 (((Integer)stack.get(stack.size()-2)).intValue() == calleeId) && 130 (((Integer)stack.get(stack.size()-3)).intValue() == callerId)) { 131 callees.add(new Integer(footprint[0])); 132 } 133 } 134 } 135 136 // remove duplicates 137 ArrayList temp = new ArrayList(); 138 for (i=0; i<callees.size();i++) { 139 int value = ((Integer)callees.get(i)).intValue(); 140 boolean found = false; 141 if (i==0) { 142 temp.add(new Integer(value)); 143 continue; 144 } 145 for (int j=0; j<temp.size();j++) { 146 if (value == ((Integer)temp.get(j)).intValue()) { 147 found = true; 148 break; 149 } 150 } 151 if (!found) 152 temp.add(new Integer(value)); 153 } 154 callees = temp; 155 return callees; 156 } 157 158 public int size() { 159 return trace.size(); 160 } 161 162 public ArrayList getMethodTrace() { 163 return trace; 164 } 165 }