Bug 411147 - ServiceLocator#getService(Class) may register an invalid service object; IEclipseContext#get(Class) does not handle NOT_A_VALUE
Signed-off-by: Brian de Alwis <bsd@mt.ca>
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
index 1f9256f..5552533 100644
--- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
+++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
@@ -238,7 +238,9 @@
result = valueComputation.get();
originatingContext.localValueComputations.put(name, valueComputation);
}
- return result;
+ if (result != IInjector.NOT_A_VALUE) {
+ return result;
+ }
}
// 3. delegate to parent
if (!local) {
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java
index a1f8db0..1423f4c 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java
@@ -16,6 +16,7 @@
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.contexts.RunAndTrack;
+import org.eclipse.e4.core.di.IInjector;
import org.eclipse.e4.core.internal.contexts.EclipseContext;
public class EclipseContextTest extends TestCase {
@@ -312,6 +313,50 @@
assertNull(child.get("x"));
}
+ public void testGetCFNotAValue() {
+ IEclipseContext context = EclipseContextFactory.create("ParentContext");
+ context.set("x", new ContextFunction() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.e4.core.contexts.ContextFunction#compute(org.eclipse
+ * .e4.core.contexts.IEclipseContext, java.lang.String)
+ */
+ @Override
+ public Object compute(IEclipseContext context, String contextKey) {
+ return IInjector.NOT_A_VALUE;
+ }
+ });
+
+ assertNull(context.get("x"));
+ context.dispose();
+ }
+
+ public void testGetCFNotAValueToParent() {
+ IEclipseContext parent = EclipseContextFactory.create("ParentContext");
+ IEclipseContext child = parent.createChild();
+ parent.set("x", new Integer(1));
+ child.set("x", new ContextFunction() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.e4.core.contexts.ContextFunction#compute(org.eclipse
+ * .e4.core.contexts.IEclipseContext, java.lang.String)
+ */
+ @Override
+ public Object compute(IEclipseContext context, String contextKey) {
+ return IInjector.NOT_A_VALUE;
+ }
+ });
+
+ assertEquals(1, child.get("x"));
+ parent.dispose();
+ }
+
private int listenersCount(IEclipseContext context) {
return ((EclipseContext) context).getListeners().size();
}