This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 197707
Collapse All | Expand All

(-)a/api.debugger.jpda/src/org/netbeans/api/debugger/jpda/JPDABreakpoint.java (+5 lines)
Lines 251-256 Link Here
251
    synchronized JPDADebugger getSession() {
251
    synchronized JPDADebugger getSession() {
252
        return session;
252
        return session;
253
    }
253
    }
254
255
    @Override
256
    public boolean canHaveDependentBreakpoints() {
257
        return true;
258
    }
254
    
259
    
255
    /** 
260
    /** 
256
     * Adds a JPDABreakpointListener.
261
     * Adds a JPDABreakpointListener.
(-)a/api.debugger/apichanges.xml (+25 lines)
Lines 463-468 Link Here
463
        <issue number="191394"/>
463
        <issue number="191394"/>
464
    </change>
464
    </change>
465
465
466
    <change id="DependentBreakpoints">
467
        <api name="DebuggerCoreAPI"/>
468
        <summary>Added a possibility to enable/disable other breakpoints when one is hit.</summary>
469
        <version major="1" minor="34"/>
470
        <date day="19" month="12" year="2011"/>
471
        <author login="mentlicher"/>
472
        <compatibility addition="yes" source="compatible" binary="compatible"/>
473
        <description>
474
            Four methods are added to the Breakpoint class, that allow to
475
            get or set a set of breakpoints, that are enabled or disabled when
476
            the breakpoint is hit. One test method is provided, which determines
477
            if the dependent breakpoints are supported by the implementation.
478
            <p>
479
                Added methods:<br/>
480
                <code>Breakpoint.canHaveDependentBreakpoints()</code>,
481
                <code>Breakpoint.getBreakpointsToEnable()</code>,
482
                <code>Breakpoint.setBreakpointsToEnable()</code>,
483
                <code>Breakpoint.getBreakpointsToDisable()</code>,
484
                <code>Breakpoint.setBreakpointsToDisable()</code>.
485
            </p>
486
        </description>
487
        <class package="org.netbeans.api.debugger" name="Breakpoint" />
488
        <issue number="197707"/>
489
    </change>
490
466
</changes>
491
</changes>
467
492
468
  <!-- Now the surrounding HTML text and document structure: -->
493
  <!-- Now the surrounding HTML text and document structure: -->
(-)a/api.debugger/manifest.mf (-1 / +1 lines)
Lines 1-5 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.netbeans.api.debugger/1
2
OpenIDE-Module: org.netbeans.api.debugger/1
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/api/debugger/Bundle.properties
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/api/debugger/Bundle.properties
4
OpenIDE-Module-Specification-Version: 1.33
4
OpenIDE-Module-Specification-Version: 1.34
5
OpenIDE-Module-Layer: org/netbeans/api/debugger/layer.xml
5
OpenIDE-Module-Layer: org/netbeans/api/debugger/layer.xml
(-)a/api.debugger/nbproject/project.xml (+9 lines)
Lines 50-55 Link Here
50
            <code-name-base>org.netbeans.api.debugger</code-name-base>
50
            <code-name-base>org.netbeans.api.debugger</code-name-base>
51
            <module-dependencies>
51
            <module-dependencies>
52
                <dependency>
52
                <dependency>
53
                    <code-name-base>org.netbeans.api.annotations.common</code-name-base>
54
                    <build-prerequisite/>
55
                    <compile-dependency/>
56
                    <run-dependency>
57
                        <release-version>1</release-version>
58
                        <specification-version>1.11</specification-version>
59
                    </run-dependency>
60
                </dependency>
61
                <dependency>
53
                    <code-name-base>org.netbeans.modules.projectapi</code-name-base>
62
                    <code-name-base>org.netbeans.modules.projectapi</code-name-base>
54
                    <build-prerequisite/>
63
                    <build-prerequisite/>
55
                    <compile-dependency/>
64
                    <compile-dependency/>
(-)a/api.debugger/src/org/netbeans/api/debugger/Breakpoint.java (+92 lines)
Lines 46-51 Link Here
46
46
47
import java.beans.PropertyChangeListener;
47
import java.beans.PropertyChangeListener;
48
import java.beans.PropertyChangeSupport;
48
import java.beans.PropertyChangeSupport;
49
import java.util.Collections;
50
import java.util.Set;
51
import org.netbeans.api.annotations.common.NonNull;
49
import org.netbeans.api.project.Project;
52
import org.netbeans.api.project.Project;
50
import org.openide.filesystems.FileObject;
53
import org.openide.filesystems.FileObject;
51
54
Lines 86-91 Link Here
86
    private String                      validityMessage;
89
    private String                      validityMessage;
87
    private int                         hitCountFilter;
90
    private int                         hitCountFilter;
88
    private HIT_COUNT_FILTERING_STYLE   hitCountFilteringStyle;
91
    private HIT_COUNT_FILTERING_STYLE   hitCountFilteringStyle;
92
    private volatile Set<Breakpoint>    breakpointsToEnable = Collections.EMPTY_SET;
93
    private volatile Set<Breakpoint>    breakpointsToDisable = Collections.EMPTY_SET;
89
    
94
    
90
    { pcs = new PropertyChangeSupport (this); }
95
    { pcs = new PropertyChangeSupport (this); }
91
96
Lines 230-235 Link Here
230
        return null;
235
        return null;
231
    }
236
    }
232
    
237
    
238
    /**
239
     * Determines if the breakpoint supports dependent breakpoints.
240
     * If true, get/setBreakpointsToEnable/Disable methods can be used to get
241
     * or set dependent breakpoints.
242
     * If false, the methods throw an UnsupportedOperationException.
243
     * @return <code>true</code> if the dependent breakpoints are supported,
244
     * <code>false</code> otherwise.
245
     * @since 1.34
246
     */
247
    public boolean canHaveDependentBreakpoints() {
248
        return false;
249
    }
250
    
251
    /**
252
     * Get the set of breakpoints that will be enabled after this breakpoint
253
     * is hit.
254
     * <p>
255
     * Not all breakpoint implementations honor dependent breakpoints.
256
     * Use {@link #canHaveDependentBreakpoints()} to determine if the operation is supported.
257
     * @return The set of breakpoints.
258
     * @throws UnsupportedOperationException if the breakpoint does not support
259
     * dependent breakpoints - see {@link #canHaveDependentBreakpoints()}.
260
     * @since 1.34
261
     */
262
    @NonNull
263
    public Set<Breakpoint> getBreakpointsToEnable() {
264
        if (!canHaveDependentBreakpoints()) {
265
            throw new UnsupportedOperationException("Can not have dependent breakpoints."); // NOI18N
266
        }
267
        return breakpointsToEnable;
268
    }
269
    
270
    /**
271
     * Get the set of breakpoints that will be disabled after this breakpoint
272
     * is hit.
273
     * <p>
274
     * Not all breakpoint implementations honor dependent breakpoints.
275
     * Use {@link #canHaveDependentBreakpoints()} to determine if the operation is supported.
276
     * @throws UnsupportedOperationException if the breakpoint does not support
277
     * dependent breakpoints - see {@link #canHaveDependentBreakpoints()}.
278
     * @return The set of breakpoints.
279
     * @since 1.34
280
     */
281
    @NonNull
282
    public Set<Breakpoint> getBreakpointsToDisable() {
283
        if (!canHaveDependentBreakpoints()) {
284
            throw new UnsupportedOperationException("Can not have dependent breakpoints."); // NOI18N
285
        }
286
        return breakpointsToDisable;
287
    }
288
    
289
    /**
290
     * Set the set of breakpoints that will be enabled after this breakpoint
291
     * is hit.
292
     * <p>
293
     * Not all breakpoint implementations honor dependent breakpoints.
294
     * Use {@link #canHaveDependentBreakpoints()} to determine if the operation is supported.
295
     * @param breakpointsToEnable The set of breakpoints.
296
     * @throws UnsupportedOperationException if the breakpoint does not support
297
     * dependent breakpoints - see {@link #canHaveDependentBreakpoints()}.
298
     * @since 1.34
299
     */
300
    public void setBreakpointsToEnable(@NonNull Set<Breakpoint> breakpointsToEnable) {
301
        if (!canHaveDependentBreakpoints()) {
302
            throw new UnsupportedOperationException("Can not have dependent breakpoints."); // NOI18N
303
        }
304
        this.breakpointsToEnable = breakpointsToEnable;
305
    }
306
    
307
    /**
308
     * Set the set of breakpoints that will be disabled after this breakpoint
309
     * is hit.
310
     * <p>
311
     * Not all breakpoint implementations honor dependent breakpoints.
312
     * Use {@link #canHaveDependentBreakpoints()} to determine if the operation is supported.
313
     * @param breakpointsToEnable The set of breakpoints.
314
     * @throws UnsupportedOperationException if the breakpoint does not support
315
     * dependent breakpoints - see {@link #canHaveDependentBreakpoints()}.
316
     * @since 1.34
317
     */
318
    public void setBreakpointsToDisable(@NonNull Set<Breakpoint> breakpointsToDisable) {
319
        if (!canHaveDependentBreakpoints()) {
320
            throw new UnsupportedOperationException("Can not have dependent breakpoints."); // NOI18N
321
        }
322
        this.breakpointsToDisable = breakpointsToDisable;
323
    }
324
    
233
    /** 
325
    /** 
234
     * Add a listener to property changes.
326
     * Add a listener to property changes.
235
     *
327
     *
(-)a/debugger.jpda/src/org/netbeans/modules/debugger/jpda/breakpoints/BreakpointImpl.java (+13 lines)
Lines 66-71 Link Here
66
import java.beans.PropertyChangeEvent;
66
import java.beans.PropertyChangeEvent;
67
import java.util.HashMap;
67
import java.util.HashMap;
68
import java.util.Map;
68
import java.util.Map;
69
import java.util.Set;
69
import java.util.logging.Level;
70
import java.util.logging.Level;
70
import java.util.logging.Logger;
71
import java.util.logging.Logger;
71
import javax.swing.SwingUtilities;
72
import javax.swing.SwingUtilities;
Lines 471-476 Link Here
471
            getBreakpoint (),
472
            getBreakpoint (),
472
            e
473
            e
473
        );
474
        );
475
        enableDisableDependentBreakpoints();
474
        Integer brkpSuspend = (Integer) event.request().getProperty("brkpSuspend");
476
        Integer brkpSuspend = (Integer) event.request().getProperty("brkpSuspend");
475
        if (brkpSuspend == null) {
477
        if (brkpSuspend == null) {
476
            brkpSuspend = getBreakpoint().getSuspend();
478
            brkpSuspend = getBreakpoint().getSuspend();
Lines 493-498 Link Here
493
        return resume; 
495
        return resume; 
494
    }
496
    }
495
    
497
    
498
    private void enableDisableDependentBreakpoints() {
499
        Set<Breakpoint> breakpoints = breakpoint.getBreakpointsToEnable();
500
        for (Breakpoint b : breakpoints) {
501
            b.enable();
502
        }
503
        breakpoints = breakpoint.getBreakpointsToDisable();
504
        for (Breakpoint b : breakpoints) {
505
            b.disable();
506
        }
507
    }
508
    
496
    private boolean checkWhetherResumeToFinishStep(ThreadReference thread) throws InternalExceptionWrapper, VMDisconnectedExceptionWrapper {
509
    private boolean checkWhetherResumeToFinishStep(ThreadReference thread) throws InternalExceptionWrapper, VMDisconnectedExceptionWrapper {
497
        List<StepRequest> stepRequests = EventRequestManagerWrapper.stepRequests(
510
        List<StepRequest> stepRequests = EventRequestManagerWrapper.stepRequests(
498
                VirtualMachineWrapper.eventRequestManager(MirrorWrapper.virtualMachine(thread)));
511
                VirtualMachineWrapper.eventRequestManager(MirrorWrapper.virtualMachine(thread)));
(-)a/debugger.jpda/src/org/netbeans/modules/debugger/jpda/breakpoints/BreakpointsFromGroup.java (+146 lines)
Line 0 Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2011 Oracle and/or its affiliates. All rights reserved.
5
 *
6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7
 * Other names may be trademarks of their respective owners.
8
 *
9
 * The contents of this file are subject to the terms of either the GNU
10
 * General Public License Version 2 only ("GPL") or the Common
11
 * Development and Distribution License("CDDL") (collectively, the
12
 * "License"). You may not use this file except in compliance with the
13
 * License. You can obtain a copy of the License at
14
 * http://www.netbeans.org/cddl-gplv2.html
15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16
 * specific language governing permissions and limitations under the
17
 * License.  When distributing the software, include this License Header
18
 * Notice in each file and include the License file at
19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
20
 * particular file as subject to the "Classpath" exception as provided
21
 * by Oracle in the GPL Version 2 section of the License file that
22
 * accompanied this code. If applicable, add the following below the
23
 * License Header, with the fields enclosed by brackets [] replaced by
24
 * your own identifying information:
25
 * "Portions Copyrighted [year] [name of copyright owner]"
26
 *
27
 * If you wish your version of this file to be governed by only the CDDL
28
 * or only the GPL Version 2, indicate your decision by adding
29
 * "[Contributor] elects to include this software in this distribution
30
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
31
 * single choice of license, a recipient has the option to distribute
32
 * your version of this file under either the CDDL, the GPL Version 2 or
33
 * to extend the choice of license to its licensees as provided above.
34
 * However, if you add GPL Version 2 code and therefore, elected the GPL
35
 * Version 2 license, then the option applies only if the new code is
36
 * made subject to such option by the copyright holder.
37
 *
38
 * Contributor(s):
39
 *
40
 * Portions Copyrighted 2011 Sun Microsystems, Inc.
41
 */
42
package org.netbeans.modules.debugger.jpda.breakpoints;
43
44
import java.util.ArrayList;
45
import java.util.Collection;
46
import java.util.Iterator;
47
import java.util.List;
48
import java.util.Set;
49
50
import org.netbeans.api.debugger.Breakpoint;
51
import org.netbeans.api.debugger.DebuggerManager;
52
53
/**
54
 * Set of breakpoints from a group.
55
 * 
56
 * @author Martin
57
 */
58
public final class BreakpointsFromGroup implements Set<Breakpoint> {
59
    
60
    private final String groupName;
61
    
62
    public BreakpointsFromGroup(String groupName) {
63
        this.groupName = groupName;
64
    }
65
    
66
    public String getGroupName() {
67
        return groupName;
68
    }
69
    
70
    private List<Breakpoint> getBreakpointsFromGroup() {
71
        List<Breakpoint> breakpoints = new ArrayList<Breakpoint>();
72
        Breakpoint[] bps = DebuggerManager.getDebuggerManager().getBreakpoints();
73
        for (Breakpoint b : bps) {
74
            if (groupName.equals(b.getGroupName())) {
75
                breakpoints.add(b);
76
            }
77
        }
78
        return breakpoints;
79
    }
80
81
    @Override
82
    public int size() {
83
        return getBreakpointsFromGroup().size();
84
    }
85
86
    @Override
87
    public boolean isEmpty() {
88
        return getBreakpointsFromGroup().isEmpty();
89
    }
90
91
    @Override
92
    public boolean contains(Object o) {
93
        return getBreakpointsFromGroup().contains(o);
94
    }
95
96
    @Override
97
    public Iterator<Breakpoint> iterator() {
98
        return getBreakpointsFromGroup().iterator();
99
    }
100
101
    @Override
102
    public boolean containsAll(Collection<?> c) {
103
        return getBreakpointsFromGroup().containsAll(c);
104
    }
105
106
    @Override
107
    public Object[] toArray() {
108
        return getBreakpointsFromGroup().toArray();
109
    }
110
111
    @Override
112
    public <T> T[] toArray(T[] a) {
113
        return getBreakpointsFromGroup().toArray(a);
114
    }
115
116
    @Override
117
    public boolean add(Breakpoint e) {
118
        throw new UnsupportedOperationException("Not supported.");
119
    }
120
121
    @Override
122
    public boolean remove(Object o) {
123
        throw new UnsupportedOperationException("Not supported.");
124
    }
125
126
    @Override
127
    public boolean addAll(Collection<? extends Breakpoint> c) {
128
        throw new UnsupportedOperationException("Not supported.");
129
    }
130
131
    @Override
132
    public boolean retainAll(Collection<?> c) {
133
        throw new UnsupportedOperationException("Not supported.");
134
    }
135
136
    @Override
137
    public boolean removeAll(Collection<?> c) {
138
        throw new UnsupportedOperationException("Not supported.");
139
    }
140
141
    @Override
142
    public void clear() {
143
        throw new UnsupportedOperationException("Not supported.");
144
    }
145
    
146
}
(-)a/debugger.jpda/src/org/netbeans/modules/debugger/jpda/breakpoints/BreakpointsReader.java (+25 lines)
Lines 47-52 Link Here
47
import java.beans.PropertyChangeEvent;
47
import java.beans.PropertyChangeEvent;
48
import java.beans.PropertyChangeListener;
48
import java.beans.PropertyChangeListener;
49
import java.util.Map;
49
import java.util.Map;
50
import java.util.Set;
50
import java.util.WeakHashMap;
51
import java.util.WeakHashMap;
51
52
52
import org.netbeans.api.debugger.Breakpoint;
53
import org.netbeans.api.debugger.Breakpoint;
Lines 274-279 Link Here
274
            b.enable ();
275
            b.enable ();
275
        else
276
        else
276
            b.disable ();
277
            b.disable ();
278
        String breakpointsToEnableGroup = properties.getString("breakpointsToEnableGroup", null);
279
        if (breakpointsToEnableGroup != null) {
280
            b.setBreakpointsToEnable(new BreakpointsFromGroup(breakpointsToEnableGroup));
281
        }
282
        String breakpointsToDisableGroup = properties.getString("breakpointsToDisableGroup", null);
283
        if (breakpointsToDisableGroup != null) {
284
            b.setBreakpointsToDisable(new BreakpointsFromGroup(breakpointsToDisableGroup));
285
        }
277
        return b;
286
        return b;
278
    }
287
    }
279
    
288
    
Lines 292-297 Link Here
292
        properties.setInt(JPDABreakpoint.PROP_HIT_COUNT_FILTER, b.getHitCountFilter());
301
        properties.setInt(JPDABreakpoint.PROP_HIT_COUNT_FILTER, b.getHitCountFilter());
293
        Breakpoint.HIT_COUNT_FILTERING_STYLE style = b.getHitCountFilteringStyle();
302
        Breakpoint.HIT_COUNT_FILTERING_STYLE style = b.getHitCountFilteringStyle();
294
        properties.setInt(JPDABreakpoint.PROP_HIT_COUNT_FILTER+"_style", style != null ? style.ordinal() : 0); // NOI18N
303
        properties.setInt(JPDABreakpoint.PROP_HIT_COUNT_FILTER+"_style", style != null ? style.ordinal() : 0); // NOI18N
304
        Set<Breakpoint> breakpointsToEnable = b.getBreakpointsToEnable();
305
        String breakpointsToEnableGroup;
306
        if (breakpointsToEnable instanceof BreakpointsFromGroup) {
307
            breakpointsToEnableGroup = ((BreakpointsFromGroup) breakpointsToEnable).getGroupName();
308
        } else {
309
            breakpointsToEnableGroup = null;
310
        }
311
        properties.setString("breakpointsToEnableGroup", breakpointsToEnableGroup);
312
        Set<Breakpoint> breakpointsToDisable = b.getBreakpointsToDisable();
313
        String breakpointsToDisableGroup;
314
        if (breakpointsToDisable instanceof BreakpointsFromGroup) {
315
            breakpointsToDisableGroup = ((BreakpointsFromGroup) breakpointsToDisable).getGroupName();
316
        } else {
317
            breakpointsToDisableGroup = null;
318
        }
319
        properties.setString("breakpointsToDisableGroup", breakpointsToDisableGroup);
295
        
320
        
296
        if (object instanceof LineBreakpoint) {
321
        if (object instanceof LineBreakpoint) {
297
            LineBreakpoint lb = (LineBreakpoint) object;
322
            LineBreakpoint lb = (LineBreakpoint) object;

Return to bug 197707