package org.ntlab.traceanalyzer; import java.util.ArrayList; import java.util.HashSet; import org.ntlab.trace.MethodExecution; public class MarkedMethodExecution { private MethodExecution methodExecution; private ArrayList<MarkedMethodExecution> children = null; private int uniqueMethodInvokedFrom = 0; public MarkedMethodExecution(MethodExecution methodExecution) { this.methodExecution = methodExecution; } public void addChild(MarkedMethodExecution child) { if (children == null) { children = new ArrayList<MarkedMethodExecution>(); } children.add(child); } public ArrayList<MarkedMethodExecution> getChildren() { if (children == null) { ArrayList<MethodExecution> rawChildren = methodExecution.getChildren(); children = new ArrayList<MarkedMethodExecution>(); for (int i = 0; i < rawChildren.size(); i++) { children.add(0, new MarkedMethodExecution(rawChildren.get(i))); } } return children; } public Object getParent() { return methodExecution.getParent(); } public String getSignature() { return methodExecution.getSignature(); } public String getDeclaringClassName() { return methodExecution.getDeclaringClassName(); } public String getReceiverClassName() { return methodExecution.getThisClassName(); } /** * マーク固有のメソッドが呼び出されたかどうかを調べる * @param commonMethodSignatures マーク外で呼び出された全メソッドのシグニチャ */ public int searchUniqueMethodInvocation(HashSet<String> commonMethodSignatures) { if (uniqueMethodInvokedFrom > 0) return uniqueMethodInvokedFrom; if (isUniqueMethod(commonMethodSignatures)) uniqueMethodInvokedFrom = 2; ArrayList<MarkedMethodExecution> children = getChildren(); for (int i = 0; i < children.size(); i++) { int u = children.get(i).searchUniqueMethodInvocation(commonMethodSignatures); if (uniqueMethodInvokedFrom == 0 && u > 0) uniqueMethodInvokedFrom = 1; } return uniqueMethodInvokedFrom; } /** * マーク固有のメソッド実行をすべて取得する * @param commonMethodSignatures マーク外で実行された全メソッドのシグニチャ * @return このメソッド実行以下のマーク固有の全メソッド実行 */ public void getUniqueMethodExecutions(HashSet<String> commonMethodSignatures, ArrayList<MarkedMethodExecution> uniqueMethodExecutions) { if (isUniqueMethod(commonMethodSignatures)) { uniqueMethodExecutions.add(this); } for (int n = 0; n < children.size(); n++) { children.get(n).getUniqueMethodExecutions(commonMethodSignatures, uniqueMethodExecutions); } } /** * このメソッド実行からマーク固有のメソッドが呼び出されたか? * @return 0: 呼び出されていない, 1: 呼び出された, 2: 自分自身がマーク固有メソッド */ public int isUniqueMethodInvokedFrom() { return uniqueMethodInvokedFrom; } private boolean isUniqueMethod(HashSet<String> commonMethodSignatures) { return !commonMethodSignatures.contains(getSignature()); } }