package jetbrains.mps.debugger.java.runtime.configurations.remote;
/*Generated by MPS */
import com.intellij.execution.process.ProcessHandler;
import com.intellij.openapi.project.Project;
import jetbrains.mps.debug.api.DebugSessionManagerComponent;
import jetbrains.mps.debugger.java.runtime.engine.VMEventsProcessorManagerComponent;
import jetbrains.mps.debug.api.AbstractDebugSession;
import jetbrains.mps.debugger.java.runtime.state.DebugSession;
import jetbrains.mps.debugger.java.runtime.engine.DebugProcessAdapter;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.debugger.java.runtime.engine.events.EventsProcessor;
import java.io.OutputStream;
public class RemoteProcessHandler extends ProcessHandler {
private final Project myProject;
public RemoteProcessHandler(Project project) {
myProject = project;
}
@Override
public void startNotify() {
final DebugSessionManagerComponent debugManager = DebugSessionManagerComponent.getInstance(myProject);
final VMEventsProcessorManagerComponent vmManager = VMEventsProcessorManagerComponent.getInstance(myProject);
final AbstractDebugSession abstractSession = debugManager.getDebugSession(this);
if (abstractSession instanceof DebugSession) {
final DebugSession session = (DebugSession) abstractSession;
final DebugProcessAdapter listener = new DebugProcessAdapter() {
@Override
public void processDetached(@NotNull EventsProcessor process, boolean closedByUser) {
if (process == vmManager.getEventsProcessor(session)) {
vmManager.removeAllProcessListener(this);
notifyProcessDetached();
}
}
};
vmManager.addAllProcessListener(listener);
try {
super.startNotify();
} finally {
// in case we added our listener too late, we may have lost processDetached notification,
// so check here if process is detached
if (session.isStopped()) {
vmManager.removeAllProcessListener(listener);
notifyProcessDetached();
}
}
}
}
@Override
protected void destroyProcessImpl() {
AbstractDebugSession debugProcess = DebugSessionManagerComponent.getInstance(myProject).getDebugSession(this);
if (debugProcess != null) {
debugProcess.stop(true);
}
}
@Override
protected void detachProcessImpl() {
AbstractDebugSession debugProcess = DebugSessionManagerComponent.getInstance(myProject).getDebugSession(this);
if (debugProcess != null) {
debugProcess.stop(false);
}
}
@Override
public boolean detachIsDefault() {
return true;
}
@Override
public OutputStream getProcessInput() {
return null;
}
}