/******************************************************************************* * Copyright (c) 2000, 2016 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.debug.core; import java.util.HashMap; 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.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IBreakpointManager; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IProcess; import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin; import org.eclipse.jdt.internal.debug.core.JavaDebugUtils; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaClassPrepareBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaExceptionBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaLineBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaMethodBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaMethodEntryBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaPatternBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaStratumLineBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaTargetPatternBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaWatchpoint; import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget; import org.osgi.service.prefs.BackingStoreException; import com.sun.jdi.VirtualMachine; /** * Provides utility methods for creating debug targets and breakpoints specific * to the JDI debug model. * <p> * To provide access to behavior and information specific to the JDI debug * model, a set of interfaces are defined which extend the base set of debug * element interfaces. For example, <code>IJavaStackFrame</code> is declared to * extend <code>IStackFrame</code>, and provides methods specific to this debug * model. The specialized interfaces are also available as adapters from the * debug elements generated from this model. * </p> * <p> * This class provides static utility methods only. * </p> * * @noinstantiate This class is not intended to be instantiated by clients. * @noextend This class is not intended to be subclassed by clients. */ public class JDIDebugModel { /** * Preference key for default JDI request timeout value. */ public static final String PREF_REQUEST_TIMEOUT = getPluginIdentifier() + ".PREF_REQUEST_TIMEOUT"; //$NON-NLS-1$ /** * Preference key for specifying if hot code replace should be performed * when a replacement class file contains compilation errors. */ public static final String PREF_HCR_WITH_COMPILATION_ERRORS = getPluginIdentifier() + ".PREF_HCR_WITH_COMPILATION_ERRORS"; //$NON-NLS-1$ /** * The default JDI request timeout when no preference is set. */ public static final int DEF_REQUEST_TIMEOUT = 3000; /** * Boolean preference controlling whether breakpoints are hit during an * evaluation operation. If true, breakpoints will be hit as usual during * evaluations. If false, the breakpoint manager will be automatically * disabled during evaluations. * * @since 3.0 */ public static final String PREF_SUSPEND_FOR_BREAKPOINTS_DURING_EVALUATION = getPluginIdentifier() + ".suspend_for_breakpoints_during_evaluation"; //$NON-NLS-1$ /** * Boolean preference controlling whether to not install (filter) breakpoints for types existing multiple times * in source projects and not related to the current debug session. * @since 3.10 */ public static final String PREF_FILTER_BREAKPOINTS_FROM_UNRELATED_SOURCES = getPluginIdentifier() + ".do_not_install_breakpoints_from_unrelated_sources"; //$NON-NLS-1$ /** * Preference key for specifying if the value returned or thrown should be displayed as variable after a "step return" or "step over" (if * supported by the vm) * @since 3.11 */ public static final String PREF_SHOW_STEP_RESULT = getPluginIdentifier() + ".PREF_SHOW_STEP_RESULT"; //$NON-NLS-1$ /** * Not to be instantiated. */ private JDIDebugModel() { super(); } /** * Creates and returns a debug target for the given VM, with the specified * name, and associates the debug target with the given process for console * I/O. The allow terminate flag specifies whether the debug target will * support termination (<code>ITerminate</code>). The allow disconnect flag * specifies whether the debug target will support disconnection ( * <code>IDisconnect</code>). Launching the actual VM is a client * responsibility. By default, the target VM will be resumed on startup. The * debug target is added to the given launch. * * @param launch * the launch the new debug target will be contained in * @param vm * the VM to create a debug target for * @param name * the name to associate with the VM, which will be returned from * <code>IDebugTarget.getName</code>. If <code>null</code> the * name will be retrieved from the underlying VM. * @param process * the process to associate with the debug target, which will be * returned from <code>IDebugTarget.getProcess</code> * @param allowTerminate * whether the target will support termination * @param allowDisconnect * whether the target will support disconnection * @return a debug target * @see org.eclipse.debug.core.model.ITerminate * @see org.eclipse.debug.core.model.IDisconnect * @since 2.0 */ public static IDebugTarget newDebugTarget(ILaunch launch, VirtualMachine vm, String name, IProcess process, boolean allowTerminate, boolean allowDisconnect) { return newDebugTarget(launch, vm, name, process, allowTerminate, allowDisconnect, true); } /** * Creates and returns a debug target for the given VM, with the specified * name, and associates the debug target with the given process for console * I/O. The allow terminate flag specifies whether the debug target will * support termination (<code>ITerminate</code>). The allow disconnect flag * specifies whether the debug target will support disconnection ( * <code>IDisconnect</code>). The resume flag specifies if the target VM * should be resumed on startup (has no effect if the VM was already running * when the connection to the VM was established). Launching the actual VM * is a client responsibility. The debug target is added to the given * launch. * * @param launch * the launch the new debug target will be contained in * @param vm * the VM to create a debug target for * @param name * the name to associate with the VM, which will be returned from * <code>IDebugTarget.getName</code>. If <code>null</code> the * name will be retrieved from the underlying VM. * @param process * the process to associate with the debug target, which will be * returned from <code>IDebugTarget.getProcess</code> * @param allowTerminate * whether the target will support termination * @param allowDisconnect * whether the target will support disconnection * @param resume * whether the target is to be resumed on startup. Has no effect * if the target was already running when the connection to the * VM was established. * @return a debug target * @see org.eclipse.debug.core.model.ITerminate * @see org.eclipse.debug.core.model.IDisconnect * @since 2.0 */ public static IDebugTarget newDebugTarget(final ILaunch launch, final VirtualMachine vm, final String name, final IProcess process, final boolean allowTerminate, final boolean allowDisconnect, final boolean resume) { final IJavaDebugTarget[] target = new IJavaDebugTarget[1]; IWorkspaceRunnable r = new IWorkspaceRunnable() { @Override public void run(IProgressMonitor m) { target[0] = new JDIDebugTarget(launch, vm, name, allowTerminate, allowDisconnect, process, resume); } }; try { ResourcesPlugin.getWorkspace().run(r, null, 0, null); } catch (CoreException e) { JDIDebugPlugin.log(e); } return target[0]; } /** * Returns the identifier for the JDI debug model plug-in * * @return plug-in identifier */ public static String getPluginIdentifier() { return JDIDebugPlugin.getUniqueIdentifier(); } /** * Registers the given listener for hot code replace notifications. Has no * effect if an identical listener is already registered. * <p> * Note that since 3.6, if an {@link IJavaDebugTarget} has hot code replace * listeners registered with it directly, listeners registered with this * class are not notified of hot code replace events for that target. This * allows a target to have custom hot code replace notification behavior. * </p> * * @param listener * hot code replace listener * @see IJavaHotCodeReplaceListener * @see IJavaDebugTarget#addHotCodeReplaceListener(IJavaHotCodeReplaceListener) * @since 2.0 */ public static void addHotCodeReplaceListener( IJavaHotCodeReplaceListener listener) { JDIDebugPlugin.getDefault().addHotCodeReplaceListener(listener); } /** * Unregisters the given listener for hot code replace notifications. Has no * effect if an identical listener is not already registered. * * @param listener * hot code replace listener * @see IJavaHotCodeReplaceListener * @since 2.0 */ public static void removeHotCodeReplaceListener( IJavaHotCodeReplaceListener listener) { JDIDebugPlugin.getDefault().removeHotCodeReplaceListener(listener); } /** * Registers the given listener for breakpoint notifications. Has no effect * if an identical listener is already registered. * * @param listener * breakpoint listener * @see IJavaBreakpointListener * @since 2.0 */ public static void addJavaBreakpointListener( IJavaBreakpointListener listener) { JDIDebugPlugin.getDefault().addJavaBreakpointListener(listener); } /** * Unregisters the given listener for breakpoint notifications. Has no * effect if an identical listener is not already registered. * * @param listener * breakpoint listener * @see IJavaBreakpointListener * @since 2.0 */ public static void removeJavaBreakpointListener( IJavaBreakpointListener listener) { JDIDebugPlugin.getDefault().removeJavaBreakpointListener(listener); } /** * Creates and returns a line breakpoint in the type with the given name, at * the given line number. The marker associated with the breakpoint will be * created on the specified resource. If a character range within the line * is known, it may be specified by charStart/charEnd. If hitCount is > 0, * the breakpoint will suspend execution when it is "hit" the specified * number of times. * * @param resource * the resource on which to create the associated breakpoint * marker * @param typeName * the fully qualified name of the type the breakpoint is to be * installed in. If the breakpoint is to be installed in an inner * type, it is sufficient to provide the name of the top level * enclosing type. If an inner class name is specified, it should * be formatted as the associated class file name (i.e. with * <code>$</code>). For example, * <code>example.SomeClass$InnerType</code>, could be specified, * but <code>example.SomeClass</code> is sufficient. * @param lineNumber * the lineNumber on which the breakpoint is set - line numbers * are 1 based, associated with the source file in which the * breakpoint is set * @param charStart * the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint * is set * @param charEnd * the last character index associated with the breakpoint, or -1 * if unspecified, in the source file in which the breakpoint is * set * @param hitCount * the number of times the breakpoint will be hit before * suspending execution - 0 if it should always suspend * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation, or * <code>null</code> if none. * @return a line breakpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The exception's * status contains the underlying exception responsible for * the failure.</li> * </ul> * @since 2.0 */ public static IJavaLineBreakpoint createLineBreakpoint(IResource resource, String typeName, int lineNumber, int charStart, int charEnd, int hitCount, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaLineBreakpoint(resource, typeName, lineNumber, charStart, charEnd, hitCount, register, attributes); } /** * Creates and returns a pattern breakpoint for the given resource at the * given line number, which is installed in all classes whose fully * qualified name matches the given pattern. If hitCount > 0, the breakpoint * will suspend execution when it is "hit" the specified number of times. * * @param resource * the resource on which to create the associated breakpoint * marker * @param sourceName * the name of the source file in which the breakpoint is set, or * <code>null</code>. When specified, the pattern breakpoint will * install itself in classes that have a source file name debug * attribute that matches this value, and satisfies the class * name pattern. * @param pattern * the class name pattern in which the pattern breakpoint should * be installed. The pattern breakpoint will install itself in * every class which matches the pattern. * @param lineNumber * the lineNumber on which the breakpoint is set - line numbers * are 1 based, associated with the source file in which the * breakpoint is set * @param charStart * the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint * is set * @param charEnd * the last character index associated with the breakpoint, or -1 * if unspecified, in the source file in which the breakpoint is * set * @param hitCount * the number of times the breakpoint will be hit before * suspending execution - 0 if it should always suspend * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation, or * <code>null</code> if none. * @return a pattern breakpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The exception's * status contains the underlying exception responsible for * the failure.</li> * </ul> * @deprecated use <code>createStratumBreakpoint</code> instead */ @Deprecated public static IJavaPatternBreakpoint createPatternBreakpoint( IResource resource, String sourceName, String pattern, int lineNumber, int charStart, int charEnd, int hitCount, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaPatternBreakpoint(resource, sourceName, pattern, lineNumber, charStart, charEnd, hitCount, register, attributes); } /** * Creates and returns a line breakpoint identified by its source file name * and/or path, and stratum that it is relative to. * * @param resource * the resource on which to create the associated breakpoint * marker * @param stratum * the stratum in which the source name, source path and line * number are relative, or <code>null</code>. If * <code>null</code> or if the specified stratum is not defined * for a type, the source name, source path and line number are * relative to the type's default stratum. * @param sourceName * the simple name of the source file in which the breakpoint is * set, or <code>null</code>. The breakpoint will install itself * in classes that have a source file name debug attribute that * matches this value in the specified stratum, and satisfies the * class name pattern and source path attribute. When * <code>null</code>, the source file name debug attribute is not * considered. * @param sourcePath * the qualified source file name in which the breakpoint is set, * or <code>null</code>. The breakpoint will install itself in * classes that have a source file path in the specified stratum * that matches this value, and satisfies the class name pattern * and source name attribute. When <code>null</code>, the source * path attribute is not considered. * @param classNamePattern * the class name pattern to which the breakpoint should be * restricted, or <code>null</code>. The breakpoint will install * itself in each type that matches this class name pattern, with * a satisfying source name and source path. Patterns may begin * or end with '*', which matches 0 or more characters. A pattern * that does not contain a '*' is equivalent to a pattern ending * in '*'. Specifying <code>null</code>, or an empty string is * the equivalent to "*". Multiple patterns can be specified by * delimiting the patterns with a comma - e.g. "x.y.z,a.b.c". * When multiple patterns are specified, The breakpoint will * install itself in each of the types that match any of the * specified class pattern, with a satisfying source name and * source path. * @param lineNumber * the lineNumber on which the breakpoint is set - line numbers * are 1 based, associated with the source file (stratum) in * which the breakpoint is set * @param charStart * the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint * is set * @param charEnd * the last character index associated with the breakpoint, or -1 * if unspecified, in the source file in which the breakpoint is * set * @param hitCount * the number of times the breakpoint will be hit before * suspending execution - 0 if it should always suspend * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation, or * <code>null</code> if none. * @return a stratum breakpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The exception's * status contains the underlying exception responsible for * the failure.</li> * </ul> * @since 3.0 */ public static IJavaStratumLineBreakpoint createStratumBreakpoint( IResource resource, String stratum, String sourceName, String sourcePath, String classNamePattern, int lineNumber, int charStart, int charEnd, int hitCount, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaStratumLineBreakpoint(resource, stratum, sourceName, sourcePath, classNamePattern, lineNumber, charStart, charEnd, hitCount, register, attributes); } /** * Creates and returns a target pattern breakpoint for the given resource at * the given line number. Clients must set the class name pattern per target * for this type of breakpoint. If hitCount > 0, the breakpoint will suspend * execution when it is "hit" the specified number of times. * * @param resource * the resource on which to create the associated breakpoint * marker * @param sourceName * the name of the source file in which the breakpoint is set, or * <code>null</code>. When specified, the pattern breakpoint will * install itself in classes that have a source file name debug * attribute that matches this value, and satisfies the class * name pattern. * @param lineNumber * the lineNumber on which the breakpoint is set - line numbers * are 1 based, associated with the source file in which the * breakpoint is set * @param charStart * the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint * is set * @param charEnd * the last character index associated with the breakpoint, or -1 * if unspecified, in the source file in which the breakpoint is * set * @param hitCount * the number of times the breakpoint will be hit before * suspending execution - 0 if it should always suspend * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation, or * <code>null</code> if none. * @return a target pattern breakpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The exception's * status contains the underlying exception responsible for * the failure.</li> * </ul> */ public static IJavaTargetPatternBreakpoint createTargetPatternBreakpoint( IResource resource, String sourceName, int lineNumber, int charStart, int charEnd, int hitCount, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaTargetPatternBreakpoint(resource, sourceName, lineNumber, charStart, charEnd, hitCount, register, attributes); } /** * Creates and returns an exception breakpoint for an exception with the * given name. The marker associated with the breakpoint will be created on * the specified resource. Caught and uncaught specify where the exception * should cause thread suspensions - that is, in caught and/or uncaught * locations. Checked indicates if the given exception is a checked * exception. * * @param resource * the resource on which to create the associated breakpoint * marker * @param exceptionName * the fully qualified name of the exception for which to create * the breakpoint * @param caught * whether to suspend in caught locations * @param uncaught * whether to suspend in uncaught locations * @param checked * whether the exception is a checked exception (i.e. compiler * detected) * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation or * <code>null</code> if none. * @return an exception breakpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The exception's * status contains the underlying exception responsible for * the failure.</li> * </ul> * @since 2.0 */ public static IJavaExceptionBreakpoint createExceptionBreakpoint( IResource resource, String exceptionName, boolean caught, boolean uncaught, boolean checked, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaExceptionBreakpoint(resource, exceptionName, caught, uncaught, checked, register, attributes); } /** * Creates and returns a watchpoint on a field with the given name in a type * with the given name. The marker associated with the breakpoint will be * created on the specified resource. If hitCount > 0, the breakpoint will * suspend execution when it is "hit" the specified number of times. * * @param resource * the resource on which to create the associated breakpoint * marker * @param typeName * the fully qualified name of the type the breakpoint is to be * installed in. If the breakpoint is to be installed in an inner * type, it is sufficient to provide the name of the top level * enclosing type. If an inner class name is specified, it should * be formatted as the associated class file name (i.e. with * <code>$</code>). For example, * <code>example.SomeClass$InnerType</code>, could be specified, * but <code>example.SomeClass</code> is sufficient. * @param fieldName * the name of the field on which to suspend (on access or * modification) * @param lineNumber * the lineNumber on which the breakpoint is set - line numbers * are 1 based, associated with the source file in which the * breakpoint is set * @param charStart * the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint * is set * @param charEnd * the last character index associated with the breakpoint, or -1 * if unspecified, in the source file in which the breakpoint is * set * @param hitCount * the number of times the breakpoint will be hit before * suspending execution - 0 if it should always suspend * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation, or * <code>null</code> if none. * @return a watchpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The * CoreException's status contains the underlying exception * responsible for the failure.</li> * </ul> * @since 2.0 */ public static IJavaWatchpoint createWatchpoint(IResource resource, String typeName, String fieldName, int lineNumber, int charStart, int charEnd, int hitCount, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaWatchpoint(resource, typeName, fieldName, lineNumber, charStart, charEnd, hitCount, register, attributes); } /** * Creates and returns a method breakpoint with the specified criteria. * * @param resource * the resource on which to create the associated breakpoint * marker * @param typePattern * the pattern specifying the fully qualified name of type(s) * this breakpoint suspends execution in. Patterns are limited to * exact matches and patterns that begin or end with '*'. * @param methodName * the name of the method(s) this breakpoint suspends execution * in, or <code>null</code> if this breakpoint does not suspend * execution based on method name * @param methodSignature * the signature of the method(s) this breakpoint suspends * execution in, or <code>null</code> if this breakpoint does not * suspend execution based on method signature * @param entry * whether this breakpoint causes execution to suspend on entry * of methods * @param exit * whether this breakpoint causes execution to suspend on exit of * methods * @param nativeOnly * whether this breakpoint causes execution to suspend on * entry/exit of native methods only * @param lineNumber * the lineNumber on which the breakpoint is set - line numbers * are 1 based, associated with the source file in which the * breakpoint is set * @param charStart * the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint * is set * @param charEnd * the last character index associated with the breakpoint, or -1 * if unspecified, in the source file in which the breakpoint is * set * @param hitCount * the number of times the breakpoint will be hit before * suspending execution - 0 if it should always suspend * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation, or * <code>null</code> if none. * @return a method breakpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The exception's * status contains the underlying exception responsible for * the failure.</li> * </ul> * @since 2.0 */ public static IJavaMethodBreakpoint createMethodBreakpoint( IResource resource, String typePattern, String methodName, String methodSignature, boolean entry, boolean exit, boolean nativeOnly, int lineNumber, int charStart, int charEnd, int hitCount, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaMethodBreakpoint(resource, typePattern, methodName, methodSignature, entry, exit, nativeOnly, lineNumber, charStart, charEnd, hitCount, register, attributes); } /** * Creates and returns a method entry breakpoint with the specified * criteria. A method entry breakpoint will only be installed for methods * that have executable code (i.e. will not work for native methods). * * @param resource * the resource on which to create the associated breakpoint * marker * @param typeName * the fully qualified name of type this breakpoint suspends * execution in. * @param methodName * the name of the method this breakpoint suspends execution in * @param methodSignature * the signature of the method this breakpoint suspends execution * in * @param lineNumber * the lineNumber on which the breakpoint is set - line numbers * are 1 based, associated with the source file in which the * breakpoint is set * @param charStart * the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint * is set * @param charEnd * the last character index associated with the breakpoint, or -1 * if unspecified, in the source file in which the breakpoint is * set * @param hitCount * the number of times the breakpoint will be hit before * suspending execution - 0 if it should always suspend * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation, or * <code>null</code> if none. * @return a method entry breakpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The exception's * status contains the underlying exception responsible for * the failure.</li> * </ul> * @since 2.0 */ public static IJavaMethodEntryBreakpoint createMethodEntryBreakpoint( IResource resource, String typeName, String methodName, String methodSignature, int lineNumber, int charStart, int charEnd, int hitCount, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaMethodEntryBreakpoint(resource, typeName, methodName, methodSignature, lineNumber, charStart, charEnd, hitCount, register, attributes); } /** * Returns a Java line breakpoint that is already registered with the * breakpoint manager for a type with the given name at the given line * number. * * @param typeName * fully qualified type name * @param lineNumber * line number * @return a Java line breakpoint that is already registered with the * breakpoint manager for a type with the given name at the given * line number or <code>null</code> if no such breakpoint is * registered * @exception CoreException * if unable to retrieve the associated marker attributes * (line number). */ public static IJavaLineBreakpoint lineBreakpointExists(String typeName, int lineNumber) throws CoreException { String modelId = getPluginIdentifier(); String markerType = JavaLineBreakpoint.getMarkerType(); IBreakpointManager manager = DebugPlugin.getDefault() .getBreakpointManager(); IBreakpoint[] breakpoints = manager.getBreakpoints(modelId); for (int i = 0; i < breakpoints.length; i++) { if (!(breakpoints[i] instanceof IJavaLineBreakpoint)) continue; IJavaLineBreakpoint breakpoint = (IJavaLineBreakpoint) breakpoints[i]; IMarker marker = breakpoint.getMarker(); if (marker != null && marker.exists() && marker.getType().equals(markerType)) { String breakpointTypeName = breakpoint.getTypeName(); if (JavaDebugUtils.typeNamesEqual(breakpointTypeName, typeName) || (breakpointTypeName != null && breakpointTypeName.startsWith(typeName + '$'))) if (breakpoint.getLineNumber() == lineNumber) return breakpoint; } } return null; } /** * Returns a Java line breakpoint that is already registered with the * breakpoint manager for a type with the given name at the given line * number in the given resource. * * @param resource * the resource * @param typeName * fully qualified type name * @param lineNumber * line number * @return a Java line breakpoint that is already registered with the * breakpoint manager for a type with the given name at the given * line number or <code>null</code> if no such breakpoint is * registered * @exception CoreException * if unable to retrieve the associated marker attributes * (line number). * @since 3.1 */ public static IJavaLineBreakpoint lineBreakpointExists(IResource resource, String typeName, int lineNumber) throws CoreException { String modelId = getPluginIdentifier(); String markerType = JavaLineBreakpoint.getMarkerType(); IBreakpointManager manager = DebugPlugin.getDefault() .getBreakpointManager(); IBreakpoint[] breakpoints = manager.getBreakpoints(modelId); for (int i = 0; i < breakpoints.length; i++) { if (!(breakpoints[i] instanceof IJavaLineBreakpoint)) continue; IJavaLineBreakpoint breakpoint = (IJavaLineBreakpoint) breakpoints[i]; IMarker marker = breakpoint.getMarker(); if (marker != null && marker.exists() && marker.getType().equals(markerType)) { String breakpointTypeName = breakpoint.getTypeName(); if ((JavaDebugUtils.typeNamesEqual(breakpointTypeName, typeName) || (breakpointTypeName != null && breakpointTypeName.startsWith(typeName + '$'))) && breakpoint.getLineNumber() == lineNumber && resource.equals(marker.getResource())) return breakpoint; } } return null; } /** * Returns the preference store for this plug-in or <code>null</code> if the store is not available. <br> * <br> * The Preferences class has been deprecated and clients should directly be using the InstanceScope node for JDIDebugPlugin rather than this * convenience method. <br> * <br> * For example: * * <pre> * IEclipsePreferences node = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier()); * if(node != null) { * ... * } * </pre> * * @return the preference store for this plug-in * @since 2.0 * @deprecated the {@link Preferences} class has been deprecated, use the {@link IEclipsePreferences} accessors instead */ @Deprecated public static Preferences getPreferences() { JDIDebugPlugin deflt = JDIDebugPlugin.getDefault(); if (deflt != null) return deflt.getPluginPreferences(); return null; } /** * Saves the preference store for this plug-in. * <br><br> * The Preferences class has been deprecated and clients should directly be using the * InstanceScope node for JDIDebugPlugin rather than this convenience method. * <br><br> * For example: * <pre> * IEclipsePreferences node = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier()); * if(node != null) { * try { * node.flush(); * } catch (BackingStoreException e) { * log(e); * } * } * </pre> * @since 2.0 * @deprecated the {@link Preferences} class has been deprecated, use the {@link IEclipsePreferences} accessors instead */ @Deprecated public static void savePreferences() { IEclipsePreferences node = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier()); if(node != null) try { node.flush(); } catch (BackingStoreException bse) { JDIDebugPlugin.log(bse); } } /** * Creates and returns a class prepare breakpoint for a type with the given * name. The marker associated with the breakpoint will be created on the * specified resource. * * @param resource * the resource on which to create the associated breakpoint * marker * @param typeName * the fully qualified name of the type for which to create the * breakpoint * @param memberType * one of <code>TYPE_CLASS</code> or <code>TYPE_INTERFACE</code> * @param charStart * the first character index associated with the breakpoint, or * -1 if unspecified, in the source file in which the breakpoint * is set * @param charEnd * the last character index associated with the breakpoint, or -1 * if unspecified, in the source file in which the breakpoint is * set * @param register * whether to add this breakpoint to the breakpoint manager * @param attributes * a map of client defined attributes that should be assigned to * the underlying breakpoint marker on creation or * <code>null</code> if none. * @return a class prepare breakpoint * @exception CoreException * If this method fails. Reasons include: * <ul> * <li>Failure creating underlying marker. The exception's * status contains the underlying exception responsible for * the failure.</li> * </ul> * @since 3.0 */ public static IJavaClassPrepareBreakpoint createClassPrepareBreakpoint( IResource resource, String typeName, int memberType, int charStart, int charEnd, boolean register, Map<String, Object> attributes) throws CoreException { if (attributes == null) attributes = new HashMap<>(10); return new JavaClassPrepareBreakpoint(resource, typeName, memberType, charStart, charEnd, register, attributes); } }