00001 package edu.ksu.cis.bandera.specification.predicate.datastructure;
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.annotation.*;
00036 import ca.mcgill.sable.soot.SootClass;
00037 import edu.ksu.cis.bandera.specification.predicate.exception.*;
00038 import java.util.*;
00039 import edu.ksu.cis.bandera.jjjc.symboltable.*;
00040 import edu.ksu.cis.bandera.jjjc.*;
00041 public class PredicateSet {
00042 private static Hashtable table = new Hashtable();
00043 private static Hashtable defTable = new Hashtable();
00044 private Name name;
00045 private Hashtable predTable = new Hashtable();
00046
00047
00048
00049
00050 public PredicateSet(Name name) {
00051 this.name = name;
00052 table.put(name, this);
00053 }
00054
00055
00056
00057
00058
00059 public static TreeSet getDefinedPredicates(Object key) {
00060 TreeSet set = (TreeSet) defTable.get(key);
00061 if (set == null) {
00062 set = new TreeSet();
00063 }
00064 return set;
00065 }
00066
00067
00068
00069
00070 public Name getName() {
00071 return name;
00072 }
00073
00074
00075
00076
00077
00078 public static Predicate getPredicate(Name name) throws PredicateNotDeclaredException {
00079 try {
00080 PredicateSet ps = getPredicateSet(name.getSuperName());
00081 Predicate p = (Predicate) ps.predTable.get(name);
00082 if (p == null) {
00083 throw new PredicateNotDeclaredException("Predicate named '" + name + "' is not declared");
00084 } else return p;
00085 } catch (PredicateSetNotDeclaredException psnde) {
00086 throw new PredicateNotDeclaredException(psnde.getMessage());
00087 }
00088 }
00089
00090
00091
00092
00093
00094 public static PredicateSet getPredicateSet(Name name) throws PredicateSetNotDeclaredException {
00095 PredicateSet result = (PredicateSet) table.get(name);
00096 if (result == null)
00097 throw new PredicateSetNotDeclaredException("PredicateSet named '" + name + "' is not declared");
00098 return result;
00099 }
00100
00101
00102
00103
00104 public static Hashtable getPredicateSetTable() {
00105 return table;
00106 }
00107
00108
00109
00110
00111 public java.util.Hashtable getPredicateTable() {
00112 return predTable;
00113 }
00114
00115
00116
00117
00118 public void putPredicate(Predicate predicate) throws DuplicatePredicateException {
00119 if (predicate instanceof ExpressionPredicate) {
00120 SootClass sc = (SootClass) CompilationManager.getCompiledClasses().get(predicate.getType().getName().toString());
00121 if (defTable.get(sc) == null) {
00122 defTable.put(sc, new TreeSet());
00123 }
00124 TreeSet ts = (TreeSet) defTable.get(sc);
00125 ts.add(predicate);
00126 } else {
00127 Annotation a = predicate.getAnnotation();
00128 if (a instanceof LabeledStmtAnnotation) {
00129 a = CompilationManager.getAnnotationManager().getMethodAnnotationContainingAnnotation(a);
00130 }
00131 if (defTable.get(a) == null) {
00132 defTable.put(a, new TreeSet());
00133 }
00134 TreeSet ts = (TreeSet) defTable.get(a);
00135 ts.add(predicate);
00136 }
00137 if (predTable.put(predicate.getName(), predicate) != null) {
00138 throw new DuplicatePredicateException("Predicate named '" + predicate.getName() + "' has already been declared");
00139 }
00140 }
00141
00142
00143
00144
00145 static void putPredicateSet(PredicateSet predicateSet) {
00146 table.put(predicateSet.getName(), predicateSet);
00147 }
00148
00149
00150
00151 public static void reset() {
00152 table = new Hashtable();
00153 defTable = new Hashtable();
00154 }
00155 }