package jp.vmi.selenium.selenese.result;
import java.util.regex.Pattern;
/**
* Result of command execution.
*/
public abstract class Result implements Comparable<Result> {
/**
* Result Level.
*/
@SuppressWarnings("javadoc")
public static enum Level {
UNEXECUTED(-1, 0, 5), SUCCESS(0, 0, 0), WARNING(1, 0, 2), FAILURE(2, 3, 3), ERROR(3, 3, 4), MAX_TIME_EXCEEDED(4, 3, 6);
public final int value;
public final int exitCode;
public final int strictExitCode;
private Level(int value, int exitCode, int strictExitCode) {
this.value = value;
this.exitCode = exitCode;
this.strictExitCode = strictExitCode;
}
}
private static final Pattern SKIP_RE = Pattern.compile("ByGuice"
+ "|^com\\.google\\.inject\\."
+ "|^java\\.lang\\.reflect\\."
+ "|^sun\\.reflect\\."
+ "|^org\\.junit\\."
+ "|^org\\.eclipse\\.jdt\\.");
private final String message;
/**
* Constructor.
*
* @param message result message.
*/
public Result(String message) {
this.message = message;
}
/**
* Constructor.
*
* @param prefix prefix of message.
* @param message result massage.
*/
public Result(String prefix, String message) {
this.message = prefix + ": " + message;
}
/**
* Constructor.
*
* @param prefix prefix of message.
* @param e Exception.
*/
public Result(String prefix, Exception e) {
this.message = generateExceptionMessage(prefix, e);
}
/**
* Constructor.
*
* @param prefix prefix of message.
* @param message result massage.
* @param e Exception.
*/
public Result(String prefix, String message, Exception e) {
StringBuilder result = new StringBuilder(prefix).append(": ").append(message).append(" - ");
this.message = generateExceptionMessage(result, e);
}
/**
* Get exception message for result.
*
* @param prefix prefix of message.
* @param e exception.
* @return message.
*/
protected String generateExceptionMessage(String prefix, Exception e) {
return generateExceptionMessage(new StringBuilder(prefix).append(": "), e);
}
/**
* Generate exception message.
*
* @param result message buffer.
* @param e exception.
* @return message.
*/
protected String generateExceptionMessage(StringBuilder result, Exception e) {
String msg = e.getMessage();
if (msg != null)
result.append(e.getClass().getSimpleName()).append(" - ").append(msg);
else
result.append(e.getClass().getName());
result.append(" (");
boolean sep = false;
for (StackTraceElement stackTrace : e.getStackTrace()) {
String className = stackTrace.getClassName();
if (className == null || SKIP_RE.matcher(className).find())
continue;
if (sep)
result.append(" / ");
result.append(className.replaceFirst("^.*\\.", ""))
.append('.')
.append(stackTrace.getMethodName());
String fileName = stackTrace.getFileName();
if (fileName != null) {
result.append('(').append(fileName);
int lineNumber = stackTrace.getLineNumber();
if (lineNumber >= 0)
result.append(':').append(lineNumber);
result.append(')');
}
sep = true;
}
result.append(")");
return result.toString();
}
/**
* Get result level.
*
* @return result level.
*/
public abstract Level getLevel();
/**
* Get result message.
*
* @return result message.
*/
public String getMessage() {
return message;
}
/**
* Is result of success?
*
* @return true if this is Success.
*/
public boolean isSuccess() {
return getLevel() == Level.SUCCESS;
}
/**
* Is command interrupted?
*
* @return true if command is interrupted.
*/
public boolean isAborted() {
return getLevel().value >= Level.FAILURE.value;
}
/**
* Is command failed?
*
* @return true if command is failed.
*/
public boolean isFailed() {
return getLevel().value >= Level.WARNING.value;
}
/**
* Update total result.
*
* @param newResult new result.
* @return updated total result.
*/
public Result update(Result newResult) {
return newResult.getLevel().value > this.getLevel().value ? newResult : this;
}
@Override
public int compareTo(Result result) {
return getLevel().compareTo(result.getLevel());
}
@Override
public String toString() {
return "[" + message + "]";
}
}