package com.mobilesorcery.sdk.html5.debug;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeoutException;
import org.eclipse.debug.core.IStreamListener;
import org.eclipse.debug.core.model.IStreamMonitor;
import org.eclipse.debug.core.model.IStreamsProxy;
import com.mobilesorcery.sdk.core.IProcessConsole;
import com.mobilesorcery.sdk.core.LineReader.ILineHandler;
import com.mobilesorcery.sdk.html5.Html5Plugin;
public class JSODDStreamsProxy implements IStreamsProxy {
public class JSODDStreamMonitor implements IStreamMonitor, ILineHandler {
private final CopyOnWriteArrayList<IStreamListener> listeners = new CopyOnWriteArrayList<IStreamListener>();
private final int type;
public JSODDStreamMonitor(int type) {
this.type = type;
}
@Override
public void addListener(IStreamListener listener) {
if (listeners.isEmpty()) {
Html5Plugin.getDefault().getReloadServer().addConsoleListener(this);
}
listeners.add(listener);
}
@Override
public String getContents() {
return "";
}
@Override
public void removeListener(IStreamListener listener) {
listeners.remove(listener);
if (listeners.isEmpty()) {
Html5Plugin.getDefault().getReloadServer().removeConsoleListener(this);
}
}
@Override
public void start(Process process) {
// Ignore.
}
@Override
public void newLine(String line) {
String[] levelAndMessage = line.split("\\|", 2);
String level = levelAndMessage.length > 1 ? levelAndMessage[0] : "";
String message = levelAndMessage.length > 1 ? levelAndMessage[1] : levelAndMessage[0];
if (levelMatches(level)) {
for (IStreamListener listener : listeners) {
listener.streamAppended(message + "\n", this);
}
}
}
private boolean levelMatches(String level) {
if ("warn".equalsIgnoreCase(level) || "error".equalsIgnoreCase(level)) {
return type == IProcessConsole.ERR;
} else {
return type == IProcessConsole.OUT;
}
}
@Override
public void stop(IOException e) {
// Ignore.
}
}
private JSODDStreamMonitor outMonitor;
private JSODDStreamMonitor errMonitor;
private final ReloadVirtualMachine vm;
public JSODDStreamsProxy(ReloadVirtualMachine vm) {
this.vm = vm;
}
@Override
public IStreamMonitor getErrorStreamMonitor() {
if (errMonitor == null) {
errMonitor = new JSODDStreamMonitor(IProcessConsole.ERR);
}
return errMonitor;
}
@Override
public synchronized IStreamMonitor getOutputStreamMonitor() {
if (outMonitor == null) {
outMonitor = new JSODDStreamMonitor(IProcessConsole.OUT);
}
return outMonitor;
}
@Override
public void write(String input) throws IOException {
try {
int endIndex = input.charAt(input.length() - 1) == '\n' ? input.length() - 1 : input.length();
input = input.substring(0, endIndex);
if (input.length() > 0) {
Object result = vm.evaluate(input);
outMonitor.newLine("> " + result);
}
} catch (Exception e) {
errMonitor.newLine(MessageFormat.format("warn|Could not evaluate {0}. Reason: {1}", input, e.getMessage()));
}
}
}