00001 package edu.ksu.cis.bandera.annotation;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 import edu.ksu.cis.bandera.jjjc.node.*;
00036 import ca.mcgill.sable.soot.jimple.*;
00037 import java.util.*;
00038 public abstract class ControlFlowAnnotation extends Annotation {
00039
00040 protected boolean indefinite = false;
00041 protected Annotation blockAnnotation = null;
00042
00043
00044
00045
00046 public ControlFlowAnnotation(Node node) {
00047 super(node);
00048 }
00049
00050
00051
00052
00053 public abstract Stmt getBackpointStmt();
00054
00055
00056
00057
00058 public Annotation getBlockAnnotation() {
00059 return blockAnnotation;
00060 }
00061
00062
00063
00064
00065
00066 public Annotation getContainingAnnotation(Stmt stmt) throws AnnotationException {
00067 Vector result = new Vector();
00068
00069 Annotation a = super.getContainingAnnotation(stmt);
00070 if (a != null) result.addElement(a);
00071
00072 if (blockAnnotation != null) {
00073 a = blockAnnotation.getContainingAnnotation(stmt);
00074 if (a != null) result.addElement(a);
00075 }
00076
00077 int size = result.size();
00078 if (size == 0) return null;
00079 else if (size == 1) return (Annotation) result.elementAt(0);
00080 throw new AnnotationException("Statement " + stmt + " is contained in two or more annotations");
00081 }
00082
00083
00084
00085
00086 public Stmt[] getTestStatements() {
00087 return toArray();
00088 }
00089
00090
00091
00092
00093 public boolean isIndefinite() {
00094 return indefinite;
00095 }
00096
00097
00098
00099
00100
00101 public boolean removeStmt(Stmt stmt) throws AnnotationException {
00102 Annotation a = getContainingAnnotation(stmt);
00103 if (a == null) return false;
00104 else if (a == this) return remove(stmt);
00105 else return a.removeStmt(stmt);
00106 }
00107
00108
00109
00110
00111
00112 public boolean removeStmtByMark(Stmt stmt) throws AnnotationException {
00113 Annotation a = getContainingAnnotation(stmt);
00114 if (a == null) return false;
00115 else if (a == this) return removeByMark(stmt);
00116 else return a.removeStmtByMark(stmt);
00117 }
00118
00119
00120
00121
00122
00123
00124 public boolean replaceStmt(Stmt oldStmt, Stmt newStmt) throws AnnotationException {
00125 Annotation a = getContainingAnnotation(oldStmt);
00126 if (a == null) return false;
00127 else if (a == this) return replace(oldStmt, newStmt);
00128 else return a.replaceStmt(oldStmt, newStmt);
00129 }
00130
00131
00132
00133
00134
00135
00136 public boolean replaceStmtByMark(Stmt oldStmt, Stmt newStmt) throws AnnotationException {
00137 Annotation a = getContainingAnnotation(oldStmt);
00138 if (a == null) return false;
00139 else if (a == this) return replaceByMark(oldStmt, newStmt);
00140 else return a.replaceStmtByMark(oldStmt, newStmt);
00141 }
00142
00143
00144
00145
00146 public void setBlockAnnotation(Annotation annotation) {
00147 blockAnnotation = annotation;
00148 blockAnnotation.setParent(this);
00149 }
00150
00151
00152
00153
00154 public void setIndefinite(boolean indefinite) {
00155 this.indefinite = indefinite;
00156 }
00157
00158
00159
00160
00161 public void validate(JimpleBody body) {
00162 super.validate(body);
00163 if (blockAnnotation != null) blockAnnotation.validate(body);
00164 }
00165 }