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 edu.ksu.cis.bandera.jjjc.util.*;
00037 import ca.mcgill.sable.soot.jimple.*;
00038 import ca.mcgill.sable.util.*;
00039 import java.util.*;
00040 public class TryFinallyStmtAnnotation extends TryStmtAnnotation {
00041 private Annotation blockAnnotation = null;
00042 private Annotation finallyAnnotation = null;
00043 private Annotation finallyExceptionAnnotation = null;
00044 private Vector catchClauses = new Vector();
00045
00046
00047
00048
00049 public TryFinallyStmtAnnotation(Node node) {
00050 super(node);
00051 }
00052 public void apply(Switch sw)
00053 {
00054 ((AnnotationSwitch) sw).caseTryFinallyStmtAnnotation(this);
00055 }
00056
00057
00058
00059
00060 public Object clone() {
00061 TryFinallyStmtAnnotation result = new TryFinallyStmtAnnotation((Node) node.clone());
00062
00063 if (blockAnnotation != null) result.setBlockAnnotation((Annotation) blockAnnotation.clone());
00064
00065 for (Enumeration e = catchClauses.elements(); e.hasMoreElements();) {
00066 result.addCatchClauseAnnotation((Annotation) ((Annotation) e.nextElement()).clone());
00067 }
00068
00069 if (finallyAnnotation != null) result.setFinallyAnnotation((Annotation) finallyAnnotation.clone());
00070
00071 if (finallyExceptionAnnotation != null)
00072 result.setFinallyExceptionAnnotation((Annotation) finallyExceptionAnnotation.clone());
00073
00074 return result;
00075 }
00076
00077
00078
00079
00080
00081 public Vector getAllAnnotations(boolean includeSequential) {
00082 Vector result = new Vector();
00083 result.addElement(this);
00084 for (Enumeration e = blockAnnotation.getAllAnnotations(includeSequential).elements(); e.hasMoreElements();) {
00085 result.addElement(e.nextElement());
00086 }
00087 for (Enumeration e = catchClauses.elements(); e.hasMoreElements();) {
00088 Annotation a = (Annotation) e.nextElement();
00089 result.addElement(a);
00090 for (Enumeration e2 = a.getAllAnnotations(includeSequential).elements(); e2.hasMoreElements();) {
00091 result.addElement(e2.nextElement());
00092 }
00093 }
00094 result.addElement(finallyAnnotation);
00095 for (Enumeration e = finallyAnnotation.getAllAnnotations(includeSequential).elements(); e.hasMoreElements();) {
00096 result.addElement(e.nextElement());
00097 }
00098 return result;
00099 }
00100
00101
00102
00103
00104
00105 public Annotation getContainingAnnotation(Stmt stmt) throws AnnotationException {
00106 Vector result = new Vector();
00107
00108 Annotation a = super.getContainingAnnotation(stmt);
00109
00110 if (a != null) result.addElement(a);
00111
00112 a = finallyAnnotation.getContainingAnnotation(stmt);
00113
00114 if (a != null) result.addElement(a);
00115
00116 a = finallyExceptionAnnotation.getContainingAnnotation(stmt);
00117
00118 if (a != null) result.addElement(a);
00119
00120 int size = result.size();
00121 if (size == 0) return null;
00122 else if (size == 1) return (Annotation) result.elementAt(0);
00123 throw new AnnotationException("Statement " + stmt + " is contained in two or more annotations");
00124 }
00125
00126
00127
00128
00129 public Annotation getFinallyAnnotation() {
00130 return finallyAnnotation;
00131 }
00132
00133
00134
00135
00136 public Annotation getFinallyExceptionAnnotation() {
00137 return finallyExceptionAnnotation;
00138 }
00139
00140
00141
00142
00143 public Stmt[] getStatements() {
00144
00145 Stmt[] stmts = super.getStatements();
00146 Stmt[] finallyStmts = finallyAnnotation.getStatements();
00147 Stmt[] finallyExceptionStmts = finallyExceptionAnnotation.getStatements();
00148
00149 Stmt[] result = new Stmt[stmts.length + finallyStmts.length + finallyExceptionStmts.length];
00150
00151 for (int i = 0; i < stmts.length; i++) {
00152 result[i] = stmts[i];
00153 }
00154
00155 int index = stmts.length;
00156
00157 for (int i = 0; i < finallyStmts.length; i++) {
00158 result[index + i] = finallyStmts[i];
00159 }
00160
00161 index += finallyStmts.length;
00162
00163 for (int i = 0; i < finallyExceptionStmts.length; i++) {
00164 result[index + i] = finallyExceptionStmts[i];
00165 }
00166
00167 return result;
00168 }
00169
00170
00171
00172
00173
00174 public boolean removeStmt(Stmt stmt) throws AnnotationException {
00175 Annotation a = getContainingAnnotation(stmt);
00176 if (a == null) return false;
00177 else return a.removeStmt(stmt);
00178 }
00179
00180
00181
00182
00183
00184 public boolean removeStmtByMark(Stmt stmt) throws AnnotationException {
00185 Annotation a = getContainingAnnotation(stmt);
00186 if (a == null) return false;
00187 else return a.removeStmtByMark(stmt);
00188 }
00189
00190
00191
00192
00193
00194
00195 public boolean replaceStmt(Stmt oldStmt, Stmt newStmt) throws AnnotationException {
00196 Annotation a = getContainingAnnotation(oldStmt);
00197 if (a == null) return false;
00198 else return a.replaceStmt(oldStmt, newStmt);
00199 }
00200
00201
00202
00203
00204
00205
00206 public boolean replaceStmtByMark(Stmt oldStmt, Stmt newStmt) throws AnnotationException {
00207 Annotation a = getContainingAnnotation(oldStmt);
00208 if (a == null) return false;
00209 else return a.replaceStmtByMark(oldStmt, newStmt);
00210 }
00211
00212
00213
00214
00215 public void setFinallyAnnotation(Annotation annotation) {
00216 finallyAnnotation = annotation;
00217 finallyAnnotation.setParent(this);
00218 }
00219
00220
00221
00222
00223 public void setFinallyExceptionAnnotation(Annotation annotation) {
00224 finallyExceptionAnnotation = annotation;
00225 }
00226
00227
00228
00229
00230 public void validate(JimpleBody body) {
00231 super.validate(body);
00232
00233 if (finallyAnnotation != null) finallyAnnotation.validate(body);
00234 if (finallyExceptionAnnotation != null) finallyAnnotation.validate(body);
00235 }
00236 }