package experiments.evaluation;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
public class FilePreProcessing {
private File qrels;
private File result;
private BufferedReader readerQrels;
private BufferedReader readerResult;
private Query query;
private WorkingChain chain;
private String lastQrelsLine;
private String lastResultLine;
private FileInputStream fis;
private UnicodeBOMInputStream ubis;
private InputStreamReader isr;
public FilePreProcessing(String qrels, String result, WorkingChain chain)
throws NullPointerException, IOException {
System.out.println(qrels);
System.out.println(result);
this.qrels = new File(qrels);
this.result = new File(result);
this.chain = chain;
if (!this.qrels.exists() || !this.result.exists()) {
throw new FileNotFoundException();
}
fis = new FileInputStream(qrels);
ubis = new UnicodeBOMInputStream(fis);
isr = new InputStreamReader(ubis);
readerQrels = new BufferedReader(isr);
fis = new FileInputStream(result);
ubis = new UnicodeBOMInputStream(fis);
isr = new InputStreamReader(ubis);
readerResult = new BufferedReader(isr);
}
public void process() throws IOException, LineParsingException {
while (true) {
boolean qrels = processQrels();
boolean result = processResult();
if (!qrels || !result) {
if (query != null) {
chain.work(query);
}
break;
} else {
chain.work(query);
}
}
}
private boolean processQrels() throws IOException, LineParsingException {
int qryNr = 0;
query = new Query();
// Read In Last line
if (lastQrelsLine != null) {
String[] optStr = checkQrelsLine(lastQrelsLine);
CorrectEntry ce = new CorrectEntry(optStr[2],
Integer.parseInt(optStr[3]));
this.query.addCorrectEntry(ce);
qryNr = Integer.valueOf(optStr[0]);
this.query.setQryNr(qryNr);
} else {
String currentLine = null;
// First Lineread to save Queryid!
currentLine = readerQrels.readLine();
String[] optStr = checkQrelsLine(currentLine);
CorrectEntry ce = new CorrectEntry(optStr[2],
Integer.parseInt(optStr[3]));
this.query.addCorrectEntry(ce);
qryNr = Integer.parseInt(optStr[0]);
this.query.setQryNr(qryNr);
}
String currentLine = null;
while ((currentLine = readerQrels.readLine()) != null) {
String[] optStr = checkQrelsLine(currentLine);
if (Integer.valueOf(optStr[0]) != qryNr) {
break;
}
CorrectEntry ce = new CorrectEntry(optStr[2],
Integer.parseInt(optStr[3]));
this.query.addCorrectEntry(ce);
}
if (currentLine == null) {
return false;
} else {
lastQrelsLine = currentLine;
}
return true;
}
private boolean processResult() throws IOException, LineParsingException {
int qryNr = 0;
// End of File Check
if (lastResultLine != null) {
String[] optStr = checkResultLine(lastResultLine);
if (query.getQryNr() < Integer.valueOf(optStr[0])) {
return true;
}
ResultEntry re = new ResultEntry(optStr[2],
Double.parseDouble(optStr[4]));
this.query.addResultEntry(re);
qryNr = Integer.parseInt(optStr[0]);
} else {
String currentLine = null;
currentLine = readerResult.readLine();
String[] optStr = checkResultLine(currentLine);
if (query.getQryNr() < Integer.valueOf(optStr[0])) {
System.out.println(currentLine);
return true;
}
ResultEntry re = new ResultEntry(optStr[2],
Double.parseDouble(optStr[4]));
this.query.addResultEntry(re);
qryNr = Integer.parseInt(optStr[0]);
}
String currentLine = null;
while ((currentLine = readerResult.readLine()) != null) {
String[] optStr = checkResultLine(currentLine);
if (Integer.valueOf(optStr[0]) != qryNr) {
break;
}
ResultEntry re = new ResultEntry(optStr[2],
Double.parseDouble(optStr[4]));
this.query.addResultEntry(re);
}
if (currentLine == null) {
return false;
} else {
lastResultLine = currentLine;
}
return true;
}
// 2 verschiedene Methoden, falls zusätzliche Kriterien auszuwerten sind.
// Bisher sind die Methoden allerdings noch identisch.
private String[] checkQrelsLine(String line) {
String[] splitter = line.split(" ");
List<String> result = new LinkedList<String>();
for (int i = 0; i < splitter.length; i++) {
if (splitter[i] != null && !splitter[i].equalsIgnoreCase("")
&& !splitter[i].equalsIgnoreCase(" ")) {
result.add(splitter[i]);
}
}
if (result.size() == 0) {
return null;
}
String[] res = new String[result.size()];
return result.toArray(res);
}
private String[] checkResultLine(String line) {
String[] splitter = line.split(" ");
List<String> result = new LinkedList<String>();
for (int i = 0; i < splitter.length; i++) {
if (splitter[i] != null && !splitter[i].equalsIgnoreCase("")
&& !splitter[i].equalsIgnoreCase(" ")) {
result.add(splitter[i]);
}
}
if (result.size() == 0) {
return null;
}
String[] res = new String[result.size()];
return result.toArray(res);
}
public void close() {
try {
if (fis != null) {
fis.close();
}
if (ubis != null) {
ubis.close();
}
if (isr != null) {
isr.close();
}
if (readerQrels != null) {
readerQrels.close();
}
if (readerResult != null) {
readerResult.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}