package ca.uhn.hl7v2.util;
import java.io.*;
import java.util.GregorianCalendar;
import java.util.Date;
/**
*
Handles output of status messages. Authors are encouraged to provide status
* information using the methods:
* writeStatus(String message);
* writeVerboseStatus(String message);
* ... instead of using System.out.println(...)
. This allows the user
* to control the output of status messages in one place.
* By default, messages are written to std out, and only "standard" messages are
* written (i.e. from calls to writeStatus()
, not writeVerboseStatus()
).
* This can be changed at startup by setting the following system properties:
* ca.uhn.hl7v2.util.status.out = ["STANDARD_OUT" | "FILE"]
* ca.uhn.hl7v2.util.status.level = ["NONE" | "STANDARD" | "VERBOSE"]
* If a programmer wishes to log status messages more reliably and without user control, (s)he
* should use ca.uhn.hl7v2.Log
instead.
*
* @deprecated use ca.uhn.log package
* @author Bryan Tripp
*
*/
public class Status {
private int dest = 0;
private int detail = 0;
private BufferedWriter fileOut;
private static Status singleton = null;
/**
* Used as an argument to setOutput(), causes status information to be printed
* to standard out.
*/
public static final int STANDARD_OUT = 1;
/**
* Used as an argument to setOutput(), causes status information to be printed
* to the file "status.log" in the working directory.
*/
public static final int FILE = 2;
/**
* Used as an argument to setVerbosity(), causes no status information to
* be output.
*/
public static final int NONE = 3;
/**
* Used as an argument to setVerbosity(), causes standard status information to
* be output.
*/
public static final int STANDARD = 4;
/**
* Used as an argument to setVerbosity(), causes detailed status information to
* be output.
*/
public static final int VERBOSE = 5;
/**
* Creates a new instance of Status
*/
private Status() {
//check system properties for configuration info
String out = System.getProperty("ca.uhn.hl7v2.util.status.out");
String level = System.getProperty("ca.uhn.hl7v2.util.status.level");
if (out != null && out.equals("FILE")) {
setOutput(Status.FILE);
} else {
setOutput(Status.STANDARD_OUT);
}
if (level != null && level.equals("NONE")) {
setVerbosity(Status.NONE);
} else if (level != null && level.equals("VERBOSE")) {
setVerbosity(Status.VERBOSE);
} else {
setVerbosity(Status.STANDARD);
}
}
/**
* Sets the location where status messages are output. Valid values include
* Status.STANDARD_OUT (std out) and Status.FILE (messages output to /status.log)
*/
public synchronized void setOutput(int destination) {
if (destination == Status.STANDARD_OUT || destination == Status.FILE) {
this.dest = destination;
if (dest == Status.STANDARD_OUT) {
System.out.println("Outputting status messages to standard out.");
} else {
String file = Home.getHomeDirectory().getAbsolutePath() + "/status.log";
System.out.println("Outputting status messages to the file " + file);
try {
this.fileOut = new BufferedWriter(new FileWriter(file, true));
} catch (IOException e) {
System.err.println("Couldn't open file status.log for status output - using std out instead.");
this.dest = Status.STANDARD_OUT;
}
}
}
}
/**
* Sets the level of detail of status messages. Valid values include
* Status.NONE, Status.STANDARD, and Status.VERBOSE (detailed).
*/
public synchronized void setVerbosity(int level) {
if (level == Status.NONE || level == Status.STANDARD || level == Status.VERBOSE) {
this.detail = level;
if (detail == Status.NONE) {
System.out.println("ca.uhn.hl7v2.util.Status: No status messages will be output.");
} else if (detail == Status.STANDARD) {
System.out.println("ca.uhn.hl7v2.util.Status: Standard status messages will be output.");
} else {
System.out.println("ca.uhn.hl7v2.util.Status: Verbose status messages will be output.");
}
}
}
/**
* Outputs a standard status message as per configuration.
*/
public static void writeStatus(String message) {
if (singleton == null) {
//initialize instance
singleton = new Status();
}
singleton.writeStatus(message, false);
}
/**
* Outputs a detail status message as per configuration.
*/
public static void writeVerboseStatus(String message) {
if (singleton == null) {
//initialize instance
singleton = new Status();
}
singleton.writeStatus(message, true);
}
/**
* Should be called only through static method of same name.
*/
private synchronized void writeStatus(String message, boolean verbose) {
boolean output = true;
if (this.detail == Status.NONE || (verbose && this.detail != Status.VERBOSE)) output = false;
GregorianCalendar now = new GregorianCalendar();
now.setTime(new Date());
StringBuffer mess = new StringBuffer();
mess.append(now.get(GregorianCalendar.DAY_OF_MONTH));
mess.append("/");
mess.append(now.get(GregorianCalendar.MONTH + 1));
mess.append("/");
mess.append(now.get(GregorianCalendar.YEAR));
mess.append(" ");
mess.append(now.get(GregorianCalendar.HOUR_OF_DAY));
mess.append(":");
mess.append(now.get(GregorianCalendar.MINUTE));
mess.append(":");
mess.append(now.get(GregorianCalendar.SECOND));
mess.append(".");
mess.append(now.get(GregorianCalendar.MILLISECOND));
mess.append(" ");
mess.append(message);
if (output) {
if (this.dest == Status.STANDARD_OUT) {
System.out.println(mess.toString());
} else {
try {
this.fileOut.write(mess.toString());
this.fileOut.write("\r\n");
this.fileOut.flush();
} catch (IOException e) {
System.err.println("Error writing status message to file: " + e.getMessage());
System.out.println(mess.toString());
}
}
}
}
}