/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.console;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.IConsoleView;
import org.rf.ide.core.executor.PythonProcessListener;
import org.robotframework.red.swt.SwtThread;
import org.robotframework.red.swt.SwtThread.Evaluation;
/**
* @author Michal Anglart
*
*/
public final class RedSessionProcessListener implements PythonProcessListener {
private final Map<Process, RedSessionConsole> streams = new ConcurrentHashMap<>();
@Override
public void processStarted(final String name, final Process process) {
final RedSessionConsole console = SwtThread.syncEval(new Evaluation<RedSessionConsole>() {
@Override
public RedSessionConsole runCalculation() {
final RedSessionConsole console = openRobotServerConsole(name, process);
console.initializeStreams();
return console;
}
});
streams.put(process, console);
}
@Override
public void processEnded(final Process process) {
final RedSessionConsole console = streams.remove(process);
if (console != null) {
SwtThread.asyncExec(new Runnable() {
@Override
public void run() {
console.processTerminated();
}
});
}
}
@Override
public void lineRead(final Process serverProcess, final String line) {
final RedSessionConsole console = streams.get(serverProcess);
if (console != null) {
console.getStdOutStream().println(line);
}
}
@Override
public void errorLineRead(final Process serverProcess, final String line) {
final RedSessionConsole console = streams.get(serverProcess);
if (console != null) {
console.getStdErrStream().println(line);
}
}
private static RedSessionConsole openRobotServerConsole(final String interpreterName, final Process process) {
final IWorkbench workbench = PlatformUI.getWorkbench();
final IWorkbenchWindow activeWindow = workbench.getActiveWorkbenchWindow();
final IWorkbenchPage page = activeWindow.getActivePage();
try {
final IConsoleView consoleView = (IConsoleView) page.showView(IConsoleConstants.ID_CONSOLE_VIEW);
final String name = createName(interpreterName);
RedSessionConsole console = findConsole(name);
if (console == null) {
console = createConsole(name, process);
}
consoleView.display(console);
return console;
} catch (final PartInitException e) {
return null;
}
}
private static String createName(final String interpreterName) {
return "RED session [" + interpreterName + "]";
}
private static RedSessionConsole findConsole(final String name) {
final IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
final IConsole[] existing = consoleManager.getConsoles();
for (final IConsole console : existing) {
if (name.equals(console.getName())) {
return (RedSessionConsole) console;
}
}
return null;
}
private static RedSessionConsole createConsole(final String name, final Process process) {
final IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
final RedSessionConsole console = new RedSessionConsole(name, process);
consoleManager.addConsoles(new IConsole[] { console });
return console;
}
}