| Transducer.java |
1 /*
2 * Copyright (c) 1998-2004, The University of Sheffield.
3 *
4 * This file is part of GATE (see http://gate.ac.uk/), and is free
5 * software, licenced under the GNU Library General Public License,
6 * Version 2, June 1991 (in the distribution as file licence.html,
7 * and also available at http://gate.ac.uk/gate/licence.html).
8 *
9 * Valentin Tablan, 01 Feb 2000
10 *
11 * $Id: Transducer.java,v 1.26 2004/07/21 17:10:03 akshay Exp $
12 */
13
14 package gate.creole;
15
16 import gate.Resource;
17 import gate.jape.Batch;
18 import gate.jape.JapeException;
19
20 /**
21 * A cascaded multi-phase transducer using the Jape language which is a
22 * variant of the CPSL language.
23 */
24 public class Transducer extends AbstractLanguageAnalyser {
25
26 public static final String
27 TRANSD_DOCUMENT_PARAMETER_NAME = "document";
28
29 public static final String
30 TRANSD_INPUT_AS_PARAMETER_NAME = "inputASName";
31
32 public static final String
33 TRANSD_OUTPUT_AS_PARAMETER_NAME = "outputASName";
34
35 public static final String
36 TRANSD_ENCODING_PARAMETER_NAME = "encoding";
37
38 public static final String
39 TRANSD_GRAMMAR_URL_PARAMETER_NAME = "grammarURL";
40
41 /**
42 * Default constructor. Does nothing apart from calling the default
43 * constructor from the super class. The actual object initialisation is done
44 * via the {@link #init} method.
45 */
46 public Transducer() {
47 }
48
49 /*
50 private void writeObject(ObjectOutputStream oos) throws IOException {
51 Out.prln("writing transducer");
52 oos.defaultWriteObject();
53 Out.prln("finished writing transducer");
54 } // writeObject
55 */
56
57 /**
58 * This method is the one responsible for initialising the transducer. It
59 * assumes that all the needed parameters have been already set using the
60 * appropiate setXXX() methods.
61 *@return a reference to <b>this</b>
62 */
63 public Resource init() throws ResourceInstantiationException {
64 if(grammarURL != null && encoding != null){
65 try{
66 fireProgressChanged(0);
67 batch = new Batch(grammarURL, encoding, new InternalStatusListener());
68 if(enableDebugging != null) {
69 batch.setEnableDebugging(enableDebugging.booleanValue());
70 } else {
71 batch.setEnableDebugging(false);
72 }
73 batch.setOntology(ontology);
74 fireProcessFinished();
75 }catch(Exception e){
76 throw new ResourceInstantiationException(e);
77 }
78 } else
79 throw new ResourceInstantiationException (
80 "Both the URL (was " + grammarURL + ") and the encoding (was " +
81 encoding + ") are needed to create a JapeTransducer!"
82 );
83
84 batch.addProgressListener(new IntervalProgressListener(0, 100));
85
86 return this;
87 }
88
89 /**
90 * Implementation of the run() method from {@link java.lang.Runnable}.
91 * This method is responsible for doing all the processing of the input
92 * document.
93 */
94 public void execute() throws ExecutionException{
95 interrupted = false;
96 if(document == null) throw new ExecutionException("No document provided!");
97 if(inputASName != null && inputASName.equals("")) inputASName = null;
98 if(outputASName != null && outputASName.equals("")) outputASName = null;
99 try{
100 batch.transduce(document,
101 inputASName == null ?
102 document.getAnnotations() :
103 document.getAnnotations(inputASName),
104 outputASName == null ?
105 document.getAnnotations() :
106 document.getAnnotations(outputASName));
107 }catch(JapeException je){
108 throw new ExecutionException(je);
109 }
110 }
111
112
113 /**
114 * Notifies all the PRs in this controller that they should stop their
115 * execution as soon as possible.
116 */
117 public synchronized void interrupt(){
118 interrupted = true;
119 batch.interrupt();
120 }
121 /**
122 * Sets the grammar to be used for building this transducer.
123 * @param newGrammarURL an URL to a file containing a Jape grammar.
124 */
125 public void setGrammarURL(java.net.URL newGrammarURL) {
126 grammarURL = newGrammarURL;
127 }
128
129 /**
130 * Gets the URL to the grammar used to build this transducer.
131 * @return a {@link java.net.URL} pointing to the grammar file.
132 */
133 public java.net.URL getGrammarURL() {
134 return grammarURL;
135 }
136
137 /**
138 *
139 * Sets the encoding to be used for reding the input file(s) forming the Jape
140 * grammar. Note that if the input grammar is a multi-file one than the same
141 * encoding will be used for reding all the files. Multi file grammars with
142 * different encoding across the composing files are not supported!
143 * @param newEncoding a {link String} representing the encoding.
144 */
145 public void setEncoding(String newEncoding) {
146 encoding = newEncoding;
147 }
148
149 /**
150 * Gets the encoding used for reding the grammar file(s).
151 */
152 public String getEncoding() {
153 return encoding;
154 }
155
156 /**
157 * Sets the {@link gate.AnnotationSet} to be used as input for the transducer.
158 * @param newInputASName a {@link gate.AnnotationSet}
159 */
160 public void setInputASName(String newInputASName) {
161 inputASName = newInputASName;
162 }
163
164 /**
165 * Gets the {@link gate.AnnotationSet} used as input by this transducer.
166 * @return a {@link gate.AnnotationSet}
167 */
168 public String getInputASName() {
169 return inputASName;
170 }
171
172 /**
173 * Sets the {@link gate.AnnotationSet} to be used as output by the transducer.
174 * @param newOutputASName a {@link gate.AnnotationSet}
175 */
176 public void setOutputASName(String newOutputASName) {
177 outputASName = newOutputASName;
178 }
179
180 /**
181 * Gets the {@link gate.AnnotationSet} used as output by this transducer.
182 * @return a {@link gate.AnnotationSet}
183 */
184 public String getOutputASName() {
185 return outputASName;
186 }
187
188 public Boolean getEnableDebugging() {
189 return enableDebugging;
190 }
191
192 public void setEnableDebugging(Boolean enableDebugging) {
193 this.enableDebugging = enableDebugging;
194 }
195
196 /**
197 * The URL to the jape file used as grammar by this transducer.
198 */
199 private java.net.URL grammarURL;
200
201
202 /**
203 * The actual JapeTransducer used for processing the document(s).
204 */
205 protected Batch batch;
206
207 /**
208 * The encoding used for reding the grammar file(s).
209 */
210 private String encoding;
211
212 /**
213 * The {@link gate.AnnotationSet} used as input for the transducer.
214 */
215 private String inputASName;
216
217 /**
218 * The {@link gate.AnnotationSet} used as output by the transducer.
219 */
220 private String outputASName;
221
222 /**
223 * The ontology that will be available on the RHS of JAPE rules.
224 */
225 private gate.creole.ontology.Ontology ontology;
226
227 /**
228 * Gets the ontology used by this transducer.
229 * @return an {@link gate.creole.ontology.Ontology} value.
230 */
231 public gate.creole.ontology.Ontology getOntology() {
232 return ontology;
233 }
234
235 /**
236 * Sets the ontology used by this transducer.
237 * @param ontology an {@link gate.creole.ontology.Ontology} value.
238 */
239 public void setOntology(gate.creole.ontology.Ontology ontology) {
240 this.ontology = ontology;
241 }
242
243
244 /**
245 * A switch used to activate the JAPE debugger.
246 */
247 private Boolean enableDebugging;
248 }