You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2009/01/27 14:02:23 UTC
svn commit: r738083 - in /labs/magma/trunk:
foundation-basics/src/main/java/org/apache/magma/basics/context/
foundation-basics/src/test/java/org/apache/magma/basics/context/
foundation-i18n/src/test/java/org/apache/magma/i18n/
foundation-website/src/ma...
Author: simoneg
Date: Tue Jan 27 13:02:22 2009
New Revision: 738083
URL: http://svn.apache.org/viewvc?rev=738083&view=rev
Log:
LABS-279 : Refinements on RunningContext to support automatic savepoints
Added:
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoRegisterContextOwners.aj
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoSwitchContextOwner.aj
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/ContextOwner.java
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/SubRunningContext.java (contents, props changed)
- copied, changed from r735601, labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java
labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/
labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/FakeContextOwner.java
labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/RunningContextTest.java
labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/SubRunningContextTest.java
Modified:
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java
labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/MatchingTest.java
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Contextualizer.aj
labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/Contextualizer.aj
Added: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoRegisterContextOwners.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoRegisterContextOwners.aj?rev=738083&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoRegisterContextOwners.aj (added)
+++ labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoRegisterContextOwners.aj Tue Jan 27 13:02:22 2009
@@ -0,0 +1,11 @@
+package org.apache.magma.basics.context;
+
+public aspect AutoRegisterContextOwners {
+
+ pointcut createdOwner(ContextOwner obj) : execution(ContextOwner+.new(..)) && this(obj);
+
+ after(ContextOwner obj) : createdOwner(obj) {
+ RunningContext.createFor(obj);
+ }
+
+}
Added: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoSwitchContextOwner.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoSwitchContextOwner.aj?rev=738083&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoSwitchContextOwner.aj (added)
+++ labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/AutoSwitchContextOwner.aj Tue Jan 27 13:02:22 2009
@@ -0,0 +1,18 @@
+package org.apache.magma.basics.context;
+
+public aspect AutoSwitchContextOwner {
+
+ declare precedence : AutoSwitchContextOwner, *;
+
+ pointcut contextualized(ContextOwner co) : execution(* ContextOwner+.*(..)) &&
+ !(execution(* *.getClass()) || execution(* *.equals(Object))) &&
+ this(co);
+
+ before(ContextOwner co) : contextualized(co) {
+ RunningContext.entering(co);
+ }
+
+ after(ContextOwner co) : contextualized(co) {
+ RunningContext.exiting(co);
+ }
+}
Added: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/ContextOwner.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/ContextOwner.java?rev=738083&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/ContextOwner.java (added)
+++ labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/ContextOwner.java Tue Jan 27 13:02:22 2009
@@ -0,0 +1,6 @@
+package org.apache.magma.basics.context;
+
+
+public interface ContextOwner {
+
+}
Modified: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java?rev=738083&r1=738082&r2=738083&view=diff
==============================================================================
--- labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java (original)
+++ labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java Tue Jan 27 13:02:22 2009
@@ -1,64 +1,61 @@
package org.apache.magma.basics.context;
-import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
import org.apache.magma.basics.MagmaException;
-import org.apache.magma.basics.utils.SavingStack;
-import org.apache.magma.settings.Settings;
-public class RunningContext extends SavingStack<Object, ContextElement> {
+public class RunningContext {
private static ThreadLocal<RunningContext> runnings = new ThreadLocal<RunningContext>();
+
+ private Stack<SubRunningContext> currents = new Stack<SubRunningContext>();
+ private Map<ContextOwner, SubRunningContext> saveds = new HashMap<ContextOwner, SubRunningContext>();
+
+ public static void cleanup() {
+ runnings.set(null);
+ }
- public static RunningContext get() {
+ public static SubRunningContext get() {
RunningContext context = runnings.get();
if (context == null) {
context = new RunningContext();
runnings.set(context);
}
- return context;
+ return context.currents.peek();
}
- protected RunningContext() {
- }
-
- @Override
- @Deprecated
- public synchronized ContextElement pop() {
- return super.pop();
+ public RunningContext() {
+ currents.push(new SubRunningContext());
}
- public synchronized void pop(Class<? extends ContextElement> eleClass) {
- if (Settings.isProductionEnv()) {
- super.pop();
- return;
+ public static void entering(ContextOwner co) {
+ RunningContext context = runnings.get();
+ SubRunningContext sr = context.saveds.get(co);
+ if (sr == null) {
+ sr = new SubRunningContext();
+ sr.addAll(context.currents.peek());
+ sr.setOwner(co);
+ context.saveds.put(co, sr);
}
- ContextElement popped = super.pop();
- if (!eleClass.isAssignableFrom(popped.getClass())) throw new MagmaException("Running context expected {0}, but found {1}", eleClass, popped);
- }
-
- public void popString() {
- pop(StringContextElement.class);
- }
-
- public void popClass() {
- pop(ClassContextElement.class);
- }
-
- public void popMethod() {
- pop(MethodContextElement.class);
- }
-
- public void push(Class<?> clazz) {
- super.push(new ClassContextElement(clazz));
+ context.currents.push(sr);
}
- public void push(String value) {
- super.push(new StringContextElement(value));
+ public static void exiting(ContextOwner co) {
+ RunningContext context = runnings.get();
+ SubRunningContext pop = context.currents.pop();
+ if (pop.getOwner() != co) throw new MagmaException("Running context disaligned, expecting {0} but got {1}", co, pop.getOwner());
}
- public void push(Method method, Object... args) {
- super.push(new MethodContextElement(method, args));
+ public static void createFor(ContextOwner co) {
+ RunningContext context = runnings.get();
+ if (!context.saveds.containsKey(co)) {
+ SubRunningContext sr = new SubRunningContext();
+ sr.addAll(context.currents.peek());
+ sr.setOwner(co);
+ context.saveds.put(co, sr);
+ }
}
-
+
}
Copied: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/SubRunningContext.java (from r735601, labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java)
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/SubRunningContext.java?p2=labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/SubRunningContext.java&p1=labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java&r1=735601&r2=738083&rev=738083&view=diff
==============================================================================
--- labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/RunningContext.java (original)
+++ labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/SubRunningContext.java Tue Jan 27 13:02:22 2009
@@ -1,25 +1,19 @@
package org.apache.magma.basics.context;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.EmptyStackException;
+import java.util.List;
+import java.util.Stack;
import org.apache.magma.basics.MagmaException;
-import org.apache.magma.basics.utils.SavingStack;
import org.apache.magma.settings.Settings;
-public class RunningContext extends SavingStack<Object, ContextElement> {
+public class SubRunningContext extends Stack<ContextElement> {
- private static ThreadLocal<RunningContext> runnings = new ThreadLocal<RunningContext>();
+ private ContextOwner owner;
- public static RunningContext get() {
- RunningContext context = runnings.get();
- if (context == null) {
- context = new RunningContext();
- runnings.set(context);
- }
- return context;
- }
-
- protected RunningContext() {
+ protected SubRunningContext() {
}
@Override
@@ -33,10 +27,29 @@
super.pop();
return;
}
- ContextElement popped = super.pop();
- if (!eleClass.isAssignableFrom(popped.getClass())) throw new MagmaException("Running context expected {0}, but found {1}", eleClass, popped);
+ try {
+ ContextElement popped = super.pop();
+ if (!eleClass.isAssignableFrom(popped.getClass())) throw new MagmaException("Running context expected {0}, but found {1}", eleClass, popped);
+ } catch (EmptyStackException e) {
+ throw new MagmaException("Running context is empty while trying to pop {0}", eleClass);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public <SubElement extends ContextElement> List<SubElement> getElements(Class<SubElement> clazz) {
+ List<SubElement> ret = null;
+ for (ContextElement ele : this) {
+ if (clazz.isAssignableFrom(ele.getClass())) {
+ if (ret == null) {
+ ret = new ArrayList<SubElement>();
+ }
+ ret.add((SubElement)ele);
+ }
+ }
+ return ret;
}
+
public void popString() {
pop(StringContextElement.class);
}
@@ -60,5 +73,13 @@
public void push(Method method, Object... args) {
super.push(new MethodContextElement(method, args));
}
+
+ public ContextOwner getOwner() {
+ return owner;
+ }
+
+ public void setOwner(ContextOwner owner) {
+ this.owner = owner;
+ }
}
Propchange: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/context/SubRunningContext.java
------------------------------------------------------------------------------
svn:mergeinfo =
Added: labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/FakeContextOwner.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/FakeContextOwner.java?rev=738083&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/FakeContextOwner.java (added)
+++ labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/FakeContextOwner.java Tue Jan 27 13:02:22 2009
@@ -0,0 +1,17 @@
+package org.apache.magma.basics.context;
+
+import java.util.List;
+
+public class FakeContextOwner implements ContextOwner {
+
+ public String getMyContextString() {
+ List<StringContextElement> elements = RunningContext.get().getElements(StringContextElement.class);
+ String ret = "";
+ for (StringContextElement element : elements) {
+ ret += element.toString() + ";";
+ }
+ return ret;
+ }
+
+
+}
Added: labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/RunningContextTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/RunningContextTest.java?rev=738083&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/RunningContextTest.java (added)
+++ labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/RunningContextTest.java Tue Jan 27 13:02:22 2009
@@ -0,0 +1,47 @@
+package org.apache.magma.basics.context;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+
+import org.junit.After;
+import org.junit.Test;
+
+public class RunningContextTest {
+
+ @After
+ public void cleanup() {
+ RunningContext.cleanup();
+ }
+
+ @Test
+ public void forkAndBackProgrammatically() throws Exception {
+ SubRunningContext context = RunningContext.get();
+
+ context.push("in base");
+ context.push("still in base");
+
+ FakeContextOwner co = new FakeContextOwner();
+
+ RunningContext.entering(co);
+
+ SubRunningContext context2 = RunningContext.get();
+ assertNotSame(context, context2);
+
+ context2.push("in sub context");
+
+ assertEquals(3, context2.getElements(StringContextElement.class).size());
+
+ RunningContext.exiting(co);
+
+ context2 = RunningContext.get();
+ assertSame(context, context2);
+
+ assertEquals(2, context.getElements(StringContextElement.class).size());
+ context.pop(StringContextElement.class);
+
+ String contextString = co.getMyContextString();
+ assertEquals("in base;still in base;in sub context;", contextString);
+ }
+
+}
Added: labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/SubRunningContextTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/SubRunningContextTest.java?rev=738083&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/SubRunningContextTest.java (added)
+++ labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/context/SubRunningContextTest.java Tue Jan 27 13:02:22 2009
@@ -0,0 +1,70 @@
+package org.apache.magma.basics.context;
+
+import java.util.List;
+
+import org.apache.magma.basics.MagmaException;
+import org.junit.After;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class SubRunningContextTest {
+
+ @After
+ public void cleanup() {
+ RunningContext.cleanup();
+ }
+
+ @Test
+ public void pushAndPop() throws Exception {
+ SubRunningContext sub = RunningContext.get();
+ assertNotNull(sub);
+
+ sub.push(this.getClass());
+ sub.push("a string");
+ sub.push("another string");
+ sub.push(this.getClass().getDeclaredMethod("pushAndPop"));
+
+ List<StringContextElement> elements = sub.getElements(StringContextElement.class);
+ assertNotNull(elements);
+ assertEquals(2, elements.size());
+ assertEquals("a string", elements.get(0).toString());
+ assertEquals("a string", elements.get(0).mystring);
+
+ List<ClassContextElement> classElements = sub.getElements(ClassContextElement.class);
+ assertNotNull(classElements);
+ assertEquals(1, classElements.size());
+ assertEquals("SubRunningContextTest", classElements.get(0).toString());
+ assertSame(this.getClass(), classElements.get(0).myclass);
+
+ List<MethodContextElement> methElements = sub.getElements(MethodContextElement.class);
+ assertNotNull(methElements);
+ assertEquals(1, methElements.size());
+ assertEquals("pushAndPop", methElements.get(0).toString());
+
+ sub.popMethod();
+ sub.popString();
+ sub.popString();
+ sub.popClass();
+ }
+
+ @Test(expected=MagmaException.class)
+ public void wrongPop() throws Exception {
+ SubRunningContext sub = RunningContext.get();
+ assertNotNull(sub);
+
+ sub.push("a string");
+ sub.popClass();
+ }
+
+ @Test(expected=MagmaException.class)
+ public void tooManyPops() throws Exception {
+ SubRunningContext sub = RunningContext.get();
+ assertNotNull(sub);
+
+ sub.push("a string");
+ sub.popString();
+ sub.popString();
+ }
+
+}
Modified: labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/MatchingTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/MatchingTest.java?rev=738083&r1=738082&r2=738083&view=diff
==============================================================================
--- labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/MatchingTest.java (original)
+++ labs/magma/trunk/foundation-i18n/src/test/java/org/apache/magma/i18n/MatchingTest.java Tue Jan 27 13:02:22 2009
@@ -4,6 +4,7 @@
import static org.hamcrest.CoreMatchers.*;
import org.apache.magma.basics.context.RunningContext;
+import org.apache.magma.basics.context.SubRunningContext;
import org.junit.After;
import org.junit.Test;
import org.junit.experimental.theories.DataPoint;
@@ -14,7 +15,7 @@
@SuppressWarnings("deprecation")
@After
public void cleanupRunningContext() {
- RunningContext context = RunningContext.get();
+ SubRunningContext context = RunningContext.get();
while(context.size() > 0) {
context.pop();
}
@@ -22,7 +23,7 @@
@Test
public void simpleCompleteMatching() throws Exception {
- RunningContext mc = RunningContext.get();
+ SubRunningContext mc = RunningContext.get();
mc.push(getClass());
mc.push("test");
@@ -35,7 +36,7 @@
@Test
public void simplePartialMatching() throws Exception {
- RunningContext mc = RunningContext.get();
+ SubRunningContext mc = RunningContext.get();
mc.push(getClass());
mc.push("test");
@@ -46,7 +47,7 @@
@Test
public void simpleNotMatching() throws Exception {
- RunningContext mc = RunningContext.get();
+ SubRunningContext mc = RunningContext.get();
mc.push("test");
ContextMatrix cm = new ContextMatrix(getClass().getSimpleName() + ".test", "test");
@@ -57,7 +58,7 @@
@Test
public void simpleJumpingMatch() throws Exception {
- RunningContext mc = RunningContext.get();
+ SubRunningContext mc = RunningContext.get();
mc.push("testingthejump");
mc.push(getClass());
mc.push("test");
@@ -70,7 +71,7 @@
@Test
public void betterMatch() throws Exception {
- RunningContext mc = RunningContext.get();
+ SubRunningContext mc = RunningContext.get();
mc.push("testingthejump");
mc.push(getClass());
mc.push("test");
@@ -84,7 +85,7 @@
@Test
public void betterMatchAsPerBug184() throws Exception {
- RunningContext mc = RunningContext.get();
+ SubRunningContext mc = RunningContext.get();
mc.push("CompoundHtmlProducer");
mc.push("BeanFormProducer");
mc.push("UserBean");
Modified: labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Contextualizer.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Contextualizer.aj?rev=738083&r1=738082&r2=738083&view=diff
==============================================================================
--- labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Contextualizer.aj (original)
+++ labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/Contextualizer.aj Tue Jan 27 13:02:22 2009
@@ -1,30 +1,31 @@
package org.apache.magma.website;
import org.apache.magma.basics.context.RunningContext;
+import org.apache.magma.basics.context.SubRunningContext;
import org.apache.magma.website.HandlerSetup;
import org.aspectj.lang.reflect.MethodSignature;
public aspect Contextualizer {
before(WebHandler h) : HandlerSetup.doMethod(h) || HandlerSetup.subHandle(h) || HandlerSetup.hiddenMethod(h) {
- RunningContext context = RunningContext.get();
+ SubRunningContext context = RunningContext.get();
context.push(h.getClass());
context.push(((MethodSignature)thisJoinPoint.getSignature()).getMethod());
}
after(WebHandler h) : HandlerSetup.doMethod(h) || HandlerSetup.subHandle(h) || HandlerSetup.hiddenMethod(h) {
- RunningContext context = RunningContext.get();
+ SubRunningContext context = RunningContext.get();
context.popMethod();
context.popClass();
}
before(Producer p) : (execution(* Producer+.produce(..)) || execution(* Producer+.head(..))) && this(p) {
- RunningContext context = RunningContext.get();
+ SubRunningContext context = RunningContext.get();
context.push(p.getClass());
}
after(Producer p) : (execution(* Producer+.produce(..)) || execution(* Producer+.head(..))) && this(p) {
- RunningContext context = RunningContext.get();
+ SubRunningContext context = RunningContext.get();
context.popClass();
}
Modified: labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/Contextualizer.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/Contextualizer.aj?rev=738083&r1=738082&r2=738083&view=diff
==============================================================================
--- labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/Contextualizer.aj (original)
+++ labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/Contextualizer.aj Tue Jan 27 13:02:22 2009
@@ -1,6 +1,7 @@
package org.apache.magma.website.beansview;
import org.apache.magma.basics.context.RunningContext;
+import org.apache.magma.basics.context.SubRunningContext;
import org.apache.magma.beans.PropertyInfo;
import org.apache.magma.view.tree.PropertyNode;
import org.apache.magma.view.tree.Node;
@@ -8,7 +9,7 @@
public privileged aspect Contextualizer {
void around(ShowBean sb) : execution(void ShowBean+.produce(..)) && this(sb) {
- RunningContext current = RunningContext.get();
+ SubRunningContext current = RunningContext.get();
Object bean = sb.bean;
if (bean != null) {
current.push(bean.getClass());
@@ -34,7 +35,7 @@
return;
}
PropertyNode node = (PropertyNode)args[0];
- RunningContext current = RunningContext.get();
+ SubRunningContext current = RunningContext.get();
PropertyInfo property = node.getProperty();
current.push(property.getName());
try {
@@ -45,7 +46,7 @@
}
void around(ShowList sl) : execution(void ShowList+.produce(..)) && this(sl) {
- RunningContext current = RunningContext.get();
+ SubRunningContext current = RunningContext.get();
Class<?> clz = sl.myclass;
if (clz != null) {
current.push(clz);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org