30
30
import java .beans .PropertyChangeListener ;
31
31
import java .beans .PropertyChangeSupport ;
32
32
import java .lang .ref .WeakReference ;
33
- import java .util .Collections ;
34
33
import java .util .HashSet ;
35
34
import java .util .Set ;
36
35
import org .openide .util .RequestProcessor ;
@@ -68,6 +67,7 @@ public abstract class DataSource {
68
67
private boolean visible = true ;
69
68
private Storage storage ;
70
69
private DataSourceContainer repository ;
70
+ private final Object propertiesLock = new Object ();
71
71
private PropertyChangeSupport changeSupport ;
72
72
private Set <ComparableWeakReference <DataRemovedListener >> removedListeners ;
73
73
@@ -234,7 +234,9 @@ public boolean supportsUserRemove() {
234
234
public final void notifyWhenRemoved (DataRemovedListener listener ) {
235
235
if (listener == null ) throw new IllegalArgumentException ("Listener cannot be null" ); // NOI18N
236
236
if (isRemoved ()) listener .dataRemoved (this );
237
- else getRemovedListeners ().add (new ComparableWeakReference <>(listener ));
237
+ else synchronized (propertiesLock ) {
238
+ getRemovedListeners ().add (new ComparableWeakReference <>(listener ));
239
+ }
238
240
}
239
241
240
242
/**
@@ -274,14 +276,18 @@ final void removeImpl() {
274
276
275
277
this .owner = null ;
276
278
isRemoved = true ;
279
+ Set <ComparableWeakReference <DataRemovedListener >> listenersCopy ;
277
280
278
- if (!hasRemovedListeners ()) return ;
279
- Set <ComparableWeakReference <DataRemovedListener >> listeners = getRemovedListeners ();
280
- for (WeakReference <DataRemovedListener > listenerReference : listeners ) {
281
+ synchronized (propertiesLock ) {
282
+ if (!hasRemovedListeners ()) return ;
283
+ Set <ComparableWeakReference <DataRemovedListener >> listeners = getRemovedListeners ();
284
+ listenersCopy = new HashSet <>(listeners );
285
+ listeners .clear ();
286
+ }
287
+ for (WeakReference <DataRemovedListener > listenerReference : listenersCopy ) {
281
288
DataRemovedListener listener = listenerReference .get ();
282
289
if (listener != null ) listener .dataRemoved (this );
283
290
}
284
- listeners .clear ();
285
291
}
286
292
287
293
@@ -300,19 +306,23 @@ protected Storage createStorage() {
300
306
*
301
307
* @return instance of PropertyChangeSupport used for processing property changes.
302
308
*/
303
- protected final synchronized PropertyChangeSupport getChangeSupport () {
304
- if (changeSupport == null ) changeSupport = new PropertyChangeSupport (this );
305
- return changeSupport ;
309
+ protected final PropertyChangeSupport getChangeSupport () {
310
+ synchronized (propertiesLock ) {
311
+ if (changeSupport == null ) changeSupport = new PropertyChangeSupport (this );
312
+ return changeSupport ;
313
+ }
306
314
}
307
315
308
316
309
- final boolean hasRemovedListeners () {
317
+ private boolean hasRemovedListeners () {
310
318
return removedListeners != null ;
311
319
}
312
320
313
- final synchronized Set <ComparableWeakReference <DataRemovedListener >> getRemovedListeners () {
314
- if (!hasRemovedListeners ()) removedListeners = Collections .synchronizedSet (new HashSet <>());
315
- return removedListeners ;
321
+ final Set <ComparableWeakReference <DataRemovedListener >> getRemovedListeners () {
322
+ synchronized (propertiesLock ) {
323
+ if (!hasRemovedListeners ()) removedListeners = new HashSet <>();
324
+ return removedListeners ;
325
+ }
316
326
}
317
327
318
328
}
0 commit comments