package jp.vmi.selenium.selenese.inject;
import java.util.List;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jp.vmi.junit.result.JUnitResultHolder;
import jp.vmi.selenium.selenese.Context;
import jp.vmi.selenium.selenese.command.CommandSequence;
import jp.vmi.selenium.selenese.command.ICommand;
import jp.vmi.selenium.selenese.log.CookieFilter;
import jp.vmi.selenium.selenese.log.PageInformation;
import jp.vmi.selenium.selenese.result.Result;
import jp.vmi.selenium.selenese.utils.LogRecorder;
/**
* Interceptor for logging each command execution.
*/
public class CommandLogInterceptor extends AbstractDoCommandInterceptor {
private static final Logger log = LoggerFactory.getLogger(CommandLogInterceptor.class);
private void logResult(LogRecorder clr, String indent, String cmdStr, Result result, Context context) {
PageInformation prevInfo = context.getLatestPageInformation();
PageInformation info = new PageInformation(context);
CookieFilter cookieFilter = context.getCookieFilter();
String prefix = indent + "- Cookie: ";
if (result.isFailed()) {
String resStr = info.getFirstMessage(prevInfo, indent, cmdStr, "=>", result.toString());
log.error(resStr);
if (clr != null)
clr.error(resStr);
for (String message : info.cookieMap.allMessages(cookieFilter)) {
log.error(prefix + message);
if (clr != null)
clr.error(prefix + message);
}
} else {
String resStr = info.getFirstMessage(prevInfo, indent, "-", result.toString());
log.info(resStr);
if (clr != null)
clr.info(resStr);
List<String> messages;
if (info.isSameOrigin(prevInfo))
messages = info.cookieMap.diffMessages(cookieFilter, prevInfo.cookieMap);
else
messages = info.cookieMap.allMessages(cookieFilter);
for (String message : messages) {
log.info(prefix + message);
if (clr != null)
clr.info(prefix + message);
}
}
if (info.origin != null)
context.setLatestPageInformation(info);
}
@Override
protected Result invoke(MethodInvocation invocation, Context context, ICommand command, String[] curArgs) throws Throwable {
CommandSequence commandSequence = context.getCommandListIterator().getCommandSequence();
LogRecorder clr = context.getCurrentTestCase().getLogRecorder();
String indent = StringUtils.repeat(" ", commandSequence.getLevel() - 1);
String cmdStr = command.toString();
String firstMsg = indent + "<" + commandSequence + "> " + cmdStr;
log.info(firstMsg);
if (clr != null)
clr.info(firstMsg);
try {
Result result = (Result) invocation.proceed();
logResult(clr, indent, cmdStr, result, context);
return result;
} catch (Exception e) {
String msg = cmdStr + " => " + e.getMessage();
log.error(indent + msg);
if (clr != null)
clr.error(indent + msg);
if (context instanceof JUnitResultHolder)
((JUnitResultHolder) context).getJUnitResult().setError(context.getCurrentTestCase(), e.getMessage(), e.toString());
throw e;
}
}
}