package jp.vmi.selenium.selenese.inject;
import org.aopalliance.intercept.MethodInvocation;
import jp.vmi.selenium.selenese.Context;
import jp.vmi.selenium.selenese.command.ICommand;
import jp.vmi.selenium.selenese.result.MaxTimeExceeded;
import jp.vmi.selenium.selenese.result.Result;
import static java.lang.Thread.*;
import static jp.vmi.selenium.selenese.Runner.MaxTimeTimer.*;
/**
* Interceptor class handles interruption made by {@link jp.vmi.selenium.selenese.Runner.MaxTimeTimer}.
*/
public class MaxTimeInterruptInterceptor extends AbstractDoCommandInterceptor {
@Override
protected Result invoke(MethodInvocation invocation, Context context, ICommand command, String[] curArgs) throws Throwable {
Result result = null;
if (isInterruptedByMaxTimeTimer(currentThread())) {
interrupted(); // clear interrupted status only when the thread is interrupted by MaxTimeTimer
return new MaxTimeExceeded();
}
try {
result = (Result) invocation.proceed();
} catch (Throwable t) {
if (isInterruptedByMaxTimeTimer(currentThread())) {
interrupted();
return new MaxTimeExceeded((Exception) t);
}
throw t;
}
if (isInterruptedByMaxTimeTimer(currentThread())) {
interrupted();
return new MaxTimeExceeded();
}
return result;
}
}