diff options
author | Matthew Hall | 2009-07-17 17:33:33 +0000 |
---|---|---|
committer | Matthew Hall | 2009-07-17 17:33:33 +0000 |
commit | 0d7df33037e3570496d426d36b263911aabca099 (patch) | |
tree | 1e4639bcbca04a804b0141d19dd02dfc210460d6 | |
parent | 813318f445565da0aa4d4e575a164dc1e06c9c08 (diff) | |
download | org.eclipse.e4.databinding-0d7df33037e3570496d426d36b263911aabca099.tar.gz org.eclipse.e4.databinding-0d7df33037e3570496d426d36b263911aabca099.tar.xz org.eclipse.e4.databinding-0d7df33037e3570496d426d36b263911aabca099.zip |
FIXED - bug 283204: [DataBinding] CheckableCheckedElementsObservableSet#clear can cause ConcurrentModificationExceptionM20090812-0800bM20090812-0800aM20090812-0800M20090722-0800
https://bugs.eclipse.org/bugs/show_bug.cgi?id=283204
4 files changed, 78 insertions, 11 deletions
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsObservableSet.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsObservableSet.java index 1b77a970..09a29fa9 100644 --- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsObservableSet.java +++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsObservableSet.java @@ -7,14 +7,13 @@ * * Contributors: * Matthew Hall - initial API and implementation (bug 124684) - * Matthew Hall - bug 259380 + * Matthew Hall - bug 259380, 283204 ******************************************************************************/ package org.eclipse.jface.internal.databinding.viewers; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -25,6 +24,7 @@ import org.eclipse.core.runtime.Assert; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ICheckable; +import org.eclipse.jface.viewers.IElementComparer; /** * @@ -35,6 +35,7 @@ public class CheckableCheckedElementsObservableSet extends private ICheckable checkable; private Set wrappedSet; private Object elementType; + private IElementComparer elementComparer; private ICheckStateListener listener; /** @@ -46,17 +47,21 @@ public class CheckableCheckedElementsObservableSet extends * the set being wrapped * @param elementType * type of elements in the set + * @param elementComparer + * element comparer * @param checkable * the ICheckable to track */ public CheckableCheckedElementsObservableSet(Realm realm, - final Set wrappedSet, Object elementType, ICheckable checkable) { + final Set wrappedSet, Object elementType, + IElementComparer elementComparer, ICheckable checkable) { super(realm); Assert.isNotNull(checkable, "Checkable cannot be null"); //$NON-NLS-1$ Assert.isNotNull(wrappedSet, "Wrapped set cannot be null"); //$NON-NLS-1$ this.checkable = checkable; this.wrappedSet = wrappedSet; this.elementType = elementType; + this.elementComparer = elementComparer; listener = new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { @@ -81,7 +86,7 @@ public class CheckableCheckedElementsObservableSet extends } Set createDiffSet() { - return new HashSet(); + return ViewerElementSet.withComparer(elementComparer); } public Object getElementType() { @@ -165,7 +170,10 @@ public class CheckableCheckedElementsObservableSet extends } public void clear() { - removeAll(wrappedSet); + getterCalled(); + Set removals = createDiffSet(); + removals.addAll(wrappedSet); + removeAll(removals); } public Iterator iterator() { diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsProperty.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsProperty.java index 541e0b23..78a66889 100644 --- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsProperty.java +++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsProperty.java @@ -7,11 +7,11 @@ * * Contributors: * Matthew Hall - initial API and implementation (bug 259380) + * Matthew Hall - bug 283204 ******************************************************************************/ package org.eclipse.jface.internal.databinding.viewers; -import java.util.HashSet; import java.util.Set; import org.eclipse.core.databinding.observable.Realm; @@ -19,6 +19,7 @@ import org.eclipse.core.databinding.observable.set.IObservableSet; import org.eclipse.core.databinding.property.set.SetProperty; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.viewers.ICheckable; +import org.eclipse.jface.viewers.IElementComparer; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; @@ -49,12 +50,12 @@ public class CheckableCheckedElementsProperty extends SetProperty { } public IObservableSet observe(Realm realm, Object source) { - Set wrappedSet = new HashSet(); + IElementComparer comparer = null; if (source instanceof StructuredViewer) - wrappedSet = ViewerElementSet - .withComparer(((StructuredViewer) source).getComparer()); + comparer = ((StructuredViewer) source).getComparer(); + Set wrappedSet = ViewerElementSet.withComparer(comparer); IObservableSet observable = new CheckableCheckedElementsObservableSet( - realm, wrappedSet, elementType, (ICheckable) source); + realm, wrappedSet, elementType, comparer, (ICheckable) source); if (source instanceof Viewer) observable = new ViewerObservableSetDecorator(observable, (Viewer) source); diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java index 17c67038..6e5dd726 100644 --- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java +++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java @@ -15,7 +15,8 @@ * 212518, 215531, 221351, 184830, 213145, 218269, 239015, * 237703, 237718, 222289, 247394, 233306, 247647, 254524, * 246103, 249992, 256150, 256543, 262269, 175735, 262946, - * 255734, 263693, 169876, 266038, 268336, 270461, 271720 + * 255734, 263693, 169876, 266038, 268336, 270461, 271720, + * 283204 * Ovidio Mallo - bug 237163, bug 235195 *******************************************************************************/ package org.eclipse.jface.tests.databinding; @@ -201,6 +202,7 @@ import org.eclipse.jface.tests.internal.databinding.swt.TextObservableValueDefau import org.eclipse.jface.tests.internal.databinding.swt.TextObservableValueFocusOutTest; import org.eclipse.jface.tests.internal.databinding.swt.TextObservableValueModifyTest; import org.eclipse.jface.tests.internal.databinding.swt.TextObservableValueTest; +import org.eclipse.jface.tests.internal.databinding.viewers.CheckableCheckedElementsObservableSetTest; import org.eclipse.jface.tests.internal.databinding.viewers.ObservableCollectionContentProviderTest; import org.eclipse.jface.tests.internal.databinding.viewers.ObservableCollectionTreeContentProviderTest; import org.eclipse.jface.tests.internal.databinding.viewers.ObservableViewerElementSetTest; @@ -453,6 +455,7 @@ public class BindingTestSuite extends TestSuite { addTestSuite(StyledTextObservableValueTest.class); // org.eclipse.jface.tests.internal.databinding.viewers + addTestSuite(CheckableCheckedElementsObservableSetTest.class); addTest(ObservableViewerElementSetTest.suite()); addTestSuite(ObservableCollectionContentProviderTest.class); addTestSuite(ObservableCollectionTreeContentProviderTest.class); diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/CheckableCheckedElementsObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/CheckableCheckedElementsObservableSetTest.java new file mode 100644 index 00000000..d5983c88 --- /dev/null +++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/CheckableCheckedElementsObservableSetTest.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2009 Matthew Hall 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: + * Matthew Hall - initial API and implementation (bug 283204) + ******************************************************************************/ + +package org.eclipse.jface.tests.internal.databinding.viewers; + +import org.eclipse.core.databinding.observable.set.IObservableSet; +import org.eclipse.jface.databinding.viewers.ViewersObservables; +import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.ICheckable; + +public class CheckableCheckedElementsObservableSetTest extends + AbstractDefaultRealmTestCase { + public void testClear() { + // init + ICheckable checkable = new ICheckable() { + + public void addCheckStateListener(ICheckStateListener listener) { + } + + public boolean getChecked(Object element) { + return false; + } + + public void removeCheckStateListener(ICheckStateListener listener) { + + } + + public boolean setChecked(Object element, boolean state) { + return false; + } + + }; + + // CheckableCheckedElementsObservableSet set = new + // CheckableCheckedElementsObservableSet(Realm.getDefault(), + // checkable, String.class); + IObservableSet set = ViewersObservables.observeCheckedElements( + checkable, String.class); + set.add("Test1"); + set.add("Test2"); + assertEquals(2, set.size()); + + // test + set.clear(); + } +} |