From 7717aa5e3983a7f91e071671a2ef0b8a904e5913 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 30 Jan 2008 14:35:25 +0000 Subject: [PATCH] Introduce parent context git-svn-id: https://svn.argeo.org/slc/trunk@934 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- org.argeo.slc.core/pom.xml | 2 +- .../test/context/AbstractContextTestData.java | 14 ++++ .../slc/core/test/context/ContextAware.java | 1 + .../slc/core/test/context/ContextUtils.java | 67 +++++++++++++++++++ .../core/test/context/ParentContextAware.java | 7 ++ .../core/test/context/SimpleContextAware.java | 47 +++++++++++++ .../context/SimpleParentContextAware.java | 30 +++++++++ 7 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/AbstractContextTestData.java create mode 100644 org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ParentContextAware.java create mode 100644 org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleContextAware.java create mode 100644 org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleParentContextAware.java diff --git a/org.argeo.slc.core/pom.xml b/org.argeo.slc.core/pom.xml index 8cfedcf0a..72fc35e8d 100644 --- a/org.argeo.slc.core/pom.xml +++ b/org.argeo.slc.core/pom.xml @@ -6,7 +6,7 @@ org.argeo.slc argeo-slc - 0.8.1 + 0.8-SNAPSHOT ../org.argeo.slc argeo-slc-core diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/AbstractContextTestData.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/AbstractContextTestData.java new file mode 100644 index 000000000..ee7aad068 --- /dev/null +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/AbstractContextTestData.java @@ -0,0 +1,14 @@ +package org.argeo.slc.core.test.context; + +import org.argeo.slc.core.test.TestData; +import org.argeo.slc.core.test.TestDataProvider; +import org.argeo.slc.core.test.TestDataUtils; + +public class AbstractContextTestData extends SimpleContextAware implements + TestData, TestDataProvider { + + public T getTestData(Class clss, String key) { + return TestDataUtils.getItSelf(clss, this); + } + +} diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextAware.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextAware.java index 8c553383e..a9b8cb5e7 100644 --- a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextAware.java +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextAware.java @@ -9,4 +9,5 @@ public interface ContextAware { public Map getExpectedValues(); + public void setExpectedValues(Map expectedValues); } diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextUtils.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextUtils.java index 4f9d6ea9c..f157ac78c 100644 --- a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextUtils.java +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextUtils.java @@ -1,5 +1,8 @@ package org.argeo.slc.core.test.context; +import java.util.Map; +import java.util.TreeMap; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -72,6 +75,70 @@ public class ContextUtils { } } + /** + * Makes sure that all children and sub-children of parent share the same + * maps for values and expected values. + */ + public static void synchronize(ParentContextAware parent) { + Map expectedValuesCommon = new TreeMap( + parent.getExpectedValues()); + synchronize(parent, expectedValuesCommon); + if (log.isDebugEnabled()) + log.debug("Synchonized context " + parent); + + } + + private static void synchronize(ParentContextAware parent, + Map expectedValuesCommon) { + for (ContextAware child : parent.getChildContexts()) { + // Values + putNotContained(parent.getValues(), child.getValues()); + child.setValues(parent.getValues()); + + // Expected Values + // Expected values reference is not overridden: each child has its + // own expected values map. + overrideContained(expectedValuesCommon, child.getExpectedValues()); + + // Creates a new Map in order not to disturb other context using the + // same keys + Map expectedValuesCommonChild = new TreeMap( + expectedValuesCommon); + putNotContained(expectedValuesCommonChild, child + .getExpectedValues()); + + if (child instanceof ParentContextAware) { + // Recursive sync + synchronize((ParentContextAware) child, + expectedValuesCommonChild); + } + } + + } + + /** + * Put into common map the values from child map which are not already + * defined in common map. + */ + private static void putNotContained(Map commonMap, + Map childMap) { + for (String key : childMap.keySet()) { + if (!commonMap.containsKey(key)) { + commonMap.put(key, childMap.get(key)); + } + } + } + + /** Overrides child map values with the values already set in common map */ + private static void overrideContained(Map commonMap, + Map childMap) { + for (String key : childMap.keySet()) { + if (commonMap.containsKey(key)) { + childMap.put(key, commonMap.get(key)); + } + } + } + /** Makes sure this cannot be instantiated. */ private ContextUtils() { diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ParentContextAware.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ParentContextAware.java new file mode 100644 index 000000000..4022f9427 --- /dev/null +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ParentContextAware.java @@ -0,0 +1,7 @@ +package org.argeo.slc.core.test.context; + +import java.util.Collection; + +public interface ParentContextAware extends ContextAware { + public Collection getChildContexts(); +} diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleContextAware.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleContextAware.java new file mode 100644 index 000000000..9ce69cdee --- /dev/null +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleContextAware.java @@ -0,0 +1,47 @@ +package org.argeo.slc.core.test.context; + +import java.beans.BeanInfo; +import java.util.Map; +import java.util.TreeMap; + +import org.springframework.beans.factory.InitializingBean; + +public class SimpleContextAware implements ContextAware, InitializingBean { + private SimpleParentContextAware parentContext; + + private Map values = new TreeMap(); + private Map expectedValues = new TreeMap(); + + public Map getValues() { + return values; + } + + public void setValues(Map values) { + this.values = values; + } + + public Map getExpectedValues() { + return expectedValues; + } + + public void setExpectedValues(Map expectedValues) { + this.expectedValues = expectedValues; + } + + /** Used to add this context as a child by setting a property. */ + public void setParentContext(SimpleParentContextAware parentContextAware) { + parentContextAware.addChildContext(this); + this.parentContext = parentContextAware; + } + + protected SimpleParentContextAware getParentContext() { + return parentContext; + } + + public void afterPropertiesSet() throws Exception { + if (parentContext != null) { + ContextUtils.synchronize(parentContext); + } + } + +} diff --git a/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleParentContextAware.java b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleParentContextAware.java new file mode 100644 index 000000000..08f54ac87 --- /dev/null +++ b/org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleParentContextAware.java @@ -0,0 +1,30 @@ +package org.argeo.slc.core.test.context; + +import java.util.Collection; +import java.util.List; +import java.util.Vector; + +import org.springframework.beans.factory.InitializingBean; + +public class SimpleParentContextAware extends SimpleContextAware implements + ParentContextAware, InitializingBean { + private List children = new Vector(); + + public Collection getChildContexts() { + return children; + } + + public void addChildContext(ContextAware contextAware) { + children.add(contextAware); + } + + @Override + public void afterPropertiesSet() throws Exception { + if (getParentContext() != null) { + // If has a parent, sync it. + super.afterPropertiesSet(); + } else { + ContextUtils.synchronize(this); + } + } +} -- 2.39.2