FIXED - bug 332504: [DataBinding] [JFace Validators] Stack overflow
when using MultiValidator
https://bugs.eclipse.org/bugs/show_bug.cgi?id=332504
diff --git a/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
index 7eb6a40..3730552 100644
--- a/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.core.databinding
-Bundle-Version: 1.4.0.qualifier
+Bundle-Version: 1.4.1.qualifier
Bundle-ClassPath: .
Bundle-Vendor: %providerName
Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
index 2a5ca85..6364e02 100644
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
+++ b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
@@ -8,8 +8,9 @@
* Contributors:
* Matthew Hall - initial API and implementation (bug 218269)
* Boris Bokowski - bug 218269
- * Matthew Hall - bug 237884, 240590, 251003, 251424, 278550
+ * Matthew Hall - bug 237884, 240590, 251003, 251424, 278550, 332504
* Ovidio Mallo - bug 238909, 235859
+ * Stefan R�ck - bug 332504
******************************************************************************/
package org.eclipse.core.databinding.validation;
@@ -209,7 +210,6 @@
*/
public IObservableValue getValidationStatus() {
if (unmodifiableValidationStatus == null) {
- revalidate();
ObservableTracker.setIgnore(true);
try {
unmodifiableValidationStatus = Observables
@@ -217,6 +217,7 @@
} finally {
ObservableTracker.setIgnore(false);
}
+ revalidate();
}
return unmodifiableValidationStatus;
}
@@ -263,6 +264,19 @@
try {
List newTargets = new ArrayList(Arrays.asList(dependencies));
+ // Internal observables should not be dependencies
+ // (prevent dependency loop)
+ for (Iterator itNew = newTargets.iterator(); itNew.hasNext();) {
+ Object newDependency = itNew.next();
+ if (newDependency == validationStatus
+ || newDependency == unmodifiableValidationStatus
+ || newDependency == targets
+ || newDependency == unmodifiableTargets
+ || newDependency == models) {
+ itNew.remove();
+ }
+ }
+
// This loop is roughly equivalent to:
// targets.retainAll(newTargets);
// newTargets.removeAll(targets);
@@ -277,14 +291,6 @@
// new dependencies
itNew.remove();
continue outer;
- } else if (newDependency == validationStatus
- || newDependency == unmodifiableValidationStatus
- || newDependency == targets
- || newDependency == unmodifiableTargets
- || newDependency == models) {
- // Internal observables should not be dependencies
- // (prevent dependency loop)
- itNew.remove();
}
}
// Old dependency is no longer a dependency--remove from
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
index 4506a57..93a84ad 100644
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
+++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
@@ -7,7 +7,7 @@
*
* Contributors:
* Matthew Hall - initial API and implementation (bug 218269)
- * Matthew Hall - bug 237884, 251003
+ * Matthew Hall - bugs 237884, 251003, 332504
* Ovidio Mallo - bugs 240590, 238909, 251003, 247741, 235859
******************************************************************************/
@@ -391,6 +391,30 @@
assertTrue(validator.getTargets().contains(emptyListDependency));
}
+ public void testBug357568_MultiValidatorTargetAsDependency() {
+ validator = new MultiValidator() {
+ protected IStatus validate() {
+ ObservableTracker.getterCalled(dependency);
+ ObservableTracker.getterCalled(new DependencyObservable());
+ ObservableTracker.getterCalled(validator.getTargets());
+ return null;
+ }
+ };
+
+ validator.getValidationStatus().getValue();
+ dependency.setValue(ValidationStatus.info("foo"));
+ }
+
+ public void testBug357568_ValidationStatusAsDependency() {
+ validator = new MultiValidator() {
+ protected IStatus validate() {
+ return (IStatus) validator.getValidationStatus().getValue();
+ }
+ };
+
+ validator.getValidationStatus();
+ }
+
private static class DependencyObservableValue extends WritableValue {
private boolean stale = false;