/**
* <copyright>
* </copyright>
*
*
*/
package org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug;
/**
* The DebugProxy allows to communicate between the interpreter, which runs in a
* separate thread or process and the Eclipse Debug framework (i.e., the
* DebugTarget class).
*/
public class MtextDebugProxy {
public static final int STARTUP_DELAY = 1000;
private java.io.PrintStream output;
private java.io.BufferedReader reader;
private org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugTarget debugTarget;
private org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugCommunicationHelper communicationHelper = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugCommunicationHelper();
public MtextDebugProxy(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugTarget debugTarget, int requestPort) throws java.net.UnknownHostException, java.io.IOException {
this.debugTarget = debugTarget;
// give interpreter a chance to start
try {
Thread.sleep(STARTUP_DELAY);
} catch (InterruptedException e) {
}
startSocket(requestPort);
}
private void startSocket(int requestPort) throws java.net.UnknownHostException, java.io.IOException {
// creating client proxy socket (trying to connect)...
java.net.Socket client = new java.net.Socket("localhost", requestPort);
// creating client proxy socket - done. (connected)
try {
java.io.BufferedInputStream input = new java.io.BufferedInputStream(client.getInputStream());
reader = new java.io.BufferedReader(new java.io.InputStreamReader(input));
} catch (java.io.IOException e) {
System.out.println(e);
}
try {
output = new java.io.PrintStream(client.getOutputStream());
} catch (java.io.IOException e) {
System.out.println(e);
}
}
public void resume() {
sendCommand(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.RESUME);
}
public void stepOver() {
sendCommand(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.STEP_OVER);
}
public void stepInto() {
sendCommand(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.STEP_INTO);
}
public void stepReturn() {
sendCommand(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.STEP_RETURN);
}
public void terminate() {
sendCommand(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.EXIT);
}
public org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage getStack() {
return sendCommandAndRead(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.GET_STACK);
}
public void addLineBreakpoint(String location, int line) {
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage message = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.ADD_LINE_BREAKPOINT, new String[] {location, Integer.toString(line)});
communicationHelper.sendEvent(message, output);
}
public void removeLineBreakpoint(String location, int line) {
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage message = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.REMOVE_LINE_BREAKPOINT, new String[] {location, Integer.toString(line)});
communicationHelper.sendEvent(message, output);
}
public org.eclipse.debug.core.model.IVariable[] getStackVariables(String stackFrame) {
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage response = sendCommandAndRead(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.GET_FRAME_VARIABLES, new String[] {stackFrame});
String[] ids = response.getArguments();
// fetch all variables
org.eclipse.debug.core.model.IVariable[] variables = getVariables(ids);
return variables;
}
public org.eclipse.debug.core.model.IVariable[] getVariables(String... requestedIDs) {
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage response = sendCommandAndRead(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes.GET_VARIABLES, requestedIDs);
String[] varStrings = response.getArguments();
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugVariable[] variables = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugVariable[varStrings.length];
int i = 0;
for (String varString : varStrings) {
java.util.Map<String, String> properties = org.feature.multi.perspective.mapping.viewmapping.resource.mtext.util.MtextStringUtil.convertFromString(varString);
// convert varString to variables and values
String valueString = properties.get("!valueString");
String valueRefType = "valueRefType";
java.util.Map<String, Long> childVariables = new java.util.TreeMap<String, Long>(new java.util.Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
});
for (String property : properties.keySet()) {
// ignore special properties - they are not children
if (property.startsWith("!")) {
continue;
}
childVariables.put(property, Long.parseLong(properties.get(property)));
}
String id = properties.get("!id");
org.eclipse.debug.core.model.IValue value = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugValue(debugTarget, id, valueString, valueRefType, childVariables);
String variableName = properties.get("!name");
String variableRefType = properties.get("!type");
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugVariable variable = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugVariable(debugTarget, variableName, value, variableRefType);
variables[i++] = variable;
}
return variables;
}
private void sendCommand(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes command, String... parameters) {
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage message = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage(command, parameters);
communicationHelper.sendEvent(message, output);
}
private org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage sendCommandAndRead(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.EMtextDebugMessageTypes command, String... parameters) {
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage message = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugMessage(command, parameters);
return communicationHelper.sendAndReceive(message, output, reader);
}
}