1   /**
2    * Class description.
3    * Creation date: Mar 25, 2003
4    * Creation time: 11:08:04 AM
5    * author: Vladimir Karasev
6    */
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  /**
24   * Copyright (c) Ontos AG (http://www.ontosearch.com).
25   * This class is part of JAPE Debugger component for
26   * GATE (Copyright (c) "The University of Sheffield" see http://gate.ac.uk/) <br>
27   * @author Vladimir Karasev
28   */
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      //TODO: make id private
38      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