package jetbrains.mps.debugger.java.runtime.engine; /*Generated by MPS */ import com.intellij.openapi.components.ProjectComponent; import java.util.Map; import jetbrains.mps.debugger.java.runtime.engine.events.EventsProcessor; import jetbrains.mps.debugger.java.runtime.state.DebugSession; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; import java.util.List; import java.util.ArrayList; import jetbrains.mps.debug.api.DebugSessionManagerComponent; import org.jetbrains.annotations.NotNull; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.internal.collections.runtime.IMapping; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import com.intellij.openapi.project.Project; import jetbrains.mps.debugger.java.runtime.engine.events.Context; public class VMEventsProcessorManagerComponent implements ProjectComponent { private final Map<EventsProcessor, DebugSession> myEventProcessorToSessionMap = MapSequence.fromMap(new HashMap<EventsProcessor, DebugSession>()); private final DebugProcessListener myListener = new VMEventsProcessorManagerComponent.MyDebugProcessesMulticaster(); private final List<DebugProcessListener> myAllProcessListeners = new ArrayList<DebugProcessListener>(); private final DebugSessionManagerComponent myDebugManager; public VMEventsProcessorManagerComponent(DebugSessionManagerComponent component) { myDebugManager = component; } @Override public void projectOpened() { } @Override public void projectClosed() { } @NotNull @Override public String getComponentName() { return "MPS Debug VM Events Processors Manager"; } @Override public void initComponent() { } @Override public void disposeComponent() { } public EventsProcessor getEventsProcessor(final DebugSession session) { synchronized (myEventProcessorToSessionMap) { EventsProcessor processor = check_4p75cp_a0a0a0k(MapSequence.fromMap(myEventProcessorToSessionMap).findFirst(new IWhereFilter<IMapping<EventsProcessor, DebugSession>>() { public boolean accept(IMapping<EventsProcessor, DebugSession> it) { return it.value() == session; } })); return processor; } } private Set<EventsProcessor> getDebugProcesses() { synchronized (myEventProcessorToSessionMap) { return SetSequence.fromSetWithValues(new HashSet<EventsProcessor>(), MapSequence.fromMap(myEventProcessorToSessionMap).keySet()); } } private void removeDebugProcess(EventsProcessor process) { synchronized (myEventProcessorToSessionMap) { DebugSession debugSession = MapSequence.fromMap(myEventProcessorToSessionMap).removeKey(process); myDebugManager.removeDebugSession(debugSession); } process.removeDebugProcessListener(myListener); } public void performAllDebugProcessesAction(final _FunctionTypes._void_P1_E0<? super EventsProcessor> action) { for (final EventsProcessor processor : getDebugProcesses()) { processor.invoke(new _FunctionTypes._void_P0_E0() { public void invoke() { action.invoke(processor); } }); } } public void addDebugSession(DebugSession debugSession) { EventsProcessor process = debugSession.getEventsProcessor(); synchronized (myEventProcessorToSessionMap) { MapSequence.fromMap(myEventProcessorToSessionMap).put(process, debugSession); } process.addDebugProcessListener(myListener); } public void addAllProcessListener(DebugProcessListener listener) { synchronized (myAllProcessListeners) { myAllProcessListeners.add(listener); } } public void removeAllProcessListener(DebugProcessListener listener) { synchronized (myAllProcessListeners) { myAllProcessListeners.remove(listener); } } public List<DebugProcessListener> getAllProcessListeners() { synchronized (myAllProcessListeners) { return new ArrayList<DebugProcessListener>(myAllProcessListeners); } } public static VMEventsProcessorManagerComponent getInstance(Project project) { return project.getComponent(VMEventsProcessorManagerComponent.class); } private class MyDebugProcessesMulticaster implements DebugProcessListener { private MyDebugProcessesMulticaster() { } @Override public void connectorIsReady() { for (DebugProcessListener listener : getAllProcessListeners()) { listener.connectorIsReady(); } } @Override public void processAttached(@NotNull EventsProcessor process) { for (DebugProcessListener listener : getAllProcessListeners()) { listener.processAttached(process); } } @Override public void processDetached(@NotNull EventsProcessor process, boolean closedByUser) { for (DebugProcessListener listener : getAllProcessListeners()) { listener.processDetached(process, closedByUser); } removeDebugProcess(process); } @Override public void resumed(@NotNull Context suspendContext) { for (DebugProcessListener listener : getAllProcessListeners()) { listener.resumed(suspendContext); } } @Override public void paused(@NotNull Context suspendContext) { for (DebugProcessListener listener : getAllProcessListeners()) { listener.paused(suspendContext); } } } private static EventsProcessor check_4p75cp_a0a0a0k(IMapping<EventsProcessor, DebugSession> checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.key(); } return null; } }