1   package debugger.resources.pr;
2   
3   import debugger.ClassRipper;
4   import gate.ProcessingResource;
5   import gate.jape.Batch;
6   import gate.jape.MultiPhaseTransducer;
7   import gate.jape.SinglePhaseTransducer;
8   
9   import java.util.ArrayList;
10  
11  /**
12   * Copyright (c) Ontos AG (http://www.ontosearch.com).
13   * This class is part of JAPE Debugger component for
14   * GATE (Copyright (c) "The University of Sheffield" see http://gate.ac.uk/) <br>
15   * @author Andrey Shafirin
16   */
17  
18  public class PrModel //extends DefaultMutableTreeNode
19  {
20      private static byte DebugLevel = 3;
21      final ProcessingResource processingResource;
22      final MultiPhaseTransducer transducer;
23      private final PRName prName;
24      private ArrayList phases = new ArrayList();
25  
26      public PrModel(ProcessingResource pr) {
27          this.processingResource = pr;
28          this.prName = new PRName(this.processingResource);
29          //setUserObject(this.prName);
30          this.transducer = getMPTfromPR(processingResource);
31          if (null != this.transducer) {
32              ArrayList spts = this.transducer.getPhases();
33              for (int i = 0; i < spts.size(); i++) {
34                  SinglePhaseTransducer phaseTransducer = (SinglePhaseTransducer) spts.get(i);
35                  phases.add(new PhaseModel(phaseTransducer));
36              }
37              /*for(Iterator phIter = phases.iterator(); phIter.hasNext();)
38              {
39                  SinglePhaseTransducer spt = (SinglePhaseTransducer) phIter.next();
40                  // add nodes for phases
41                  this.add(new PhaseModel(spt));
42              } */
43          }
44  //        else
45  //        {
46  //            this.add(new DefaultMutableTreeNode("This PR isn't subclass of Transducer"));
47  //        }
48      }
49  
50      public String getName() {
51          return this.prName.toString();
52      }
53  
54      public MultiPhaseTransducer getTransducer() {
55          return this.transducer;
56      }
57  
58      public ProcessingResource getProcessingResource() {
59          return processingResource;
60      }
61  
62      public ArrayList getPhases() {
63          return this.phases;
64          //return this.children();
65      }
66  
67      public PhaseModel getPhase(String phaseName) {
68          //Enumeration phaseEnum = this.children();
69          for (int i = 0; i < phases.size(); i++) {
70              PhaseModel phaseModel = (PhaseModel) phases.get(i);
71              if (phaseModel.getName().equals(phaseName)) {
72                  return phaseModel;
73              }
74          }
75  //        while(phases.hasMoreElements())
76  //        {
77  //            PhaseModel phase = (PhaseModel) phaseEnum.nextElement();
78  //            if(phase.getName().equals(phaseName))
79  //            {
80  //                return phase;
81  //            }
82  //        }
83          return null;
84      }
85  
86      public PhaseModel getPhase(SinglePhaseTransducer spt) {
87          if (DebugLevel >= 4) {
88              System.out.print("DEBUG [" + this.getClass().getName() + "]: ");
89  //            System.out.println("getPhase(SinglePhaseTransducer): pr name[" + this.processingResource.getName() + "]" +
90  //                    " spt name: [" + spt.getName() + "]" +
91  //                    "] child count = " + this.getChildCount());
92          }
93          for (int i = 0; i < phases.size(); i++) {
94              PhaseModel phaseModel = (PhaseModel) phases.get(i);
95              if (phaseModel.containsSPT(spt)) {
96                  return phaseModel;
97              }
98          }
99  
100 //        Enumeration phaseEnum = this.children();
101 //        while(phaseEnum.hasMoreElements())
102 //        {
103 //            Object o = phaseEnum.nextElement();
104 //            if(o instanceof PhaseModel)
105 //            {
106 //                PhaseModel phase = (PhaseModel)o;
107 //                if(phase.containsSPT(spt))
108 //                {
109 //                    return phase;
110 //                }
111 //            }
112 //        }
113         return null;
114     }
115 
116 //    public Enumeration children()
117 //    {
118 //        List c = new ArrayList(children);
119 //        Collections.sort(c, new Comparator()
120 //        {
121 //            public int compare(Object o1, Object o2)
122 //            {
123 //                String name1 = ((PhaseModel) o1).getName();
124 //                String name2 = ((PhaseModel) o2).getName();
125 //                return name1.compareToIgnoreCase(name2);
126 //            }
127 //        });
128 //        return new Vector(c).elements();
129 //    }
130 
131     static MultiPhaseTransducer getMPTfromPR(ProcessingResource pr) {
132         if (!(pr instanceof gate.creole.Transducer)) {
133             return null;
134         }
135         try {
136             Batch batch = (Batch) ClassRipper.getFieldValue(pr, "batch");
137             gate.jape.Transducer tr = batch.getTransducer();
138             if (DebugLevel >= 4) {
139                 System.out.print("DEBUG [" + PrModel.class.getName() + "]: ");
140                 System.out.print("Batch Transducer: ");
141                 System.out.print("Name = [" + tr.getName() + "]");
142                 System.out.print("BaseUrl = [" + tr.getBaseURL() + "]");
143                 System.out.print("Class = [" + tr.getClass() + "]");
144                 System.out.print("\n");
145             }
146             if (null != tr && tr instanceof MultiPhaseTransducer) {
147                 return (MultiPhaseTransducer) tr;
148             } else {
149                 return null;
150             }
151         } catch (SecurityException e) {
152             e.printStackTrace();
153             return null;
154         } catch (IllegalArgumentException e) {
155             e.printStackTrace();
156             return null;
157         } catch (IllegalAccessException e) {
158             e.printStackTrace();
159             return null;
160         }
161     }
162 
163     public boolean equals(Object obj) {
164         if (obj instanceof PrModel) {
165             return this.processingResource.equals(((PrModel) obj).processingResource);
166         }
167         return super.equals(obj);
168     }
169 
170     class PRName {
171         private final ProcessingResource pr;
172 
173         public PRName(ProcessingResource pr) {
174             if (null == pr) {
175                 throw new RuntimeException("ProcessingResource is null!");
176             }
177             this.pr = pr;
178         }
179 
180         public String toString() {
181             if (null == this.pr.getName() || this.pr.getName().length() == 0) {
182                 return "Unnamed Resource";
183             } else {
184                 return this.pr.getName();
185             }
186         }
187 
188         public boolean equals(Object obj) {
189             if (null == obj || null == this.pr || null == this.pr.getName()) {
190                 return false;
191             }
192             if (obj instanceof String) {
193                 return this.pr.getName().equals(obj);
194             }
195             if (obj instanceof PRName) {
196                 return this.pr.getName().equals(((PRName) obj).pr.getName());
197             }
198             return false;
199         }
200     }
201 }
202