package com.netifera.platform.host.terminal.probe;
import java.util.HashMap;
import java.util.Map;
import com.netifera.platform.api.dispatcher.IProbeMessage;
import com.netifera.platform.api.dispatcher.MessengerException;
import com.netifera.platform.api.log.ILogger;
import com.netifera.platform.api.probe.IProbe;
import com.netifera.platform.dispatcher.StatusMessage;
import com.netifera.platform.host.terminal.ITerminal;
import com.netifera.platform.host.terminal.ITerminalManager;
import com.netifera.platform.host.terminal.ITerminalOutputHandler;
public class RemoteTerminalManager implements ITerminalManager {
private final ILogger logger;
private final IProbe probe;
private String messengerError;
private Map<String, RemoteTerminal> ptyMap = new HashMap<String, RemoteTerminal>();
RemoteTerminalManager(IProbe probe, ILogger logger) {
this.probe = probe;
this.logger = logger;
}
public ITerminal openTerminal(String command, ITerminalOutputHandler outputHandler) {
OpenTerminal response = (OpenTerminal) exchangeMessage(new OpenTerminal(command));
if(response == null) {
logger.error("Error sending open terminal message " + messengerError);
return null;
}
RemoteTerminal terminal = new RemoteTerminal(response.getPty(), this, outputHandler);
ptyMap.put(terminal.getName(), terminal);
return terminal;
}
void terminalOutput(TerminalOutput terminalOutput) {
RemoteTerminal terminal = ptyMap.get(terminalOutput.getPty());
terminal.receiveOutput(terminalOutput.getOutput());
}
void terminalClosed(TerminalClosed terminalClosed) {
RemoteTerminal terminal = ptyMap.get(terminalClosed.getPtyName());
if(terminal != null) {
terminal.setClosed();
}
}
void terminalInput(String pty, byte[] input) {
if(!sendMessage(new TerminalInput(pty ,input))) {
logger.warning("Failed sending terminal input message " + messengerError);
}
}
IProbe getProbe() {
return probe;
}
ILogger getLogger() {
return logger;
}
void removeTerminal(String ptyName) {
ptyMap.remove(ptyName);
}
private boolean sendMessage(IProbeMessage message) {
try {
probe.getMessenger().sendMessage(message);
return true;
} catch (MessengerException e) {
messengerError = e.getMessage();
return false;
}
}
private IProbeMessage exchangeMessage(IProbeMessage message) {
try {
IProbeMessage response = probe.getMessenger().exchangeMessage(message);
if(response instanceof StatusMessage) {
return null;
} else {
return response;
}
} catch (MessengerException e) {
messengerError = e.getMessage();
return null;
}
}
}