package jetbrains.mps.debugger.java.runtime.state;
/*Generated by MPS */
import jetbrains.mps.debugger.java.api.state.JavaUiState;
import java.util.List;
import jetbrains.mps.debugger.java.api.state.proxy.JavaThread;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.internal.collections.runtime.IVisitor;
import jetbrains.mps.debugger.java.runtime.engine.events.Context;
import jetbrains.mps.debugger.java.runtime.engine.events.EventsProcessor;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.ide.ThreadUtils;
import jetbrains.mps.debug.api.AbstractDebugSession;
import com.sun.jdi.ThreadReference;
import jetbrains.mps.debug.api.programState.IThread;
import jetbrains.mps.debug.api.AbstractUiState;
public abstract class JavaUiStateImpl extends JavaUiState {
protected final DebugSession myDebugSession;
protected int myThreadIndex;
protected final List<JavaThread> myThreads = ListSequence.fromList(new ArrayList<JavaThread>());
public JavaUiStateImpl(@NotNull DebugSession session) {
super(session);
myDebugSession = session;
myThreadIndex = -1;
}
/**
* This constructor is called when user selects some thread from ui
*/
protected JavaUiStateImpl(DebugSession debugSession, int currentThreadIndex) {
this(debugSession);
myThreadIndex = currentThreadIndex;
assert currentThreadIndex >= 0;
initializeThreads();
ListSequence.fromList(myThreads).visitAll(new IVisitor<JavaThread>() {
public void visit(JavaThread it) {
it.initializeFrames();
}
});
}
public abstract Context getContext();
@Override
public abstract boolean isPausedOnBreakpoint();
@NotNull
/*package*/ PausedJavaUiState paused(@NotNull Context context) {
// changes state on pause/resume
// we select new context even if we are already on some other context
// user probably wants to know about new paused contexts
return new PausedJavaUiState(context, myDebugSession);
}
@NotNull
/*package*/ JavaUiStateImpl resumed(Context context) {
if (context != getContext()) {
return this;
}
Context newContext = getEventProcessor().getContextManager().firstContext();
if (newContext == null) {
return new RunningJavaUiState(myDebugSession);
}
return new PausedJavaUiState(newContext, myDebugSession);
}
protected Context findContext(@NotNull JavaUiStateImpl previousState) {
Context newContext = previousState.getContext();
JavaThread thread = getThread();
if (thread == null) {
return null;
}
if (newContext == null || !((eq_vkri5_a0a0a3a9(newContext.getThread(), thread)))) {
return getEventProcessor().getContextManager().findContextForThread(thread.getThread());
}
return newContext;
}
protected EventsProcessor getEventProcessor() {
return myDebugSession.getEventsProcessor();
}
@Override
public void invokeEvaluation(_FunctionTypes._void_P0_E0 command) {
if (getContext() == null) {
return;
}
myDebugSession.getEventsProcessor().scheduleEvaluation(command, getThread().getThread());
}
@Override
@Nullable
public <R> R invokeEvaluationSynchronously(_FunctionTypes._return_P0_E0<? extends R> command) {
if (getContext() == null) {
return null;
}
return myDebugSession.getEventsProcessor().invokeEvaluationUnderProgress(command, getThread().getThread());
}
protected synchronized void initializeThreads() {
assert !(ThreadUtils.isInEDT());
assert getExecutionState().equals(AbstractDebugSession.ExecutionState.Paused);
for (ThreadReference threadReference : getEventProcessor().getVirtualMachine().allThreads()) {
ListSequence.fromList(myThreads).addElement(new JavaThread(myDebugSession, threadReference));
}
assert myThreadIndex < ListSequence.fromList(myThreads).count();
}
@Nullable
public JavaThread getCurrentThread() {
return ListSequence.fromList(myThreads).getElement(myThreadIndex);
}
@Override
protected JavaUiStateImpl selectThreadInternal(@Nullable IThread thread) {
// changes state on user selection
int index = ListSequence.fromList(myThreads).indexOf(thread);
if (((JavaThread) thread).getThread().isSuspended()) {
return new PausedJavaUiState(this, myDebugSession, index);
}
return new RunningJavaUiState(myDebugSession, index);
}
@Override
public void selectThread(@Nullable final IThread thread) {
myDebugSession.getEventsProcessor().schedule(new _FunctionTypes._void_P0_E0() {
public void invoke() {
AbstractUiState newState = selectThreadInternal(thread);
if (newState != JavaUiStateImpl.this) {
myAbstractDebugSession.trySetState(JavaUiStateImpl.this, newState);
}
}
});
}
@NotNull
@Override
public synchronized List<JavaThread> getThreads() {
return myThreads;
}
@Override
public synchronized JavaThread getThread() {
return (JavaThread) ListSequence.fromList(myThreads).getElement(myThreadIndex);
}
protected AbstractDebugSession.ExecutionState getExecutionState() {
return myDebugSession.getExecutionState();
}
private static boolean eq_vkri5_a0a0a3a9(Object a, Object b) {
return (a != null ? a.equals(b) : a == b);
}
}