Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Hall2009-08-28 21:12:13 +0000
committerMatthew Hall2009-08-28 21:12:13 +0000
commit1d10eff0f84f92f15d40f43bfa4bb2bffdd61900 (patch)
tree2aed1c8a72d34ba2b42fd9441782af5c7690e3ec
parent512fe1b11a9764aa43caa9d44491d736d9f479b7 (diff)
downloadorg.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
-rwxr-xr-xbundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java2
-rw-r--r--bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java2
-rwxr-xr-xbundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java2
-rwxr-xr-xbundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java2
-rw-r--r--tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java22
-rw-r--r--tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableMapTest.java22
-rw-r--r--tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java22
-rwxr-xr-xtests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java22
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.
*/

Back to the top