package jetbrains.mps.debugger.java.runtime.breakpoints;
/*Generated by MPS */
import jetbrains.mps.debug.api.breakpoints.AbstractBreakpoint;
import jetbrains.mps.debugger.java.runtime.engine.requests.ClassPrepareRequestor;
import jetbrains.mps.debugger.java.runtime.engine.requests.LocatableEventRequestor;
import com.sun.jdi.request.EventRequest;
import jetbrains.mps.logging.Logger;
import org.apache.log4j.LogManager;
import com.intellij.openapi.project.Project;
import jetbrains.mps.debugger.java.runtime.engine.events.EventsProcessor;
import jetbrains.mps.debugger.java.runtime.engine.concurrent.ManagerThread;
import java.util.List;
import com.sun.jdi.ReferenceType;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.debugger.java.runtime.engine.RequestManager;
import jetbrains.mps.debugger.java.runtime.engine.events.EventContext;
import com.sun.jdi.event.LocatableEvent;
import com.sun.jdi.ThreadReference;
import com.sun.jdi.StackFrame;
import com.sun.jdi.IncompatibleThreadStateException;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.ide.project.ProjectHelper;
public abstract class JavaBreakpoint extends AbstractBreakpoint implements ClassPrepareRequestor, LocatableEventRequestor {
private int mySuspendPolicy = EventRequest.SUSPEND_ALL;
private boolean myLogMessage = false;
private final Logger LOG = Logger.wrap(LogManager.getLogger(JavaBreakpoint.class));
protected JavaBreakpoint(Project project) {
super(project);
}
public void createClassPrepareRequest(EventsProcessor debugProcess) {
// this should be called on every breakpoint when DebugEventsProcessor is attached
ManagerThread.assertIsMangerThread();
// check is this breakpoint is enabled, vm reference is valid and there're no requests created yet
if (!(myIsEnabled)) {
// || !debugProcess.isAttached() || debugProcess.getRequestManager().findRequests(this).isEmpty()
return;
}
if (!(isValid())) {
return;
}
createOrWaitPrepare(debugProcess);
// updateUI();
}
public void createOrWaitPrepare(final EventsProcessor debugProcess) {
String className = getClassNameToPrepare();
assert (className != null && className.length() > 0);
// add requests for not prepared classes
debugProcess.getRequestManager().callbackOnPrepareClasses(this, className);
// and get all already prepared classes for a SNode
List<ReferenceType> list = debugProcess.getVirtualMachine().classesByName(className);
for (final ReferenceType refType : list) {
if (refType.isPrepared()) {
processClassPrepare(debugProcess, refType);
}
}
}
protected abstract String getClassNameToPrepare();
@NotNull
@Override
public abstract JavaBreakpointKind getKind();
@Override
public void processClassPrepare(EventsProcessor debugProcess, ReferenceType classType) {
// this is called when a class for this ClassPrepareRequestor is prepared
if (!(myIsEnabled) || !(isValid())) {
return;
}
createRequestForPreparedClass(debugProcess, classType);
}
protected abstract void createRequestForPreparedClass(EventsProcessor debugProcess, ReferenceType classType);
@Override
public void removeFromRunningSessions() {
RequestManager.removeClassPrepareRequests(this);
}
@Override
public void addToRunningSessions() {
RequestManager.createClassPrepareRequests(this);
}
@Override
public int getSuspendPolicy() {
return mySuspendPolicy;
}
public void setSuspendPolicy(final int policy) {
if (policy != mySuspendPolicy) {
mySuspendPolicy = policy;
removeFromRunningSessions();
addToRunningSessions();
}
}
public boolean isLogMessage() {
return myLogMessage;
}
public void setLogMessage(boolean logMessage) {
myLogMessage = logMessage;
}
@Override
public boolean isRequestHitByEvent(EventContext context, LocatableEvent event) {
assert EventsProcessor.isOnPooledThread();
if (!(isValid())) {
context.getRequestManager().deleteRequests(this);
return false;
}
try {
ThreadReference threadReference = event.thread();
final StackFrame stackFrame = check_e43rhl_a0b0c0q(threadReference);
if (stackFrame == null) {
// might be if the thread has been collected
return false;
}
} catch (IncompatibleThreadStateException ex) {
LOG.error(ex);
return false;
}
return true;
}
protected SRepository getRepository() {
return ProjectHelper.getProjectRepository(getProject());
}
private static StackFrame check_e43rhl_a0b0c0q(ThreadReference checkedDotOperand) throws IncompatibleThreadStateException {
if (null != checkedDotOperand) {
return checkedDotOperand.frame(0);
}
return null;
}
}