- 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());
- }
- }