Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcgroth2015-11-13 21:30:44 +0000
committerStefan Xenos2015-11-18 19:19:06 +0000
commit40ff896005bdb235cf1ac55b14f6f09f57618c94 (patch)
treee410baf0701a8681adac7bfbd5959fa28fd8e41f
parentf8405041b1b1eca276fb08a57abd04f35444846f (diff)
downloadeclipse.platform.ui-40ff896005bdb235cf1ac55b14f6f09f57618c94.tar.gz
eclipse.platform.ui-40ff896005bdb235cf1ac55b14f6f09f57618c94.tar.xz
eclipse.platform.ui-40ff896005bdb235cf1ac55b14f6f09f57618c94.zip
Bug 371791 [DataBinding] Databinding accesses validationStatusObservable
from wrong realm with set and list bindings Change-Id: I7381447f0401c4852d92ff62ae5804eba4e0c1ad Signed-off-by: cgroth <info@conrad-groth.de>
-rw-r--r--bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ListBinding.java11
-rw-r--r--bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/SetBinding.java19
-rw-r--r--tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/DifferentRealmsBindingTest.java85
-rw-r--r--tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java2
4 files changed, 111 insertions, 6 deletions
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ListBinding.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ListBinding.java
index 4ebcd411593..a4d3ca86925 100644
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ListBinding.java
+++ b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ListBinding.java
@@ -231,7 +231,7 @@ public class ListBinding extends Binding {
// TODO - at this point, the two lists will be out
// of sync if an error occurred...
} finally {
- validationStatusObservable.setValue(multiStatus);
+ setValidationStatus(multiStatus);
if (destination == getTarget()) {
updatingTarget = false;
@@ -245,6 +245,15 @@ public class ListBinding extends Binding {
}
}
+ private void setValidationStatus(final IStatus status) {
+ validationStatusObservable.getRealm().exec(new Runnable() {
+ @Override
+ public void run() {
+ validationStatusObservable.setValue(status);
+ }
+ });
+ }
+
/**
* Merges the provided <code>newStatus</code> into the
* <code>multiStatus</code>.
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/SetBinding.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/SetBinding.java
index cb66a42c238..ee55f8c8c6e 100644
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/SetBinding.java
+++ b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/SetBinding.java
@@ -182,8 +182,8 @@ public class SetBinding extends Binding {
for (Iterator iterator = diff.getRemovals().iterator(); iterator
.hasNext();) {
IStatus setterStatus = updateSetStrategy.doRemove(
- destination, updateSetStrategy.convert(iterator
- .next()));
+ destination,
+ updateSetStrategy.convert(iterator.next()));
mergeStatus(multiStatus, setterStatus);
// TODO - at this point, the two sets
@@ -194,8 +194,8 @@ public class SetBinding extends Binding {
for (Iterator iterator = diff.getAdditions().iterator(); iterator
.hasNext();) {
IStatus setterStatus = updateSetStrategy.doAdd(
- destination, updateSetStrategy.convert(iterator
- .next()));
+ destination,
+ updateSetStrategy.convert(iterator.next()));
mergeStatus(multiStatus, setterStatus);
// TODO - at this point, the two sets
@@ -203,7 +203,7 @@ public class SetBinding extends Binding {
// occurred...
}
} finally {
- validationStatusObservable.setValue(multiStatus);
+ setValidationStatus(multiStatus);
if (destination == getTarget()) {
updatingTarget = false;
@@ -215,6 +215,15 @@ public class SetBinding extends Binding {
});
}
+ private void setValidationStatus(final IStatus status) {
+ validationStatusObservable.getRealm().exec(new Runnable() {
+ @Override
+ public void run() {
+ validationStatusObservable.setValue(status);
+ }
+ });
+ }
+
/**
* Merges the provided <code>newStatus</code> into the
* <code>multiStatus</code>.
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/DifferentRealmsBindingTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/DifferentRealmsBindingTest.java
new file mode 100644
index 00000000000..13c1ef69010
--- /dev/null
+++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/DifferentRealmsBindingTest.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Conrad Groth 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:
+ * Conrad Groth - Testing my fix, that validation status is set in the correct realm
+ ******************************************************************************/
+package org.eclipse.core.tests.internal.databinding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.observable.list.ObservableList;
+import org.eclipse.core.databinding.observable.list.WritableList;
+import org.eclipse.core.databinding.observable.set.ObservableSet;
+import org.eclipse.core.databinding.observable.set.WritableSet;
+import org.eclipse.core.databinding.util.ILogger;
+import org.eclipse.core.databinding.util.Policy;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.tests.databinding.observable.ThreadRealm;
+
+import junit.framework.TestCase;
+
+public class DifferentRealmsBindingTest extends TestCase {
+
+ ThreadRealm targetAndModelRealm = new ThreadRealm();
+ ThreadRealm validationRealm = new ThreadRealm();
+
+ List<IStatus> errorStatusses = new ArrayList<>();
+
+ DataBindingContext dbc;
+ ILogger logger = new ILogger() {
+ @Override
+ public void log(IStatus status) {
+ if (!status.isOK()) {
+ errorStatusses.add(status);
+ }
+ }
+ };
+
+ @Override
+ protected void setUp() throws Exception {
+ errorStatusses.clear();
+ new Thread() {
+ @Override
+ public void run() {
+ targetAndModelRealm.init(Thread.currentThread());
+ targetAndModelRealm.block();
+ }
+ }.start();
+
+ validationRealm.init(Thread.currentThread());
+ dbc = new DataBindingContext(validationRealm);
+ Policy.setLog(logger);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ dbc.dispose();
+ }
+
+ public void testListBindingValidationRealm() throws Throwable {
+ final ObservableList model = new WritableList(targetAndModelRealm);
+ final ObservableList target = new WritableList(targetAndModelRealm);
+
+ dbc.bindList(target, model);
+ targetAndModelRealm.processQueue();
+ targetAndModelRealm.unblock();
+ assertTrue(errorStatusses.toString(), errorStatusses.isEmpty());
+ }
+
+ public void testSetBindingValidationRealm() throws Throwable {
+ final ObservableSet model = new WritableSet(targetAndModelRealm);
+ final ObservableSet target = new WritableSet(targetAndModelRealm);
+
+ dbc.bindSet(target, model);
+ targetAndModelRealm.processQueue();
+ targetAndModelRealm.unblock();
+ assertTrue(errorStatusses.toString(), errorStatusses.isEmpty());
+ }
+}
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 a7302acfb5b..5b7442a3574 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
@@ -84,6 +84,7 @@ import org.eclipse.core.tests.databinding.validation.ValidationStatusTest;
import org.eclipse.core.tests.internal.databinding.BindingMessagesTest;
import org.eclipse.core.tests.internal.databinding.BindingStatusTest;
import org.eclipse.core.tests.internal.databinding.ConverterValuePropertyTest;
+import org.eclipse.core.tests.internal.databinding.DifferentRealmsBindingTest;
import org.eclipse.core.tests.internal.databinding.IdentityMapTest;
import org.eclipse.core.tests.internal.databinding.IdentitySetTest;
import org.eclipse.core.tests.internal.databinding.QueueTest;
@@ -327,6 +328,7 @@ public class BindingTestSuite extends TestSuite {
addTestSuite(BindingMessagesTest.class);
addTestSuite(BindingStatusTest.class);
addTestSuite(ConverterValuePropertyTest.class);
+ addTestSuite(DifferentRealmsBindingTest.class);
addTestSuite(IdentityMapTest.class);
addTestSuite(IdentitySetTest.class);
addTestSuite(QueueTest.class);

Back to the top