|
MultiPhaseTransducer |
|
1 /* 2 * MultiPhaseTransducer.java - transducer class 3 * 4 * Copyright (c) 1998-2001, The University of Sheffield. 5 * 6 * This file is part of GATE (see http://gate.ac.uk/), and is free 7 * software, licenced under the GNU Library General Public License, 8 * Version 2, June 1991 (in the distribution as file licence.html, 9 * and also available at http://gate.ac.uk/gate/licence.html). 10 * 11 * Hamish Cunningham, 24/07/98 12 * 13 * $Id: MultiPhaseTransducer.java,v 1.20 2001/09/28 15:45:23 valyt Exp $ 14 */ 15 16 17 package gate.jape; 18 19 import java.util.*; 20 21 22 import gate.annotation.*; 23 import gate.event.*; 24 import gate.util.*; 25 import gate.creole.*; 26 import gate.*; 27 28 29 /** 30 * Represents a complete CPSL grammar, with a phase name, options and 31 * rule set (accessible by name and by sequence). 32 * Implements a transduce method taking a Document as input. 33 * Constructs from String or File. 34 */ 35 public class MultiPhaseTransducer extends Transducer 36 implements JapeConstants, java.io.Serializable 37 { 38 /** Debug flag */ 39 private static final boolean DEBUG = false; 40 41 /** Construction from name. */ 42 public MultiPhaseTransducer(String name) { 43 this(); 44 setName(name); 45 } // constr from name 46 47 /** 48 * Notifies this PR that it should stop its execution as soon as possible. 49 */ 50 public synchronized void interrupt(){ 51 interrupted = true; 52 Iterator phasesIter = phases.iterator(); 53 while(phasesIter.hasNext()){ 54 ((Transducer)phasesIter.next()).interrupt(); 55 } 56 } 57 58 59 /** Anonymous construction */ 60 public MultiPhaseTransducer() { 61 phases = new ArrayList(); 62 } // anon construction 63 64 /** Set the name. */ 65 public void setName(String name) { this.name = name; } 66 67 /** The SinglePhaseTransducers that make up this one. 68 * Keyed by their phase names. 69 */ 70 private ArrayList phases; 71 72 73 /** Add phase. */ 74 public void addPhase(String name, Transducer phase) { 75 //Debug.pr(this, "MPT: adding " + name + Debug.getNl()); 76 phases.add(phase); 77 } // addPhase 78 79 /** Change the phase order to the one specified in a list of names. */ 80 public void orderPhases(String[] phaseNames) { 81 Err.println("oops: MPT.orderPhases not done yet :-("); 82 /* 83 // for each phaseName 84 // destructively get the phase and add to new array map 85 // errors: any phaseName not in phases, 86 HashMap newPhaseMap = new HashMap(); 87 for(int i=0; i<phaseNames.length; i++) { 88 Transducer t = (Transducer) phases.remove(phaseNames[i]); 89 if(t == null) { 90 // ERROR 91 } 92 else { 93 newPhaseMap.add(t); 94 } 95 } 96 phases = newPhaseMap; 97 */ 98 } // orderPhases 99 100 101 /** Finish: replace dynamic data structures with Java arrays; called 102 * after parsing. 103 */ 104 public void finish() { 105 for(Iterator i = phases.iterator(); i.hasNext(); ) 106 ((Transducer) i.next()).finish(); 107 } // finish 108 109 110 /** Transduce the document by running each phase in turn. */ 111 public void transduce(Document doc, AnnotationSet input, 112 AnnotationSet output) throws JapeException, 113 ExecutionException { 114 115 interrupted = false; 116 ProgressListener pListener = null; 117 StatusListener sListener = null; 118 pListener = new ProgressListener(){ 119 public void processFinished(){ 120 donePhases ++; 121 if(donePhases == phasesCnt) fireProcessFinished(); 122 } 123 124 public void progressChanged(int i){ 125 int value = (donePhases * 100 + i)/phasesCnt; 126 fireProgressChanged(value); 127 } 128 129 int phasesCnt = phases.size(); 130 int donePhases = 0; 131 }; 132 133 sListener = new StatusListener(){ 134 public void statusChanged(String text){ 135 fireStatusChanged(text); 136 } 137 }; 138 139 for(Iterator i = phases.iterator(); i.hasNext(); ) { 140 Transducer t = (Transducer) i.next(); 141 142 if(isInterrupted()) throw new ExecutionInterruptedException( 143 "The execution of the \"" + getName() + 144 "\" Jape transducer has been abruptly interrupted!"); 145 146 try { 147 fireStatusChanged("Transducing " + doc.getName() + 148 " (Phase: " + t.getName() + ")..."); 149 t.addProgressListener(pListener); 150 t.addStatusListener(sListener); 151 152 t.transduce(doc, input, output); 153 t.removeProgressListener(pListener); 154 t.removeStatusListener(sListener); 155 fireStatusChanged(""); 156 } catch(JapeException e) { 157 String errorMessage = new String( 158 "Error transducing document " + doc.getSourceUrl() + 159 ", phase " + t.getName() + Strings.getNl() + e.getMessage() 160 ); 161 throw(new JapeException(errorMessage)); 162 } 163 } 164 165 cleanUp(); 166 } // transduce 167 168 /** Ask each phase to clean up (delete action class files, for e.g.). */ 169 public void cleanUp() { 170 171 for(Iterator i = phases.iterator(); i.hasNext(); ) 172 ((Transducer) i.next()).cleanUp(); 173 174 } // cleanUp 175 176 /** Create a string representation of the object. */ 177 public String toString() { return toString(""); } 178 179 /** Create a string representation of the object. */ 180 public String toString(String pad) { 181 String newline = Strings.getNl(); 182 183 StringBuffer buf = new StringBuffer( 184 pad + "MPT: name(" + name + "); phases(" + newline + pad 185 ); 186 187 for(Iterator i = phases.iterator(); i.hasNext(); ) 188 buf.append( 189 ((Transducer) i.next()).toString( 190 Strings.addPadding(pad, INDENT_PADDING) 191 ) + " " 192 ); 193 194 buf.append(newline + pad + ")." + newline); 195 196 return buf.toString(); 197 } // toString 198 199 //needed by FSM 200 public ArrayList getPhases(){ return phases; } 201 202 } // class MultiPhaseTransducer 203 204 205 206 // $Log: MultiPhaseTransducer.java,v $ 207 // Revision 1.20 2001/09/28 15:45:23 valyt 208 // 209 // All the PRs are now more or less interruptible 210 // 211 // THE STOP BUTTON shows its face when needed. 212 // 213 // Revision 1.19 2001/09/25 12:04:03 kalina 214 // I commented out temporarily the no events in batch mode code as it was 215 // not working completely correctly, so I want to reinstate it only after 216 // it's fully functional. All tests seems OK on a clean version (well, same 217 // mistakes as today due to the feature comparison stuff). 218 // 219 // Revision 1.18 2001/09/13 12:09:50 kalina 220 // Removed completely the use of jgl.objectspace.Array and such. 221 // Instead all sources now use the new Collections, typically ArrayList. 222 // I ran the tests and I ran some documents and compared with keys. 223 // JAPE seems to work well (that's where it all was). If there are problems 224 // maybe look at those new structures first. 225 // 226 // Revision 1.17 2001/09/12 15:24:44 kalina 227 // Made the batchMode flag in Main public. This is now checked before 228 // events are fired and listeners created. No bugs in tests or anywhere else 229 // yet. To disable events, set batchMode to true in your batch code. By default 230 // it is false, because some batch code e.g., MUSE, use events for progress 231 // indication. Not having events does give some small performance gains, but 232 // not much. 233 // 234 // Revision 1.16 2001/05/17 11:50:41 valyt 235 // 236 // Factory now handles Runtime parameters as well as inittime ones. 237 // 238 // There is a new rule application style Appelt-shortest 239 // 240 // Revision 1.15 2001/05/16 19:03:45 valyt 241 // 242 // Added a new option for jape in order to allow the use of the shortest match in appelt rules 243 // 244 // Revision 1.14 2001/04/30 16:56:32 valyt 245 // 246 // 247 // Unification of the NAME attribute implementation. 248 // 249 // Revision 1.13 2001/04/17 18:18:06 valyt 250 // 251 // events for jape & applications 252 // 253 // Revision 1.12 2001/03/06 20:11:14 valyt 254 // 255 // <b><em><strong>DOCUMENTATION</></></> for most of the GUI classes. 256 // 257 // Cleaned up some obsolete classes 258 // 259 // Revision 1.11 2001/01/21 20:51:31 valyt 260 // Added the DocumentEditor class and the necessary changes to the gate API 261 // 262 // Revision 1.10 2000/11/08 16:35:03 hamish 263 // formatting 264 // 265 // Revision 1.9 2000/10/26 10:45:30 oana 266 // Modified in the code style 267 // 268 // Revision 1.8 2000/10/18 13:26:47 hamish 269 // Factory.createResource now working, with a utility method that uses reflection (via java.beans.Introspector) to set properties on a resource from the 270 // parameter list fed to createResource. 271 // resources may now have both an interface and a class; they are indexed by interface type; the class is used to instantiate them 272 // moved createResource from CR to Factory 273 // removed Transients; use Factory instead 274 // 275 // Revision 1.7 2000/10/16 16:44:34 oana 276 // Changed the comment of DEBUG variable 277 // 278 // Revision 1.6 2000/10/10 15:36:36 oana 279 // Changed System.out in Out and System.err in Err; 280 // Added the DEBUG variable seted on false; 281 // Added in the header the licence; 282 // 283 // Revision 1.5 2000/07/12 14:19:19 valyt 284 // Testing CVS 285 // 286 // Revision 1.4 2000/07/04 14:37:39 valyt 287 // Added some support for Jape-ing in a different annotations et than the default one; 288 // Changed the L&F for the JapeGUI to the System default 289 // 290 // Revision 1.3 2000/07/03 21:00:59 valyt 291 // Added StatusBar and ProgressBar support for tokenisation & Jape transduction 292 // (it looks great :) ) 293 // 294 // Revision 1.2 2000/04/14 18:02:46 valyt 295 // Added some gate.fsm classes 296 // added some accessor function in old jape classes 297 // 298 // Revision 1.1 2000/02/23 13:46:08 hamish 299 // added 300 // 301 // Revision 1.1.1.1 1999/02/03 16:23:02 hamish 302 // added gate2 303 // 304 // Revision 1.10 1998/11/01 21:21:39 hamish 305 // use Java arrays in transduction where possible 306 // 307 // Revision 1.9 1998/10/06 16:14:59 hamish 308 // phase ordering prob fixed; made phases an array 309 // 310 // Revision 1.8 1998/10/01 16:06:33 hamish 311 // new appelt transduction style, replacing buggy version 312 // 313 // Revision 1.7 1998/09/26 09:19:17 hamish 314 // added cloning of PE macros 315 // 316 // Revision 1.6 1998/09/18 13:35:59 hamish 317 // made Transducer a class 318 // 319 // Revision 1.5 1998/08/19 20:21:40 hamish 320 // new RHS assignment expression stuff added 321 // 322 // Revision 1.4 1998/08/12 15:39:39 hamish 323 // added padding toString methods 324 // 325 // Revision 1.3 1998/08/10 14:16:37 hamish 326 // fixed consumeblock bug and added batch.java 327 // 328 // Revision 1.2 1998/08/07 16:39:17 hamish 329 // parses, transduces. time for a break 330 // 331 // Revision 1.1 1998/08/07 16:18:45 hamish 332 // parser pretty complete, with backend link done 333
|
MultiPhaseTransducer |
|