Bug 371289 - Add "active" context variables
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 c5cce87..25705f6 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2011 IBM Corporation and others.
+ * Copyright (c) 2009, 2012 IBM Corporation 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
@@ -705,20 +705,22 @@
 
 	public Object getActive(final String name) {
 		final String internalName = ACTIVE_VARIABLE + name;
-		trackAccess(internalName);
-
-		if (containsKey(internalName, false))
+		if (containsKey(internalName, false)) {
+			trackAccess(internalName);
 			return internalGet(this, internalName, false);
+		}
 
 		final EclipseContext originatingContext = this;
+
 		runAndTrack(new RunAndTrack() {
 			public boolean changed(IEclipseContext context) {
-				IEclipseContext activeContext = getRoot().getActiveLeaf();
+				IEclipseContext activeContext = getActiveLeaf();
 				Object result = activeContext.get(name);
 				originatingContext.set(internalName, result);
 				return true;
 			}
 		});
+		trackAccess(internalName);
 		return internalGet(this, internalName, true);
 	}
 }
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/ActivationTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/ActivationTest.java
index b33efd4..ca14f5f 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/ActivationTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/ActivationTest.java
@@ -130,12 +130,12 @@
 		root.set("var", "7");
 		
 		// nothing is active - we get value from the node
-		assertEquals("7", child2.getActive("var"));
+		assertEquals("3", child1.getActive("var"));
 		
 		child11.activateBranch();
-		assertEquals("1", child2.getActive("var"));
+		assertEquals("1", child1.getActive("var"));
 		child12.activateBranch();
-		assertEquals("2", child2.getActive("var"));
+		assertEquals("2", child1.getActive("var"));
 		child22.activateBranch();
 		assertEquals("5", child2.getActive("var"));
 	}
@@ -161,23 +161,74 @@
 		
 		final String[] result = new String[1];
 		
-		child2.runAndTrack(new RunAndTrack() {
+		child1.runAndTrack(new RunAndTrack() {
 			public boolean changed(IEclipseContext context) {
 				result[0] = (String) context.getActive("var");
 				return true;
 			}});
 		
 		// nothing is active - we get value from the node
-		assertEquals("7", result[0]);
+		assertEquals("3", result[0]);
 		
 		child11.activateBranch();
 		assertEquals("1", result[0]);
 		child12.activateBranch();
 		assertEquals("2", result[0]);
 		child22.activateBranch();
-		assertEquals("5", result[0]);
+		assertEquals("2", result[0]);
 	}
 	
+	public void testGetActiveRATNumberOfCalls() {
+		IEclipseContext root = EclipseContextFactory.create("root");
+		
+		IEclipseContext child1 = root.createChild("child1");
+		IEclipseContext child11 = child1.createChild("child11");
+		IEclipseContext child12 = child1.createChild("child12");
+		
+		IEclipseContext child2 = root.createChild("child2");
+		IEclipseContext child21 = child2.createChild("child21");
+		IEclipseContext child22 = child2.createChild("child22");
+		
+		child11.set("var", "1");
+		child12.set("var", "1");
+		child1.set("var", "3");
+		child21.set("var", "4");
+		child22.set("var", "4");
+		child2.set("var", "6");
+		root.set("var", "7");
+		
+		final String[] result = new String[1];
+		final int[] called = new int[1];
+		called[0] = 0;
+		
+		child1.runAndTrack(new RunAndTrack() {
+			public boolean changed(IEclipseContext context) {
+				result[0] = (String) context.getActive("var");
+				called[0]++;
+				return true;
+			}});
+		
+		// nothing is active - we get value from the node
+		assertEquals("3", result[0]);
+		assertEquals(1, called[0]);
+		
+		child11.activateBranch();
+		assertEquals("1", result[0]);
+		assertEquals(2, called[0]);
+		
+		child12.activateBranch();
+		assertEquals("1", result[0]);
+		assertEquals(2, called[0]);
+		
+		child22.activateBranch();
+		assertEquals("1", result[0]);
+		assertEquals(2, called[0]);
+		
+		child21.activateBranch();
+		assertEquals("1", result[0]);
+		assertEquals(2, called[0]);
+	}
+
 	public static class ActiveInject {
 		//@Inject @Named("var")
 		public String value;