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();		
 	}