blob: 81b1d7f4f14526688a6a321d7a8d02988f84cbce [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.core.breakpoints;
import java.util.Map;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
import org.eclipse.jdt.debug.core.IJavaMethodEntryBreakpoint;
import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;
import com.sun.jdi.ClassType;
import com.sun.jdi.Location;
import com.sun.jdi.Method;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.request.BreakpointRequest;
import com.sun.jdi.request.EventRequest;
/**
* A line breakpoint at the first executable location in a specific method.
*/
public class JavaMethodEntryBreakpoint extends JavaLineBreakpoint implements
IJavaMethodEntryBreakpoint {
protected static final String JAVA_METHOD_ENTRY_BREAKPOINT = "org.eclipse.jdt.debug.javaMethodEntryBreakpointMarker"; //$NON-NLS-1$
/**
* Breakpoint attribute storing the name of the method in which a breakpoint
* is contained. (value <code>"org.eclipse.jdt.debug.core.methodName"</code>
* ). This attribute is a <code>String</code>.
*/
private static final String METHOD_NAME = "org.eclipse.jdt.debug.core.methodName"; //$NON-NLS-1$
/**
* Breakpoint attribute storing the signature of the method in which a
* breakpoint is contained. (value
* <code>"org.eclipse.jdt.debug.core.methodSignature"</code>). This
* attribute is a <code>String</code>.
*/
private static final String METHOD_SIGNATURE = "org.eclipse.jdt.debug.core.methodSignature"; //$NON-NLS-1$
/**
* Cache of method name attribute
*/
private String fMethodName = null;
/**
* Cache of method signature attribute
*/
private String fMethodSignature = null;
/**
* Constructs a new method breakpoint
*/
public JavaMethodEntryBreakpoint() {
}
public JavaMethodEntryBreakpoint(final IResource resource,
final String typeName, final String methodName,
final String methodSignature, final int lineNumber,
final int charStart, final int charEnd, final int hitCount,
final boolean register, final Map<String, Object> attributes) throws CoreException {
IWorkspaceRunnable wr = new IWorkspaceRunnable() {
@Override
public void run(IProgressMonitor monitor) throws CoreException {
// create the marker
setMarker(resource.createMarker(JAVA_METHOD_ENTRY_BREAKPOINT));
// add attributes
addLineBreakpointAttributes(attributes, getModelIdentifier(),
true, lineNumber, charStart, charEnd);
addMethodNameAndSignature(attributes, methodName,
methodSignature);
addTypeNameAndHitCount(attributes, typeName, hitCount);
// set attributes
attributes.put(SUSPEND_POLICY, new Integer(
getDefaultSuspendPolicy()));
ensureMarker().setAttributes(attributes);
register(register);
}
};
run(getMarkerRule(resource), wr);
}
/**
* Adds the method name and signature attributes to the given attribute map,
* and initializes the local cache of method name and signature.
*/
private void addMethodNameAndSignature(Map<String, Object> attributes, String methodName,
String methodSignature) {
if (methodName != null) {
attributes.put(METHOD_NAME, methodName);
}
if (methodSignature != null) {
attributes.put(METHOD_SIGNATURE, methodSignature);
}
fMethodName = methodName;
fMethodSignature = methodSignature;
}
/**
* @see IJavaMethodEntryBreakpoint#getMethodName()
*/
@Override
public String getMethodName() {
return fMethodName;
}
/**
* @see IJavaMethodEntryBreakpoint#getMethodSignature()
*/
@Override
public String getMethodSignature() {
return fMethodSignature;
}
/**
* Initialize cache of attributes
*
* @see IBreakpoint#setMarker(IMarker)
*/
@Override
public void setMarker(IMarker marker) throws CoreException {
super.setMarker(marker);
fMethodName = marker.getAttribute(METHOD_NAME, null);
fMethodSignature = marker.getAttribute(METHOD_SIGNATURE, null);
}
/**
* @see IJavaLineBreakpoint#supportsCondition()
*/
@Override
public boolean supportsCondition() {
return false;
}
/**
* @see JavaBreakpoint#newRequests(JDIDebugTarget, ReferenceType)
*/
@Override
protected EventRequest[] newRequests(JDIDebugTarget target,
ReferenceType type) throws CoreException {
try {
if (type instanceof ClassType) {
ClassType clazz = (ClassType) type;
Method method = clazz.concreteMethodByName(getMethodName(),
getMethodSignature());
if (method == null) {
return null;
}
Location location = method.location();
if (location == null || location.codeIndex() == -1) {
return null;
}
BreakpointRequest req = type.virtualMachine()
.eventRequestManager()
.createBreakpointRequest(location);
configureRequest(req, target);
return new EventRequest[] { req };
}
return null;
} catch (RuntimeException e) {
target.internalError(e);
return null;
}
}
}