1   /*
2    *  Copyright (c) 1998-2001, 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.17 2001/10/29 13:37:30 valyt Exp $
12   */
13  
14  package gate.creole;
15  
16  import gate.creole.*;
17  import gate.*;
18  import gate.util.*;
19  import gate.jape.*;
20  
21  import java.net.*;
22  import gate.event.*;
23  import java.util.*;
24  import java.io.*;
25  
26  /**
27   * A cascaded multi-phase transducer using the Jape language which is a
28   * variant of the CPSL language.
29   */
30  public class Transducer extends AbstractLanguageAnalyser {
31  
32    /**
33     * Default constructor. Does nothing apart from calling the default
34     * constructor from the super class. The actual object initialisation is done
35     * via the {@link #init} method.
36     */
37    public Transducer() {
38    }
39  
40    /*
41    private void writeObject(ObjectOutputStream oos) throws IOException {
42      Out.prln("writing transducer");
43      oos.defaultWriteObject();
44      Out.prln("finished writing transducer");
45    } // writeObject
46    */
47  
48    /**
49     * This method is the one responsible for initialising the transducer. It
50     * assumes that all the needed parameters have been already set using the
51     * appropiate setXXX() methods.
52     *@return a reference to <b>this</b>
53     */
54    public Resource init() throws ResourceInstantiationException {
55      if(grammarURL != null && encoding != null){
56        try{
57          fireProgressChanged(0);
58          batch = new Batch(grammarURL, encoding, new InternalStatusListener());
59          fireProcessFinished();
60        }catch(JapeException je){
61          throw new ResourceInstantiationException(je);
62        }
63      } else
64        throw new ResourceInstantiationException (
65          "Both the URL (was " + grammarURL + ") and the encoding (was " +
66          encoding + ") are needed to create a JapeTransducer!"
67        );
68  
69        batch.addProgressListener(new IntervalProgressListener(0, 100));
70  
71      return this;
72    }
73  
74    /**
75     * Implementation of the run() method from {@link java.lang.Runnable}.
76     * This method is responsible for doing all the processing of the input
77     * document.
78     */
79    public void execute() throws ExecutionException{
80      interrupted = false;
81      if(document == null) throw new ExecutionException("No document provided!");
82      if(inputASName != null && inputASName.equals("")) inputASName = null;
83      if(outputASName != null && outputASName.equals("")) outputASName = null;
84      try{
85        batch.transduce(document,
86                        inputASName == null ?
87                          document.getAnnotations() :
88                          document.getAnnotations(inputASName),
89                        outputASName == null ?
90                          document.getAnnotations() :
91                          document.getAnnotations(outputASName));
92      }catch(JapeException je){
93        throw new ExecutionException(je);
94      }
95    }
96  
97  
98    /**
99     * Notifies all the PRs in this controller that they should stop their
100    * execution as soon as possible.
101    */
102   public synchronized void interrupt(){
103     interrupted = true;
104     batch.interrupt();
105   }
106   /**
107    * Sets the grammar to be used for building this transducer.
108    * @param newGrammarURL an URL to a file containing a Jape grammar.
109    */
110   public void setGrammarURL(java.net.URL newGrammarURL) {
111     grammarURL = newGrammarURL;
112   }
113 
114   /**
115    * Gets the URL to the grammar used to build this transducer.
116    * @return a {@link java.net.URL} pointing to the grammar file.
117    */
118   public java.net.URL getGrammarURL() {
119     return grammarURL;
120   }
121 
122   /**
123    *
124    * Sets the encoding to be used for reding the input file(s) forming the Jape
125    * grammar. Note that if the input grammar is a multi-file one than the same
126    * encoding will be used for reding all the files. Multi file grammars with
127    * different encoding across the composing files are not supported!
128    * @param newEncoding a {link String} representing the encoding.
129    */
130   public void setEncoding(String newEncoding) {
131     encoding = newEncoding;
132   }
133 
134   /**
135    * Gets the encoding used for reding the grammar file(s).
136    */
137   public String getEncoding() {
138     return encoding;
139   }
140 
141   /**
142    * Sets the {@link gate.AnnotationSet} to be used as input for the transducer.
143    * @param newInputAS a {@link gate.AnnotationSet}
144    */
145   public void setInputASName(String newInputASName) {
146     inputASName = newInputASName;
147   }
148 
149   /**
150    * Gets the {@link gate.AnnotationSet} used as input by this transducer.
151    * @return a {@link gate.AnnotationSet}
152    */
153   public String getInputASName() {
154     return inputASName;
155   }
156 
157   /**
158    * Sets the {@link gate.AnnotationSet} to be used as output by the transducer.
159    * @param newOutputAS a {@link gate.AnnotationSet}
160    */
161   public void setOutputASName(String newOutputASName) {
162     outputASName = newOutputASName;
163   }
164 
165   /**
166    * Gets the {@link gate.AnnotationSet} used as output by this transducer.
167    * @return a {@link gate.AnnotationSet}
168    */
169   public String getOutputASName() {
170     return outputASName;
171   }
172 
173   /**
174    * The URL to the jape file used as grammar by this transducer.
175    */
176   private java.net.URL grammarURL;
177 
178 
179   /**
180    * The actual JapeTransducer used for processing the document(s).
181    */
182   private Batch batch;
183 
184   /**
185    * The encoding used for reding the grammar file(s).
186    */
187   private String encoding;
188 
189   /**
190    * The {@link gate.AnnotationSet} used as input for the transducer.
191    */
192   private String inputASName;
193 
194   /**
195    * The {@link gate.AnnotationSet} used as output by the transducer.
196    */
197   private String outputASName;
198 }