package info.ephyra.io;
import info.ephyra.answerselection.filters.Filter;
import info.ephyra.nlp.semantics.Predicate;
import info.ephyra.querygeneration.Query;
import info.ephyra.questionanalysis.QuestionInterpretation;
import info.ephyra.search.Result;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
/**
* <p>Prints out status and error messages as well as results to the standard
* output. The output of status and error messages can be enabled or disabled.
* By default, all status and error messages are disabled.</p>
*
* <p>All print methods are thread-save to avoid overlapping outputs from
* different threads.</p>
*
* @author Nico Schlaefer
* @version 2007-07-14
*/
public class MsgPrinter {
/** True, iff status messages are enabled. */
private static boolean statusMsgs;
/** True, iff error messages are enabled. */
private static boolean errorMsgs;
/**
* Enables or disables status messages.
*
* @param enable <code>true</code> to enable status messages,
* <code>false</code> to disable them
*/
public static void enableStatusMsgs(boolean enable) {
statusMsgs = enable;
}
/**
* Enables or disables error messages.
*
* @param enable <code>true</code> to enable error messages,
* <code>false</code> to disable them
*/
public static void enableErrorMsgs(boolean enable) {
errorMsgs = enable;
}
/**
* Prints out an arbitrary status message.
*
* @param status a status message
*/
public static synchronized void printStatusMsg(String status) {
if (statusMsgs) printMessage(status);
}
/**
* Prints out an arbitrary status message with a timestamp.
*
* @param status a status message
*/
public static synchronized void printStatusMsgTimestamp(String status) {
if (statusMsgs) printStatusMsg(status + " (" + getTimestamp() + ")");
}
/**
* Prints out a target.
*
* @param target a target
*/
public static synchronized void printTarget(String target) {
if (statusMsgs) {
target = "Target: " + target;
String line = "";
for (int i = 0; i < target.length(); i++) line += "=";
printMessage("\n" + line);
printMessage(target);
printMessage(line);
}
}
/**
* Prints out a question.
*
* @param question a question
*/
public static synchronized void printQuestion(String question) {
if (statusMsgs) {
question = "Question: " + question;
String line = "";
for (int i = 0; i < question.length(); i++) line += "-";
printMessage("\n" + line);
printMessage(question);
printMessage(line);
}
}
/**
* Prints out the status message that the engine is in the initialization
* phase.
*/
public static synchronized void printInitializing() {
if (statusMsgs) printMessage("+++++ Initializing engine (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that the engine is in the coreference
* resolution phase.
*/
public static synchronized void printResolvingCoreferences() {
if (statusMsgs) printMessage("\n+++++ Resolving Coreferences (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that the engine is in the question analysis
* phase.
*/
public static synchronized void printAnalyzingQuestion() {
if (statusMsgs) printMessage("\n+++++ Analyzing question (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that the engine is in the query generation
* phase.
*/
public static synchronized void printGeneratingQueries() {
if (statusMsgs) printMessage("\n+++++ Generating queries (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that the engine is in the search phase.
*/
public static synchronized void printSearching() {
if (statusMsgs) printMessage("\n+++++ Searching (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that the engine is in the answer selection
* phase.
*/
public static synchronized void printSelectingAnswers() {
if (statusMsgs) printMessage("\n+++++ Selecting Answers (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that the TREC data is being loaded.
*/
public static synchronized void printLoadingTRECData() {
if (statusMsgs)
printMessage("\n+++++ Loading TREC data (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that the questions are being interpreted.
*/
public static synchronized void printInterpretingQuestions() {
if (statusMsgs)
printMessage("\n+++++ Interpreting questions (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that queries are being formed.
*/
public static synchronized void printFormingQueries() {
if (statusMsgs) printMessage("\n+++++ Forming queries (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that text passages are being fetched.
*/
public static synchronized void printFetchingPassages() {
if (statusMsgs) printMessage("\n+++++ Fetching passages (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that patterns are being extracted.
*/
public static synchronized void printExtractingPatterns() {
if (statusMsgs) printMessage("\n+++++ Extracting patterns (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that patterns are being saved.
*/
public static synchronized void printSavingPatterns() {
if (statusMsgs) printMessage("\n+++++ Saving patterns (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that patterns are being loaded.
*/
public static synchronized void printLoadingPatterns() {
if (statusMsgs) printMessage("\n+++++ Loading patterns (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that patterns are being assessed.
*/
public static synchronized void printAssessingPatterns() {
if (statusMsgs) printMessage("\n+++++ Assessing patterns (" + getTimestamp() + ") +++++");
}
/**
* Prints out the status message that patterns are being filtered.
*/
public static synchronized void printFilteringPatterns() {
if (statusMsgs) printMessage("\n+++++ Filtering patterns (" + getTimestamp() + ") +++++");
}
/**
* Prints out the question string.
*
* @param qs question string
*/
public static synchronized void printQuestionString(String qs) {
if (statusMsgs) printMessage("\nQuestion: " + qs);
}
/**
* Prints out the question string with resolved coreferences.
*
* @param res resolved question string
*/
public static synchronized void printResolvedQuestion(String res) {
if (statusMsgs) printMessage("\nResolved question: " + res);
}
/**
* Prints out the normalization of a question.
*
* @param qn question normalization
*/
public static synchronized void printNormalization(String qn) {
if (statusMsgs) printMessage("Normalization: " + qn);
}
/**
* Prints out the answer types.
*
* @param ats answer types
*/
public static synchronized void printAnswerTypes(String[] ats) {
if (statusMsgs) {
printMessage("\nAnswer types:");
if (ats.length == 0) printMessage("-");
for (String at : ats) printMessage(at);
}
}
/**
* Prints out the interpretations of a question.
*
* @param qis <code>QuestionInterpretation</code> array
*/
public static synchronized void printInterpretations(
QuestionInterpretation[] qis) {
if (statusMsgs) {
printMessage("\nInterpretations:");
if (qis.length == 0) printMessage("-");
for (QuestionInterpretation qi : qis) {
printMessage(qi.toString());
}
}
}
/**
* Prints out the predicates in a question.
*
* @param ps <code>Predicate</code> array
*/
public static synchronized void printPredicates(Predicate[] ps) {
if (statusMsgs) {
printMessage("\nPredicates:");
if (ps.length == 0) printMessage("-");
for (Predicate p : ps) {
printMessage(p.toStringMultiLine());
}
}
}
/**
* Prints out query strings.
*
* @param queries <code>Query</code> objects
*/
public static synchronized void printQueryStrings(Query[] queries) {
if (statusMsgs) {
printMessage("Query strings:");
for (Query query : queries)
printMessage(query.getQueryString());
}
}
/**
* Prints out the status message that a filter has started its work in the
* answer selection phase, plus the number of results passed to the filter.
*
* @param filter the filter that has just started its work
* @param resCount the number of results passed to the filter
*/
public static synchronized void printFilterStarted(Filter filter,
int resCount) {
if (statusMsgs && (filter != null)) {
String filterName = filter.getClass().getName();
filterName = filterName.substring(filterName.lastIndexOf(".") + 1);
printMessage("Filter \"" + filterName + "\" started, " + resCount +
" Results (" + getTimestamp() + ")");
}
}
/**
* Prints out the status message that a filter has finished its work in the
* answer selection phase, plus the number of remaining results.
*
* @param filter the filter that has just finished its work
* @param resCount the number of remaining results
*/
public static synchronized void printFilterFinished(Filter filter,
int resCount) {
if (statusMsgs && (filter != null)) {
String filterName = filter.getClass().getName();
filterName = filterName.substring(filterName.lastIndexOf(".") + 1);
printMessage("Filter \"" + filterName + "\" finished, " + resCount +
" Results (" + getTimestamp() + ")");
}
}
/**
* Prints out an arbitrary error message.
*
* @param error an error message
*/
public static synchronized void printErrorMsg(String error) {
if (errorMsgs) System.err.println(error);
}
/**
* Prints out an arbitrary error message with a timestamp.
*
* @param error an error message
*/
public static synchronized void printErrorMsgTimestamp(String error) {
if (errorMsgs) printErrorMsg(error + " (" + getTimestamp() + ")");
}
/**
* Prints out a search error message.
*
* @param e an <code>Exception</code> that has been thrown
*/
public static synchronized void printSearchError(Exception e) {
if (errorMsgs) {
System.err.println("\nSearch error:");
System.err.println(e);
}
}
/**
* Prints out an HTTP error message.
*
* @param error an error msg
*/
public static synchronized void printHttpError(String error) {
if (errorMsgs) {
System.err.println("\nHTTP error:");
System.err.println(error);
}
}
/**
* Prints out instructions on how to use the program.
*
* @param instr instructions
*/
public static synchronized void printUsage(String instr) {
printMessage("Usage: " + instr);
}
/**
* Prints a prompt for a question.
*/
public static synchronized void printQuestionPrompt() {
System.out.print("\nQuestion: ");
}
/**
* Prints out the answers.
*
* @param results <code>Result</code> objects
*/
public static synchronized void printAnswers(Result[] results) {
printMessage("\nAnswer:");
for (int i = 0; i < results.length; i++) {
printMessage("[" + (i + 1) + "]\t" +
results[i].getAnswer());
printMessage("\tScore: " + results[i].getScore());
if (results[i].getDocID() != null)
printMessage("\tDocument: " + results[i].getDocID());
}
}
/**
* Prints out an "answer unknown" message.
*/
public static synchronized void printAnswerUnknown() {
printMessage("\nSorry, I don't know the answer.");
}
/** the DateFormat object used in getTimespamt
*/
private static SimpleDateFormat timestampFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* @return a timestamp String for logging
*/
public static synchronized String getTimestamp() {
return timestampFormatter.format(System.currentTimeMillis());
}
private static BufferedWriter logWriter = null;
/** print a message
* @param message the message to print
*/
private static synchronized void printMessage(String message) {
System.out.println(message);
if (logWriter != null) try {
logWriter.write(message);
logWriter.newLine();
logWriter.flush();
} catch (Exception e) {}
}
/** set the log file
* @param logFile the path and name of the filte to write log entries to (in addition to System.out)
*/
public static synchronized void setLogFile(String logFile) {
try {
if (logFile == null) {
if (logWriter != null) {
logWriter.close();
logWriter = null;
}
} else {
if (logWriter != null) logWriter.close();
logWriter = new BufferedWriter(new FileWriter(logFile));
}
} catch (Exception e) {
logWriter = null;
}
}
}