5 public class Termination {
7 Hashtable conjunctionmap;
9 HashSet abstractrepair;
12 Hashtable scopesatisfy;
13 Hashtable scopefalsify;
17 public Termination(State state) {
19 conjunctions=new HashSet();
20 conjunctionmap=new Hashtable();
21 abstractrepair=new HashSet();
22 scopenodes=new HashSet();
23 scopesatisfy=new Hashtable();
24 scopefalsify=new Hashtable();
26 generateconjunctionnodes();
27 generaterepairnodes();
28 generateabstractedges();
29 generatedatastructureupdatenodes();
33 void generateconjunctionnodes() {
34 Vector constraints=state.vConstraints;
35 for(int i=0;i<constraints.size();i++) {
36 Constraint c=(Constraint)constraints.get(i);
37 DNFConstraint dnf=c.dnfconstraint;
38 for(int j=0;j<dnf.size();j++) {
39 TermNode tn=new TermNode(c,dnf.get(j));
40 GraphNode gn=new GraphNode("Conjunction"+i+","+j,tn);
42 conjunctionmap.put(c,gn);
47 void generateabstractedges() {
48 for(Iterator absiterator=abstractrepair.iterator();absiterator.hasNext();) {
49 GraphNode gn=(GraphNode)absiterator.next();
50 TermNode tn=(TermNode)gn.getOwner();
51 AbstractRepair ar=(AbstractRepair)tn.getAbstract();
53 for(Iterator conjiterator=conjunctions.iterator();conjiterator.hasNext();) {
54 GraphNode gn2=(GraphNode)conjiterator.next();
55 TermNode tn2=(TermNode)gn2.getOwner();
56 Conjunction conj=tn2.getConjunction();
57 for(int i=0;i<conj.size();i++) {
58 DNFPredicate dp=conj.get(i);
59 if (AbstractInterferes.interferes(ar,dp)) {
60 GraphNode.Edge e=new GraphNode.Edge("interferes",gn2);
70 void generaterepairnodes() {
71 for(Iterator conjiterator=conjunctions.iterator();conjiterator.hasNext();) {
72 GraphNode gn=(GraphNode)conjiterator.next();
73 TermNode tn=(TermNode)gn.getOwner();
74 Conjunction conj=tn.getConjunction();
75 for(int i=0;i<conj.size();i++) {
76 DNFPredicate dp=conj.get(i);
77 int[] array=dp.getPredicate().getRepairs(dp.isNegated());
78 Descriptor d=dp.getPredicate().getDescriptor();
79 for(int j=0;j<array.length;j++) {
80 AbstractRepair ar=new AbstractRepair(dp,array[j],d);
81 TermNode tn2=new TermNode(ar);
82 GraphNode gn2=new GraphNode(gn.getLabel()+"-"+i+","+j,tn2);
83 GraphNode.Edge e=new GraphNode.Edge("abstract",gn2);
85 abstractrepair.add(gn2);
91 void generatedatastructureupdatenodes() {
92 for(Iterator absiterator=abstractrepair.iterator();absiterator.hasNext();) {
93 GraphNode gn=(GraphNode)absiterator.next();
94 TermNode tn=(TermNode) gn.getOwner();
95 AbstractRepair ar=tn.getAbstract();
96 if (ar.getType()==AbstractRepair.ADDTOSET) {
98 } else if (ar.getType()==AbstractRepair.REMOVEFROMSET) {
99 generateremovefromset(ar);
100 } else if (ar.getType()==AbstractRepair.ADDTORELATION) {
101 generateaddtorelation(ar);
102 } else if (ar.getType()==AbstractRepair.REMOVEFROMRELATION) {
103 generateremovefromrelation(ar);
104 } else if (ar.getType()==AbstractRepair.MODIFYRELATION) {
105 generatemodifyrelation(ar);
110 void generateaddtoset(AbstractRepair ar) {
111 for(int i=0;i<state.vRules.size();i++) {
112 Rule r=(Rule) state.vRules.get(i);
113 if (r.getInclusion() instanceof SetInclusion) {
114 if (ar.getDescriptor()==((SetInclusion)r.getInclusion()).getSet()) {
115 //Generate add instruction
123 void generatescopenodes() {
124 for(int i=0;i<state.vRules.size();i++) {
125 Rule r=(Rule) state.vRules.get(i);
126 ScopeNode satisfy=new ScopeNode(r,true);
127 TermNode tnsatisfy=new TermNode(satisfy);
128 GraphNode gnsatisfy=new GraphNode("Satisfy Rule"+i,tnsatisfy);
130 ScopeNode falsify=new ScopeNode(r,false);
131 TermNode tnfalsify=new TermNode(falsify);
132 GraphNode gnfalsify=new GraphNode("Falsify Rule"+i,tnfalsify);
133 scopesatisfy.put(r,gnsatisfy);
134 scopefalsify.put(r,gnfalsify);
135 scopenodes.add(gnsatisfy);
136 scopenodes.add(gnfalsify);