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; } }