diff options
author | Matthew Hall | 2009-08-28 21:12:13 +0000 |
---|---|---|
committer | Matthew Hall | 2009-08-28 21:12:13 +0000 |
commit | 1d10eff0f84f92f15d40f43bfa4bb2bffdd61900 (patch) | |
tree | 2aed1c8a72d34ba2b42fd9441782af5c7690e3ec | |
parent | 512fe1b11a9764aa43caa9d44491d736d9f479b7 (diff) | |
download | org.eclipse.e4.databinding-1d10eff0f84f92f15d40f43bfa4bb2bffdd61900.tar.gz org.eclipse.e4.databinding-1d10eff0f84f92f15d40f43bfa4bb2bffdd61900.tar.xz org.eclipse.e4.databinding-1d10eff0f84f92f15d40f43bfa4bb2bffdd61900.zip |
FIXED - bug 287601: [DataBinding][Regression] NullpointerException if observables are disposed while masterdetail runningM20090902-1000M20090902-0800
https://bugs.eclipse.org/bugs/show_bug.cgi?id=287601
8 files changed, 96 insertions, 0 deletions
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java index e07fb45e..65c6c438 100755 --- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java +++ b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java @@ -92,6 +92,8 @@ public class DetailObservableList extends ObservableList implements IObserving { IValueChangeListener outerChangeListener = new IValueChangeListener() { public void handleValueChange(ValueChangeEvent event) { + if (isDisposed()) + return; ObservableTracker.runAndIgnore(new Runnable() { public void run() { List oldList = new ArrayList(wrappedList); diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java index 8968677f..ff04bf5b 100644 --- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java +++ b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java @@ -48,6 +48,8 @@ public class DetailObservableMap extends ObservableMap implements IObserving { private IValueChangeListener masterChangeListener = new IValueChangeListener() { public void handleValueChange(ValueChangeEvent event) { + if (isDisposed()) + return; ObservableTracker.runAndIgnore(new Runnable() { public void run() { Map oldMap = new HashMap(wrappedMap); diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java index 9c882f0e..c38db507 100755 --- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java +++ b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java @@ -87,6 +87,8 @@ public class DetailObservableSet extends ObservableSet implements IObserving { IValueChangeListener outerChangeListener = new IValueChangeListener() { public void handleValueChange(ValueChangeEvent event) { + if (isDisposed()) + return; ObservableTracker.runAndIgnore(new Runnable() { public void run() { Set oldSet = new HashSet(wrappedSet); diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java index dea3d085..3d31d427 100755 --- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java +++ b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java @@ -83,6 +83,8 @@ public class DetailObservableValue extends AbstractObservableValue implements IValueChangeListener outerChangeListener = new IValueChangeListener() { public void handleValueChange(ValueChangeEvent event) { + if (isDisposed()) + return; ObservableTracker.runAndIgnore(new Runnable() { public void run() { Object oldValue = doGetValue(); diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java index 24cc4432..e37dc7df 100644 --- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java +++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java @@ -9,6 +9,7 @@ * Brad Reynolds - initial API and implementation * Matthew Hall - bugs 208858, 221351, 213145 * Ovidio Mallo - bug 241318 + * Tom Schindl - bug 287601 ******************************************************************************/ package org.eclipse.core.tests.internal.databinding.observable.masterdetail; @@ -27,6 +28,8 @@ import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables; import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.databinding.observable.value.IValueChangeListener; +import org.eclipse.core.databinding.observable.value.ValueChangeEvent; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableList; import org.eclipse.core.runtime.AssertionFailedException; @@ -125,6 +128,25 @@ public class DetailObservableListTest extends AbstractDefaultRealmTestCase { assertTrue(detailObservable.isDisposed()); } + public void testDisposeWhileFiringEvents() { + IObservableValue master = new WritableValue(); + WritableListFactory factory = new WritableListFactory(); + master.setValue(""); + + final IObservableList[] detailObservable = new IObservableList[1]; + + master.addValueChangeListener(new IValueChangeListener() { + public void handleValueChange(ValueChangeEvent event) { + detailObservable[0].dispose(); + } + }); + + detailObservable[0] = MasterDetailObservables.detailList(master, + factory, null); + + master.setValue("New Value"); + } + private static class WritableListFactory implements IObservableFactory { Object type = Object.class; diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableMapTest.java index 0690fbb1..019ed7b4 100644 --- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableMapTest.java +++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableMapTest.java @@ -9,6 +9,7 @@ * Brad Reynolds - initial API and implementation * Matthew Hall - bugs 221351, 213145 * Ovidio Mallo - bug 241318 + * Tom Schindl - bug 287601 ******************************************************************************/ package org.eclipse.core.tests.internal.databinding.observable.masterdetail; @@ -19,6 +20,8 @@ import org.eclipse.core.databinding.observable.map.WritableMap; import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables; import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.databinding.observable.value.IValueChangeListener; +import org.eclipse.core.databinding.observable.value.ValueChangeEvent; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableMap; import org.eclipse.core.runtime.AssertionFailedException; @@ -124,6 +127,25 @@ public class DetailObservableMapTest extends AbstractDefaultRealmTestCase { assertTrue(detailObservable.isDisposed()); } + public void testDisposeWhileFiringEvents() { + IObservableValue master = new WritableValue(); + WritableMapFactory factory = new WritableMapFactory(); + master.setValue(""); + + final IObservableMap[] detailObservable = new IObservableMap[1]; + + master.addValueChangeListener(new IValueChangeListener() { + public void handleValueChange(ValueChangeEvent event) { + detailObservable[0].dispose(); + } + }); + + detailObservable[0] = MasterDetailObservables.detailMap(master, + factory, null, null); + + master.setValue("New Value"); + } + private static class WritableMapFactory implements IObservableFactory { Object keyType = Object.class; Object valueType = Object.class; diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java index 865a6f09..854d2ca2 100644 --- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java +++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java @@ -9,6 +9,7 @@ * Brad Reynolds - initial API and implementation * Matthew Hall - bugs 221351, 213145 * Ovidio Mallo - bug 241318 + * Tom Schindl - bug 287601 ******************************************************************************/ package org.eclipse.core.tests.internal.databinding.observable.masterdetail; @@ -28,6 +29,8 @@ import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservab import org.eclipse.core.databinding.observable.set.IObservableSet; import org.eclipse.core.databinding.observable.set.WritableSet; import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.databinding.observable.value.IValueChangeListener; +import org.eclipse.core.databinding.observable.value.ValueChangeEvent; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableSet; import org.eclipse.core.runtime.AssertionFailedException; @@ -133,6 +136,25 @@ public class DetailObservableSetTest extends AbstractDefaultRealmTestCase { assertTrue(detailObservable.isDisposed()); } + public void testDisposeWhileFiringEvents() { + IObservableValue master = new WritableValue(); + WritableSetFactory factory = new WritableSetFactory(); + master.setValue(""); + + final IObservableSet[] detailObservable = new IObservableSet[1]; + + master.addValueChangeListener(new IValueChangeListener() { + public void handleValueChange(ValueChangeEvent event) { + detailObservable[0].dispose(); + } + }); + + detailObservable[0] = MasterDetailObservables.detailSet(master, + factory, null); + + master.setValue("New Value"); + } + private static class WritableSetFactory implements IObservableFactory { Object type = Object.class; diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java index e2114685..6d372408 100755 --- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java +++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java @@ -10,6 +10,7 @@ * Brad Reynolds - bug 147515 * Matthew Hall - bugs 221351, 213145 * Ovidio Mallo - bug 241318 + * Tom Schindl - bug 287601 ******************************************************************************/ package org.eclipse.core.tests.internal.databinding.observable.masterdetail; @@ -22,6 +23,8 @@ import org.eclipse.core.databinding.observable.Realm; import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables; import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.databinding.observable.value.IValueChangeListener; +import org.eclipse.core.databinding.observable.value.ValueChangeEvent; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableValue; import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest; @@ -128,6 +131,25 @@ public class DetailObservableValueTest extends AbstractDefaultRealmTestCase { assertTrue(detailObservable.isDisposed()); } + public void testDisposeWhileFiringEvents() { + IObservableValue master = new WritableValue(); + WritableValueFactory factory = new WritableValueFactory(); + master.setValue(""); + + final IObservableValue[] detailObservable = new IObservableValue[1]; + + master.addValueChangeListener(new IValueChangeListener() { + public void handleValueChange(ValueChangeEvent event) { + detailObservable[0].dispose(); + } + }); + + detailObservable[0] = MasterDetailObservables.detailValue(master, + factory, null); + + master.setValue("New Value"); + } + /** * Factory that creates WritableValues with the target as the value. */ |