]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Introduce parent context
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 30 Jan 2008 14:35:25 +0000 (14:35 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 30 Jan 2008 14:35:25 +0000 (14:35 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@934 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.slc.core/pom.xml
org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/AbstractContextTestData.java [new file with mode: 0644]
org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextAware.java
org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ContextUtils.java
org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/ParentContextAware.java [new file with mode: 0644]
org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleContextAware.java [new file with mode: 0644]
org.argeo.slc.core/src/main/java/org/argeo/slc/core/test/context/SimpleParentContextAware.java [new file with mode: 0644]

index 8cfedcf0ac42c028314fb6a6324653bd0ae4e275..72fc35e8d7d960be8d3b130531b276bb7b6ea331 100644 (file)
@@ -6,7 +6,7 @@
        <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
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 (file)
index 0000000..ee7aad0
--- /dev/null
@@ -0,0 +1,14 @@
+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
index 8c553383e93311b6027c2887ed114cbc8b4eea99..a9b8cb5e7481a9899b60dd07adf76ca7756117ba 100644 (file)
@@ -9,4 +9,5 @@ public interface ContextAware {
 \r
        public Map<String, Object> getExpectedValues();\r
 \r
+       public void setExpectedValues(Map<String, Object> expectedValues);\r
 }\r
index 4f9d6ea9c068976a1a1bd9624dfbbb379b8e963a..f157ac78c17eacf2bfca95aebbc94c035d9ca7e9 100644 (file)
@@ -1,5 +1,8 @@
 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
@@ -72,6 +75,70 @@ public class ContextUtils {
                }\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
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 (file)
index 0000000..4022f94
--- /dev/null
@@ -0,0 +1,7 @@
+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
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 (file)
index 0000000..9ce69cd
--- /dev/null
@@ -0,0 +1,47 @@
+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
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 (file)
index 0000000..08f54ac
--- /dev/null
@@ -0,0 +1,30 @@
+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