1
7 package debugger.resources.pr;
8
9 import debugger.resources.ResourcesFactory;
10 import gate.Annotation;
11 import gate.AnnotationSet;
12 import gate.Document;
13 import gate.FeatureMap;
14 import gate.annotation.AnnotationSetImpl;
15 import gate.fsm.State;
16 import gate.fsm.Transition;
17 import gate.jape.RightHandSide;
18
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.Iterator;
22
23
29
30 public class RuleTrace {
31 private boolean finished;
32 private RuleModel ruleModel;
33 private AnnotationSet annotations;
34 private HashMap patterns;
35 private State lastState;
36 private static int maxId = 0;
37 public int id;
39 private RuleModel overrided;
40
41 public RuleTrace(State state, Document document) {
42 this.finished = false;
43 this.ruleModel = findModel(state);
44 this.overrided = null;
45 this.annotations = new AnnotationSetImpl(document);
46 this.lastState = null;
47 this.addState(state);
48 this.patterns = new HashMap();
49 this.id = maxId++;
50 }
51
52 public void addState(State state) {
53 if (state.isFinal()) finished = true;
54 lastState = state;
55 }
56
57 public boolean containsState(State state) {
58 return (state == lastState);
59 }
60
61 public AnnotationSet getAnnotations() {
62 return annotations;
63 }
64
65 public void setAnnotations(AnnotationSet annotations) {
66 this.annotations = annotations;
67 }
68
69 public void addAnnotation(Annotation annotation) {
70 this.annotations.add(annotation);
71 }
72
73 public boolean isFinished() {
74 return finished;
75 }
76
77 public void setFinished(boolean finished) {
78 this.finished = finished;
79 }
80
81 private RuleModel findModel(State state) {
82 RightHandSide rhs = null;
83 if (state.isFinal()) rhs = state.getAction();
84 ArrayList wave = new ArrayList();
85 wave.add(state);
86 while (rhs == null) {
87 ArrayList newWave = new ArrayList();
88 for (int i = 0; i < wave.size(); i++) {
89 State oldState = (State) wave.get(i);
90 Iterator iter = oldState.getTransitions().iterator();
91 while (iter.hasNext()) {
92 Transition transition = (Transition) iter.next();
93 State newState = transition.getTarget();
94 if (newState.isFinal()) {
95 rhs = newState.getAction();
96 break;
97 }
98 newWave.add(newState);
99 }
100 }
101 wave = newWave;
102 }
103 for (int i = 0; i < ResourcesFactory.getPrRoot().getPRs().size(); i++) {
104 PrModel prModel = (PrModel) ResourcesFactory.getPrRoot().getPRs().get(i);
105 for (int j = 0; j < prModel.getPhases().size(); j++) {
106 PhaseModel phaseModel = (PhaseModel) prModel.getPhases().get(j);
107 for (int k = 0; k < phaseModel.getRules().size(); k++) {
108 RuleModel ruleModel = (RuleModel) phaseModel.getRules().get(k);
109 if (ruleModel.getRHS() == rhs) {
110 return ruleModel;
111 }
112 }
113 }
114 }
115 return null;
116 }
117
118 public void putPattern(Annotation ann, FeatureMap fm) {
119 patterns.put(ann, fm);
120 }
121
122 public FeatureMap getPattern(Annotation ann) {
123 return (FeatureMap) patterns.get(ann);
124 }
125
126 public void setOverrided(RuleModel ruleModel) {
127 this.overrided = ruleModel;
128 }
129
130 public RuleModel getRuleModel() {
131 return ruleModel;
132 }
133
134 public RuleModel getOverrided() {
135 return overrided;
136 }
137
138 public String toString() {
139 String result = "RuleTrace:";
140 result += annotations.firstNode().getOffset().intValue() + "-"
141 + annotations.lastNode().getOffset().intValue();
142
143 result += "(";
144 for (Iterator iterator = annotations.iterator(); iterator.hasNext();) {
145 Annotation annotation = (Annotation) iterator.next();
146 result += annotation.toString();
147 }
148 result += ")";
149 return result;
150 }
151 }
152