package info.ephyra.answerselection.filters; import info.ephyra.io.MsgPrinter; import info.ephyra.search.Result; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.ObjectInputStream; import java.util.ArrayList; /** * <p>The <code>DeserializationFilter</code> reads serialized results from one * or more files.</p> * * <p>This class extends the class <code>Filter</code>.</p> * * @author Nico Schlaefer * @version 2007-05-24 */ public class DeserializationFilter extends Filter { /** Input file with serialized results. */ private static File[] serialFiles; // Getters/Setters public static File[] getSerialFiles() { return serialFiles; } public static void setSerialFiles(File[] serialFiles) { DeserializationFilter.serialFiles = serialFiles; } /** * Adds an input file with serialized results. * * @param serialFile input file with serialized results */ public static void addSerialFile(File serialFile) { File[] newFiles; if (serialFiles != null) { newFiles = new File[serialFiles.length + 1]; for (int i = 0; i < serialFiles.length; i++) newFiles[i] = serialFiles[i]; } else { newFiles = new File[1]; } newFiles[newFiles.length - 1] = serialFile; serialFiles = newFiles; } /** * Clears the input files with serialized results. */ public static void clearSerialFiles() { serialFiles = null; } /** * Filters an array of <code>Result</code> objects. * * @param results results to filter * @return filtered results */ public Result[] apply(Result[] results) { // any input file set? if (serialFiles == null || serialFiles.length == 0) return results; // keep old results ArrayList<Result> resultsL = new ArrayList<Result>(); for (Result result : results) resultsL.add(result); // deserialize and add results for (File serialFile : serialFiles) { // input file exists? if (!serialFile.exists()) continue; try { FileInputStream fis = new FileInputStream(serialFile); ObjectInputStream ois = new ObjectInputStream(fis); try { while (true) { Object o = ois.readObject(); if (o instanceof Result) { Result result = (Result) o; resultsL.add(result); } } } catch (EOFException e) {/* end of file reached */} ois.close(); } catch (Exception e) { MsgPrinter.printErrorMsg("Could not read serialized results:"); MsgPrinter.printErrorMsg(e.toString()); System.exit(1); } } return resultsL.toArray(new Result[resultsL.size()]); } }