<parent>\r
<groupId>org.argeo.slc</groupId>\r
<artifactId>argeo-slc</artifactId>\r
- <version>0.8.1</version>\r
+ <version>0.8-SNAPSHOT</version>\r
<relativePath>../org.argeo.slc</relativePath>\r
</parent>\r
<artifactId>argeo-slc-core</artifactId>\r
--- /dev/null
+package org.argeo.slc.core.test.context;\r
+\r
+import org.argeo.slc.core.test.TestData;\r
+import org.argeo.slc.core.test.TestDataProvider;\r
+import org.argeo.slc.core.test.TestDataUtils;\r
+\r
+public class AbstractContextTestData extends SimpleContextAware implements\r
+ TestData, TestDataProvider {\r
+\r
+ public <T extends TestData> T getTestData(Class<T> clss, String key) {\r
+ return TestDataUtils.getItSelf(clss, this);\r
+ }\r
+\r
+}\r
\r
public Map<String, Object> getExpectedValues();\r
\r
+ public void setExpectedValues(Map<String, Object> expectedValues);\r
}\r
package org.argeo.slc.core.test.context;\r
\r
+import java.util.Map;\r
+import java.util.TreeMap;\r
+\r
import org.apache.commons.logging.Log;\r
import org.apache.commons.logging.LogFactory;\r
\r
}\r
}\r
\r
+ /**\r
+ * Makes sure that all children and sub-children of parent share the same\r
+ * maps for values and expected values.\r
+ */\r
+ public static void synchronize(ParentContextAware parent) {\r
+ Map<String, Object> expectedValuesCommon = new TreeMap<String, Object>(\r
+ parent.getExpectedValues());\r
+ synchronize(parent, expectedValuesCommon);\r
+ if (log.isDebugEnabled())\r
+ log.debug("Synchonized context " + parent);\r
+\r
+ }\r
+\r
+ private static void synchronize(ParentContextAware parent,\r
+ Map<String, Object> expectedValuesCommon) {\r
+ for (ContextAware child : parent.getChildContexts()) {\r
+ // Values\r
+ putNotContained(parent.getValues(), child.getValues());\r
+ child.setValues(parent.getValues());\r
+\r
+ // Expected Values\r
+ // Expected values reference is not overridden: each child has its\r
+ // own expected values map.\r
+ overrideContained(expectedValuesCommon, child.getExpectedValues());\r
+\r
+ // Creates a new Map in order not to disturb other context using the\r
+ // same keys\r
+ Map<String, Object> expectedValuesCommonChild = new TreeMap<String, Object>(\r
+ expectedValuesCommon);\r
+ putNotContained(expectedValuesCommonChild, child\r
+ .getExpectedValues());\r
+\r
+ if (child instanceof ParentContextAware) {\r
+ // Recursive sync\r
+ synchronize((ParentContextAware) child,\r
+ expectedValuesCommonChild);\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ /**\r
+ * Put into common map the values from child map which are not already\r
+ * defined in common map.\r
+ */\r
+ private static void putNotContained(Map<String, Object> commonMap,\r
+ Map<String, Object> childMap) {\r
+ for (String key : childMap.keySet()) {\r
+ if (!commonMap.containsKey(key)) {\r
+ commonMap.put(key, childMap.get(key));\r
+ }\r
+ }\r
+ }\r
+\r
+ /** Overrides child map values with the values already set in common map */\r
+ private static void overrideContained(Map<String, Object> commonMap,\r
+ Map<String, Object> childMap) {\r
+ for (String key : childMap.keySet()) {\r
+ if (commonMap.containsKey(key)) {\r
+ childMap.put(key, commonMap.get(key));\r
+ }\r
+ }\r
+ }\r
+\r
/** Makes sure this cannot be instantiated. */\r
private ContextUtils() {\r
\r
--- /dev/null
+package org.argeo.slc.core.test.context;\r
+\r
+import java.util.Collection;\r
+\r
+public interface ParentContextAware extends ContextAware {\r
+ public Collection<ContextAware> getChildContexts();\r
+}\r
--- /dev/null
+package org.argeo.slc.core.test.context;\r
+\r
+import java.beans.BeanInfo;\r
+import java.util.Map;\r
+import java.util.TreeMap;\r
+\r
+import org.springframework.beans.factory.InitializingBean;\r
+\r
+public class SimpleContextAware implements ContextAware, InitializingBean {\r
+ private SimpleParentContextAware parentContext;\r
+\r
+ private Map<String, Object> values = new TreeMap<String, Object>();\r
+ private Map<String, Object> expectedValues = new TreeMap<String, Object>();\r
+\r
+ public Map<String, Object> getValues() {\r
+ return values;\r
+ }\r
+\r
+ public void setValues(Map<String, Object> values) {\r
+ this.values = values;\r
+ }\r
+\r
+ public Map<String, Object> getExpectedValues() {\r
+ return expectedValues;\r
+ }\r
+\r
+ public void setExpectedValues(Map<String, Object> expectedValues) {\r
+ this.expectedValues = expectedValues;\r
+ }\r
+\r
+ /** Used to add this context as a child by setting a property. */\r
+ public void setParentContext(SimpleParentContextAware parentContextAware) {\r
+ parentContextAware.addChildContext(this);\r
+ this.parentContext = parentContextAware;\r
+ }\r
+\r
+ protected SimpleParentContextAware getParentContext() {\r
+ return parentContext;\r
+ }\r
+\r
+ public void afterPropertiesSet() throws Exception {\r
+ if (parentContext != null) {\r
+ ContextUtils.synchronize(parentContext);\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package org.argeo.slc.core.test.context;\r
+\r
+import java.util.Collection;\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import org.springframework.beans.factory.InitializingBean;\r
+\r
+public class SimpleParentContextAware extends SimpleContextAware implements\r
+ ParentContextAware, InitializingBean {\r
+ private List<ContextAware> children = new Vector<ContextAware>();\r
+\r
+ public Collection<ContextAware> getChildContexts() {\r
+ return children;\r
+ }\r
+\r
+ public void addChildContext(ContextAware contextAware) {\r
+ children.add(contextAware);\r
+ }\r
+\r
+ @Override\r
+ public void afterPropertiesSet() throws Exception {\r
+ if (getParentContext() != null) {\r
+ // If has a parent, sync it.\r
+ super.afterPropertiesSet();\r
+ } else {\r
+ ContextUtils.synchronize(this);\r
+ }\r
+ }\r
+}\r