diff options
author | cgroth | 2015-11-13 21:30:44 +0000 |
---|---|---|
committer | Stefan Xenos | 2015-11-18 19:19:06 +0000 |
commit | 40ff896005bdb235cf1ac55b14f6f09f57618c94 (patch) | |
tree | e410baf0701a8681adac7bfbd5959fa28fd8e41f | |
parent | f8405041b1b1eca276fb08a57abd04f35444846f (diff) | |
download | eclipse.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>
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); |