Main Page   Packages   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

TryFinallyStmtAnnotation.java

00001 package edu.ksu.cis.bandera.annotation;
00002 
00003 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00004  * Bandera, a Java(TM) analysis and transformation toolkit           *
00005  * Copyright (C) 1999, 2000   Robby (robby@cis.ksu.edu)              *
00006  * All rights reserved.                                              *
00007  *                                                                   *
00008  * This work was done as a project in the SAnToS Laboratory,         *
00009  * Department of Computing and Information Sciences, Kansas State    *
00010  * University, USA (http://www.cis.ksu.edu/santos).                  *
00011  * It is understood that any modification not identified as such is  *
00012  * not covered by the preceding statement.                           *
00013  *                                                                   *
00014  * This work is free software; you can redistribute it and/or        *
00015  * modify it under the terms of the GNU Library General Public       *
00016  * License as published by the Free Software Foundation; either      *
00017  * version 2 of the License, or (at your option) any later version.  *
00018  *                                                                   *
00019  * This work is distributed in the hope that it will be useful,      *
00020  * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *
00022  * Library General Public License for more details.                  *
00023  *                                                                   *
00024  * You should have received a copy of the GNU Library General Public *
00025  * License along with this toolkit; if not, write to the             *
00026  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,      *
00027  * Boston, MA  02111-1307, USA.                                      *
00028  *                                                                   *
00029  * Java is a trademark of Sun Microsystems, Inc.                     *
00030  *                                                                   *
00031  * To submit a bug report, send a comment, or get the latest news on *
00032  * this project and other SAnToS projects, please visit the web-site *
00033  *                http://www.cis.ksu.edu/santos                      *
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  * @param node edu.ksu.cis.bandera.jjjc.node.Node
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  * @return java.lang.Object
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  * @return java.util.Vector
00079  * @param includeSequential boolean
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  * @return edu.ksu.cis.bandera.annotations.Annotation
00103  * @param stmt ca.mcgill.sable.soot.jimple.Stmt
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  * @return edu.ksu.cis.bandera.annotations.Annotation
00128  */
00129 public Annotation getFinallyAnnotation() {
00130     return finallyAnnotation;
00131 }
00132 /**
00133  * 
00134  * @return edu.ksu.cis.bandera.annotation.Annotation
00135  */
00136 public Annotation getFinallyExceptionAnnotation() {
00137     return finallyExceptionAnnotation;
00138 }
00139 /**
00140  * 
00141  * @return ca.mcgill.sable.soot.jimple.Stmt[]
00142  */
00143 public Stmt[] getStatements() {
00144     // change this
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  * @return boolean
00172  * @param stmt ca.mcgill.sable.soot.jimple.Stmt
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  * @return boolean
00182  * @param stmt ca.mcgill.sable.soot.jimple.Stmt
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  * @return boolean
00192  * @param oldStmt ca.mcgill.sable.soot.jimple.Stmt
00193  * @param newStmt ca.mcgill.sable.soot.jimple.Stmt
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  * @return boolean
00203  * @param oldStmt ca.mcgill.sable.soot.jimple.Stmt
00204  * @param newStmt ca.mcgill.sable.soot.jimple.Stmt
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  * @param statements edu.ksu.cis.bandera.annotations.Annotation
00214  */
00215 public void setFinallyAnnotation(Annotation annotation) {
00216     finallyAnnotation = annotation;
00217     finallyAnnotation.setParent(this);
00218 }
00219 /**
00220  * 
00221  * @param annotation edu.ksu.cis.bandera.annotation.Annotation
00222  */
00223 public void setFinallyExceptionAnnotation(Annotation annotation) {
00224     finallyExceptionAnnotation = annotation;
00225 }
00226 /**
00227  * 
00228  * @param body ca.mcgill.sable.soot.jimple.JimpleBody
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 }

Generated at Thu Feb 7 06:58:12 2002 for Bandera by doxygen1.2.10 written by Dimitri van Heesch, © 1997-2001