package org.jbehave.eclipse.console;
import java.io.IOException;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.console.IOConsoleOutputStream;
import org.jbehave.eclipse.Activator;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
public class JBehaveConsoleAppender extends ch.qos.logback.core.UnsynchronizedAppenderBase<ILoggingEvent> {
private JBehaveConsole console;
private IOConsoleOutputStream outMessageStream;
private PatternLayoutEncoder encoder;
@Override
public void start() {
console = JBehaveConsole.findConsole();
outMessageStream = console.getOutMessageStream();
try {
encoder.init(outMessageStream);
} catch (IOException e) {
Activator.logError("Failed to initialize encoder on appender start", e);
}
super.start();
}
@Override
public void stop() {
super.stop();
}
@Override
protected void append(final ILoggingEvent event) {
// Thats probably not the most efficient way, but it works for now
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
encoder.doEncode(event);
} catch (IOException e) {
Activator.logError("Failed to encode logging event", e);
}
}
});
}
public void setEncoder(PatternLayoutEncoder encoder) {
this.encoder = encoder;
}
}