/**
* <copyright>
* </copyright>
*
*
*/
package org.feature.multi.perspective.mapping.viewmapping.resource.mtext.launch;
/**
* A class that provides common methods that are required by launch configuration
* delegates.
*/
public class MtextLaunchConfigurationHelper {
public static class SystemOutInterpreter extends org.feature.multi.perspective.mapping.viewmapping.resource.mtext.util.AbstractMtextInterpreter<Void,Void> {
@Override
public Void interprete(org.eclipse.emf.ecore.EObject object, Void context) {
System.out.println("Found " + object + ", but don't know what to do with it.");
return null;
}
}
/**
* Launch an example interpreter that prints object to System.out.
*/
public void launch(org.eclipse.debug.core.ILaunchConfiguration configuration, String mode, org.eclipse.debug.core.ILaunch launch, org.eclipse.core.runtime.IProgressMonitor monitor) throws org.eclipse.core.runtime.CoreException {
org.eclipse.emf.ecore.EObject root = getModelRoot(configuration);
// replace this delegate with your actual interpreter
SystemOutInterpreter delegate = new SystemOutInterpreter();
delegate.addObjectTreeToInterpreteTopDown(root);
launchInterpreter(configuration, mode, launch, monitor, delegate, null);
}
public <ResultType, ContextType> void launchInterpreter(org.eclipse.debug.core.ILaunchConfiguration configuration, String mode, org.eclipse.debug.core.ILaunch launch, org.eclipse.core.runtime.IProgressMonitor monitor, org.feature.multi.perspective.mapping.viewmapping.resource.mtext.util.AbstractMtextInterpreter<ResultType, ContextType> delegate, final ContextType context) throws org.eclipse.core.runtime.CoreException {
final boolean enableDebugger = mode.equals(org.eclipse.debug.core.ILaunchManager.DEBUG_MODE);
// step 1: find two free ports we can use to communicate between the Eclipse and
// the interpreter
int requestPort = findFreePort();
int eventPort = findFreePort();
if (requestPort < 0 || eventPort < 0) {
abort("Unable to find free port", null);
}
final org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebuggableInterpreter<ResultType, ContextType> interpreter = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebuggableInterpreter<ResultType, ContextType>(delegate, eventPort);
// step 2: prepare and start interpreter in separate thread
Thread interpreterThread = new Thread(new Runnable() {
public void run() {
// if we are in debug mode, the interpreter must wait for the debugger to attach
interpreter.interprete(context, enableDebugger);
}
});
interpreterThread.start();
// step 3: start debugger listener (sends commands from Eclipse debug framework to
// running process
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebuggerListener<ResultType, ContextType> debugListener = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebuggerListener<ResultType, ContextType>(requestPort);
debugListener.setDebuggable(interpreter);
new Thread(debugListener).start();
// step 4: start debugger
org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugProcess process = new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugProcess(launch);
launch.addDebugTarget(new org.feature.multi.perspective.mapping.viewmapping.resource.mtext.debug.MtextDebugTarget(process, launch, requestPort, eventPort));
}
public org.eclipse.emf.common.util.URI getURI(org.eclipse.debug.core.ILaunchConfiguration configuration) throws org.eclipse.core.runtime.CoreException {
return org.eclipse.emf.common.util.URI.createURI(configuration.getAttribute(org.feature.multi.perspective.mapping.viewmapping.resource.mtext.launch.MtextLaunchConfigurationDelegate.ATTR_RESOURCE_URI, (String) null));
}
public org.eclipse.emf.ecore.EObject getModelRoot(org.eclipse.debug.core.ILaunchConfiguration configuration) throws org.eclipse.core.runtime.CoreException {
return org.feature.multi.perspective.mapping.viewmapping.resource.mtext.util.MtextResourceUtil.getResourceContent(getURI(configuration));
}
/**
* Returns a free port number on localhost, or -1 if unable to find a free port.
*/
protected int findFreePort() {
java.net.ServerSocket socket = null;
try {
socket = new java.net.ServerSocket(0);
return socket.getLocalPort();
} catch (java.io.IOException e) {
} finally {
if (socket != null) {
try {
socket.close();
} catch (java.io.IOException e) {
}
}
}
return -1;
}
/**
* Throws an exception with a new status containing the given message and optional
* exception.
*
* @param message error message
* @param e underlying exception
*
* @throws CoreException
*/
protected void abort(String message, Throwable e) throws org.eclipse.core.runtime.CoreException {
throw new org.eclipse.core.runtime.CoreException(new org.eclipse.core.runtime.Status(org.eclipse.core.runtime.IStatus.ERROR, org.feature.multi.perspective.mapping.viewmapping.resource.mtext.mopp.MtextPlugin.DEBUG_MODEL_ID, 0, message, e));
}
}