1   package debugger.resources.pr;
2   
3   import debugger.resources.ResourcesFactory;
4   import gate.Annotation;
5   import gate.AnnotationSet;
6   import gate.annotation.AnnotationSetImpl;
7   import gate.fsm.State;
8   import gate.jape.RightHandSide;
9   import gate.jape.SinglePhaseTransducer;
10  
11  import java.util.ArrayList;
12  import java.util.HashMap;
13  import java.util.Iterator;
14  
15  /**
16   * Copyright (c) Ontos AG (http://www.ontosearch.com).
17   * This class is part of JAPE Debugger component for
18   * GATE (Copyright (c) "The University of Sheffield" see http://gate.ac.uk/) <br>
19   * @author Vladimir Karasev
20   */
21  
22  public class TraceContainer extends ArrayList {
23      private HashMap phaseCut = new HashMap();
24  
25      public RuleTrace getStateContainer(State state) {
26          RuleTrace result = null;
27          ArrayList helpList = new ArrayList();
28          for (Iterator iter = iterator(); iter.hasNext();) {
29              RuleTrace rt = (RuleTrace) iter.next();
30              if (rt.containsState(state)) {
31                  helpList.add(rt);
32              }
33          }
34          if (helpList.isEmpty()) return result;
35          result = (RuleTrace) helpList.remove(0);
36          for (Iterator iterator = helpList.iterator(); iterator.hasNext();) {
37              RuleTrace ruleTrace = (RuleTrace) iterator.next();
38              if (ruleTrace.getAnnotations().lastNode().getOffset().longValue() > result.getAnnotations().lastNode().getOffset().longValue())
39                  result = ruleTrace;
40          }
41          return result;
42      }
43  
44      public TraceContainer getTraceByOffset(Long start, Long end) {
45          TraceContainer result = new TraceContainer();
46          result.phaseCut.putAll(this.phaseCut);
47  //       for(Iterator iterator = result.phaseCut.keySet().iterator(); iterator.hasNext();)
48  //       {
49  //           PhaseModel phaseModel = (PhaseModel) iterator.next();
50  //           if(null != ((AnnotationSet)result.phaseCut.get(phaseModel)).get("GraduateNoun"))
51  //           {
52  //               System.out.println("phaseModel = " + phaseModel.getName());
53  //               System.out.println("start = " + start);
54  //           }
55  //
56  //       }
57          for (Iterator iterator = this.iterator(); iterator.hasNext();) {
58              RuleTrace ruleTrace = (RuleTrace) iterator.next();
59              if (ruleTrace.getAnnotations().firstNode().getOffset().longValue() >= start.longValue())
60                  if (ruleTrace.getAnnotations().firstNode().getOffset().longValue() < end.longValue())
61                      result.add(ruleTrace);
62          }
63          return result;
64      }
65  //   public TraceContainer getTraceByPhase(String phaseName)
66  //   {
67  //      TraceContainer result = new TraceContainer();
68  //      for (Iterator iterator = this.iterator(); iterator.hasNext();)
69  //      {
70  //         RuleTrace ruleTrace = (RuleTrace) iterator.next();
71  //         if(ruleTrace.getPhaseName().equals(phaseName))
72  //            result.add(ruleTrace);
73  //      }
74  //      return result;
75  //   }
76  //
77  //   public TraceContainer getTraceByRule(String ruleName)
78  //   {
79  //      TraceContainer result = new TraceContainer();
80  //      for (Iterator iterator = this.iterator(); iterator.hasNext();)
81  //      {
82  //         RuleTrace ruleTrace = (RuleTrace) iterator.next();
83  //         if(ruleTrace.getRuleName().equals(ruleName))
84  //            result.add(ruleTrace);
85  //      }
86  //      return result;
87  //   }
88      public TraceContainer getTraceByRuleModel(RuleModel ruleModel) {
89          TraceContainer result = new TraceContainer();
90          Iterator iter = this.iterator();
91          while (iter.hasNext()) {
92              RuleTrace ruleTrace = (RuleTrace) iter.next();
93              if (ruleTrace.getRuleModel() == ruleModel)
94                  result.add(ruleTrace);
95          }
96          result.phaseCut.putAll(this.phaseCut);
97          return result;
98      }
99  
100     public AnnotationSet getPhaseCut(PhaseModel pm) {
101         //System.out.println("phaseCut.size() = " + phaseCut.size());
102         return (AnnotationSet) phaseCut.get(pm);
103     }
104 
105     public void putPhaseCut(SinglePhaseTransducer spt, AnnotationSet annotations) {
106         //by Shafirin Andrey
107         // don't do anything without JapeDebugger running
108         // was an error: resources loaded after MorphHashGazetteer not visible
109         // because of to early init of PrRoot while running internal MorphHashGazetteer's
110         // tokenizer during parsing MorphHashGazetteer's word list
111         //if(null == JapeDebugger.getMainFrame()) return;
112 
113         AnnotationSet storedAnnotations = null;
114         boolean isSPTFound = false;
115         //clone annotations
116         storedAnnotations = new AnnotationSetImpl(annotations.getDocument());
117         for (Iterator iterator = annotations.iterator(); iterator.hasNext();) {
118             Annotation annotation = (Annotation) iterator.next();
119             storedAnnotations.add(annotation);
120         }
121         for (int i = 0; i < ResourcesFactory.getPrRoot().getPRs().size(); i++) {
122             PrModel prModel = (PrModel) ResourcesFactory.getPrRoot().getPRs().get(i);
123             for (int j = 0; j < prModel.getPhases().size(); j++) {
124                 PhaseModel phaseModel = (PhaseModel) prModel.getPhases().get(j);
125                 if (phaseModel.getSPT() == spt) {
126                     if (this.phaseCut.containsKey(phaseModel)) {
127                         ((AnnotationSet) this.phaseCut.get(phaseModel)).addAll(storedAnnotations);
128                     } else
129                         this.phaseCut.put(phaseModel, storedAnnotations);
130                     isSPTFound = true;
131                 }
132             }
133         }
134 //      if(!isSPTFound)
135 //         System.out.println("spt " + spt.getName()+ " not found!");
136 
137     }
138 
139     public void addAll(TraceContainer tc) {
140         super.addAll(tc);
141 //       for(Iterator iterator = tc.phaseCut.keySet().iterator(); iterator.hasNext();)
142 //       {
143 //           PhaseModel phaseModel = (PhaseModel) iterator.next();
144 //           if(null != ((AnnotationSet)tc.phaseCut.get(phaseModel)).get("GraduateNoun"))
145 //           {
146 //               System.out.println("-------in addAll Transit-------------------------------");
147 //               System.out.println("phaseModel = " + phaseModel.getName());
148 //           }
149 //
150 //       }
151         for (Iterator iterator = tc.phaseCut.keySet().iterator(); iterator.hasNext();) {
152             PhaseModel phaseModel = (PhaseModel) iterator.next();
153             if (this.phaseCut.containsKey(phaseModel)) {
154                 if (phaseModel.getName().equalsIgnoreCase("postprocess")) {
155                     this.phaseCut.clear();
156                     super.clear();
157                     super.addAll(tc);
158                     this.phaseCut.put(phaseModel, tc.phaseCut.get(phaseModel));
159                 } else
160                     ((AnnotationSet) this.phaseCut.get(phaseModel)).addAll((AnnotationSet) tc.phaseCut.get(phaseModel));
161 //            System.out.println("Merge annotations:"+tc.getPhaseCut(phaseModel).getDocument().getContent().toString());
162             } else
163                 this.phaseCut.put(phaseModel, tc.phaseCut.get(phaseModel));
164         }
165 //       for(Iterator iterator = this.phaseCut.keySet().iterator(); iterator.hasNext();)
166 //       {
167 //           PhaseModel phaseModel = (PhaseModel) iterator.next();
168 //           if(null != ((AnnotationSet)this.phaseCut.get(phaseModel)).get("GraduateNoun"))
169 //           {
170 //               System.out.println("-------in addAll in--------------------------------");
171 //               System.out.println("phaseModel = " + phaseModel.getName());
172 //           }
173 //
174 //       }
175 
176     }
177 
178     public void leaveLast(RightHandSide currentRHS) {
179         Iterator iter = iterator();
180         RuleTrace last = null;
181         while (iter.hasNext()) {
182             RuleTrace ruleTrace = (RuleTrace) iter.next();
183             if (ruleTrace.getRuleModel().getRHS() == currentRHS) {
184                 last = ruleTrace;
185             }
186         }
187         iter = iterator();
188         while (iter.hasNext()) {
189             RuleTrace ruleTrace = (RuleTrace) iter.next();
190             if (ruleTrace != last)
191                 if (ruleTrace.isFinished())
192                     ruleTrace.setOverrided(last.getRuleModel());
193         }
194     }
195 }
196