CorpusSaver.java
001 /*
002  *  CorpusSaver.java
003  *
004  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
005  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  *
007  *  This file is part of GATE (see http://gate.ac.uk/), and is free
008  *  software, licenced under the GNU Library General Public License,
009  *  Version 2, June 1991 (in the distribution as file licence.html,
010  *  and also available at http://gate.ac.uk/gate/licence.html).
011  *
012  *  Kalina Bontcheva, 22/Nov/2001
013  *
014  *  $Id: CorpusSaver.java 17662 2014-03-14 16:19:05Z markagreenwood $
015  */
016 
017 package gate.util;
018 
019 import java.io.File;
020 import java.text.NumberFormat;
021 import java.util.*;
022 
023 import gate.*;
024 import gate.creole.ExecutionException;
025 import gate.creole.ResourceInstantiationException;
026 
027 public class CorpusSaver {
028 
029   public CorpusSaver() {
030   }
031 
032   public void init() {
033     if (saveMode) {
034       File path = new File(dsPath);
035       try {
036        ds = Factory.openDataStore("gate.persist.SerialDataStore",
037                                   path.toURI().toURL().toString());
038       catch (Exception ex) {
039         throw new gate.util.GateRuntimeException(ex.getMessage());
040       }
041 
042       try {
043         Corpus corpus = Factory.newCorpus("bnc");
044         LanguageResource lr = ds.adopt(corpus);
045         ds.sync(lr);
046         theCorpus = (Corpuslr;
047       catch (Exception ex) {
048         throw new GateRuntimeException(ex.getMessage());
049       }
050     }
051 
052     if (processMode)
053       initPRs();
054 
055   }
056 
057   public void initPRs() {
058     if (applicationFile == null)
059       throw new GateRuntimeException("Application not set!");
060     
061     try {
062       Out.prln("App file is: " + applicationFile.getAbsolutePath());
063       application = (Controllergate.util.persistence.PersistenceManager
064                     .loadObjectFromFile(applicationFile);
065     }
066     catch (Exception ex) {
067       throw new GateRuntimeException("Corpus Benchmark Tool:" + ex.getMessage(), ex);
068     }
069   }//initPRs
070 
071   public void execute() {
072     execute(startDir);
073     try {
074       if (saveMode) {
075         ds.sync(theCorpus);
076         Factory.deleteResource(theCorpus);
077         if (ds != null)
078           ds.close();
079       }
080       if (application != null) {
081         Iterator<ProcessingResource> iter = new ArrayList<ProcessingResource>(application.getPRs()).iterator();
082         while (iter.hasNext())
083           Factory.deleteResource(iter.next());
084       }
085     catch (Exception ex) {
086       throw new GateRuntimeException(ex.getMessage());
087     }
088   }
089 
090   public void execute(File dir) {
091     if (dir == null || (saveMode && ds == null))
092       return;
093     //first set the current directory to be the given one
094     currDir = dir;
095     Out.prln("Processing directory: " + currDir);
096 
097     List<File> files = new ArrayList<File>();
098     List<File> dirs = new ArrayList<File>();
099     File[] dirArray = currDir.listFiles();
100     for (int i = 0; i < dirArray.length; i++) {
101       if (dirArray[i].isDirectory())
102         dirs.add(dirArray[i]);
103       else if (dirArray[i].isFile())
104         files.add(dirArray[i]);
105     }
106 
107     saveFiles(files);
108 
109     //if no more subdirs left, return
110     if (dirs.isEmpty())
111       return;
112 
113     //there are more subdirectories to traverse, so iterate through
114     for (int j = 0; j < dirs.size(); j++)
115       execute(dirs.get(j));
116 
117   }//execute(dir)
118 
119 
120   public static void main(String[] argsthrows GateException {
121     Gate.init();
122 
123 //MainFrame mFramew = new MainFrame();
124 //mFramew.setSize(800, 600);
125 //mFramew.setVisible(true);
126     
127     CorpusSaver corpusSaver1 = new CorpusSaver();
128 
129     if(args.length < 2)
130       throw new GateException("usage: [-process|-process_only] source_directory datastore_path application");
131     int i = 0;
132     while (i < args.length && args[i].startsWith("-")) {
133       if(args[i].equals("-process")) {
134         Out.prln("Processing and saving the corpus enabled. <P>");
135         corpusSaver1.setProcessMode(true);
136       else if (args[i].equals("-process_only")) {
137         Out.prln("Processing only enabled. <P>");
138         corpusSaver1.setSaveMode(false);
139         corpusSaver1.setProcessMode(true);
140       }
141       i++; //just ignore the option, which we do not recognise
142     }//while
143 
144     String dirName = args[i];
145     File dir = new File(dirName);
146     if (!dir.isDirectory())
147       throw new GateRuntimeException("Corpus directory should be "
148                                      "provided as a parameter");
149     if(corpusSaver1.getSaveMode()){
150       i++;
151       ifi >= args.length)
152         throw new GateRuntimeException("Datastore path not provided");
153   
154       if (corpusSaver1.getSaveMode()) {
155         String storagePath = args[i];
156         File storage = new File(storagePath);
157         if (!storage.isDirectory())
158           throw new GateRuntimeException("Please provide path to an existing "
159                                          "GATE serial datastore");
160         corpusSaver1.setDSPath(storagePath);
161       }
162     }
163     
164     //get the last argument which is the application
165     if (corpusSaver1.getProcessMode()) {
166       i++;
167       String appName = args[i];
168       File appFile = new File(appName);
169       if (!appFile.isFile())
170         throw new GateException("Please provide an existing GATE application");
171       else
172         corpusSaver1.setApplicationFile(appFile);
173     }
174 
175     Out.prln("Initialising GATE please wait...");
176     corpusSaver1.init();
177     corpusSaver1.setStartDir(dir);
178     Out.prln("Processing...");
179     double timeBefore = System.currentTimeMillis();
180     corpusSaver1.execute();
181     double timeAfter = System.currentTimeMillis();
182     Out.prln("Done in " +
183       NumberFormat.getInstance().format((timeAfter-timeBefore)/1000)
184       " seconds");
185 
186   }
187 
188   public void setStartDir(File newDir) {
189     startDir = newDir;
190   }
191 
192   public void setProcessMode(boolean mode) {
193     processMode = mode;
194   }
195 
196   public boolean getProcessMode() {
197     return processMode;
198   }
199 
200   public void setSaveMode(boolean mode) {
201     saveMode = mode;
202   }
203 
204   public boolean getSaveMode() {
205     return saveMode;
206   }
207 
208   public void setDSPath(String path){
209     dsPath = path;
210   }
211 
212   public void setApplicationFile(File newAppFile) {
213     applicationFile = newAppFile;
214   }
215 
216 
217   protected void saveFiles(List<File> files) {
218     if (files==null || files.isEmpty() ||
219         (saveMode && (theCorpus == null || ds == null)))
220       return;
221 
222     for(int i=0; i<files.size(); i++) {
223       try {
224         Document doc = Factory.newDocument(files.get(i).toURI().toURL());
225         doc.setName(Files.getLastPathComponent(files.get(i).toURI().toURL().toString()));
226         Out.prln("Storing document: " + doc.getName());
227         //first process it with ANNIE if in process mode
228         if (processMode)
229           processDocument(doc);
230 
231         //then store it in the DS and add to corpus
232         if (saveMode) {
233           Document lr = (Document)ds.adopt(doc);
234           theCorpus.add(lr);
235           theCorpus.unloadDocumentlr);
236 
237           if (lr != doc)
238             Factory.deleteResource(lr);
239         }
240         Factory.deleteResource(doc);
241       catch (Exception ex) {
242         throw new GateRuntimeException(ex.getClass() " " + ex.getMessage());
243       }
244     }//for
245   }//saveFiles
246 
247   protected void processDocument(Document doc) {
248     try {
249       if (application instanceof CorpusController) {
250         Corpus tempCorpus = Factory.newCorpus("temp");
251         tempCorpus.add(doc);
252         ((CorpusController)application).setCorpus(tempCorpus);
253         application.execute();
254         Factory.deleteResource(tempCorpus);
255         tempCorpus = null;
256       else {
257         Iterator<ProcessingResource> iter = application.getPRs().iterator();
258         while (iter.hasNext())
259           iter.next().setParameterValue("document", doc);
260         application.execute();
261       }
262     catch (ResourceInstantiationException ex) {
263       throw new RuntimeException("Error executing application: "
264                                     + ex.getMessage());
265     catch (ExecutionException ex) {
266       throw new RuntimeException("Error executing application: "
267                                     + ex.getMessage());
268     }
269   }
270 
271 
272   /**
273    * The directory from which we should generate/evaluate the corpus
274    */
275   private File startDir;
276   private File currDir;
277 
278   private DataStore ds;
279   private Corpus theCorpus;
280   private String dsPath = "d:\\bnc";
281   private Controller application = null;
282   private File applicationFile = null;
283 
284   private boolean processMode = false;
285   private boolean saveMode = true;
286 }