/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.scripting;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import de.rcenvironment.core.component.execution.api.ComponentLog;
import de.rcenvironment.core.component.execution.api.ConsoleRow;
import de.rcenvironment.core.component.execution.api.ConsoleRow.Type;
import de.rcenvironment.core.scripting.python.PythonOutputWriter;
/**
* Implementation of {@link PythonOutputWriter}, which forwards output to the workflow console.
*
* @author Doreen Seider
*/
public final class WorkflowConsoleForwardingWriter extends PythonOutputWriter {
private static final String CONSOLE_ROW_TYPE_NOT_SUPPORTED = "Console row type not supported: ";
private ComponentLog componentLog;
private final Type consoleType;
private final CountDownLatch printingLinesFinishedLatch = new CountDownLatch(1);
public WorkflowConsoleForwardingWriter(Object lock, ComponentLog componentLog, ConsoleRow.Type type) {
this(lock, componentLog, type, null);
}
public WorkflowConsoleForwardingWriter(Object lock, ComponentLog componentLog, ConsoleRow.Type consoleType, File logFile) {
super(lock, logFile);
this.componentLog = componentLog;
if (consoleType != Type.TOOL_OUT && consoleType != Type.TOOL_ERROR) {
throw new IllegalArgumentException(CONSOLE_ROW_TYPE_NOT_SUPPORTED + consoleType);
}
this.consoleType = consoleType;
}
@Override
public void close() throws IOException {
super.close();
synchronized (lock) {
// enqueues a task, which set the compInfo variable to null
// doing it that way (and not setting the compInfo variable directly here to null), because that ensures that the compInfo
// variable is set to null not before the last line was forwarded
executionQueue.enqueue(new Runnable() {
@Override
public void run() {
// set to null as the WorkflowConsoleForwardingWriter instance are hold by the Jython sript engine
// for any length of time
componentLog = null;
}
});
}
}
@Override
protected void onNewLineToForward(String line) {
if (line == null) {
printingLinesFinishedLatch.countDown();
} else {
switch (consoleType) {
case TOOL_OUT:
componentLog.toolStdout(line);
break;
case TOOL_ERROR:
componentLog.toolStderr(line);
break;
default:
throw new IllegalArgumentException(CONSOLE_ROW_TYPE_NOT_SUPPORTED + consoleType);
}
}
}
/**
* Awaits the writer be get closed.
*
* @throws InterruptedException if wait is interrupted
*/
public void awaitPrintingLinesFinished() throws InterruptedException {
printingLinesFinishedLatch.await();
}
}