You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gk...@apache.org on 2008/01/28 19:52:04 UTC

svn commit: r615992 - in /cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src: changes/ main/java/org/apache/cocoon/el/impl/objectmodel/ test/java/org/apache/cocoon/el/impl/objectmodel/

Author: gkossakowski
Date: Mon Jan 28 10:52:03 2008
New Revision: 615992

URL: http://svn.apache.org/viewvc?rev=615992&view=rev
Log:
<action dev="gkossakowski" type="fix">
  Fixed handling of multiple values at the same path in ObjectModel.
</action>

Modified:
    cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/changes/changes.xml
    cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/main/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImpl.java
    cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/test/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImplTestCase.java

Modified: cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/changes/changes.xml?rev=615992&r1=615991&r2=615992&view=diff
==============================================================================
--- cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/changes/changes.xml (original)
+++ cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/changes/changes.xml Mon Jan 28 10:52:03 2008
@@ -25,7 +25,9 @@
 <document>
   <body>
     <release version="1.0.0-M1-SNAPSHOT" date="2007-00-00" description="unreleased">  
-      
+      <action dev="gkossakowski" type="fix">
+      	Fixed handling of multiple values at the same path in ObjectModel.
+      </action>
     </release>
   </body>
 </document>

Modified: cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/main/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImpl.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/main/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImpl.java?rev=615992&r1=615991&r2=615992&view=diff
==============================================================================
--- cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/main/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImpl.java (original)
+++ cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/main/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImpl.java Mon Jan 28 10:52:03 2008
@@ -114,6 +114,25 @@
         singleValueMap.putAll(mapToCopy);
         multiValueMap.putAll(mapToCopy);
     }
+    
+    /**
+     * Tries to find any PathValue entry in current local context having the same first segment of path as the path given
+     * @param path
+     * @return true if corresponding PathValue entry has been found or local context is empty and false otherwise.
+     */
+    private boolean findPathFragmentInLocalContext(String path) {
+    	if (localContexts.empty())
+    		return true;
+    	String fragment = path.substring(0, path.indexOf(SEGMENT_SEPARATOR));
+    	
+    	for (Iterator localContextIterator = ((ArrayStack) localContexts.peek()).iterator(); localContextIterator.hasNext(); ) {
+    		Object item = localContextIterator.next();
+    		if (item instanceof PathValue)
+    			if (((PathValue) item).getPath().startsWith(fragment))
+    				return true;
+    	}
+    	return false;
+    }
 
     /**
      * Locates map at given path
@@ -124,6 +143,11 @@
     private Map locateMapAt(String path, boolean createIfNeeded) {
         if (path.lastIndexOf(SEGMENT_SEPARATOR) == -1) {
             return this;
+        }
+        
+        if (!findPathFragmentInLocalContext(path) && createIfNeeded) {
+        	String fragment = path.substring(0, path.indexOf(SEGMENT_SEPARATOR));
+        	this.put(fragment, new HashMap());
         }
 
         Map map = this;

Modified: cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/test/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImplTestCase.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/test/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImplTestCase.java?rev=615992&r1=615991&r2=615992&view=diff
==============================================================================
--- cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/test/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImplTestCase.java (original)
+++ cocoon/whiteboard/micro/core/cocoon-expression-language/cocoon-expression-language-impl/src/test/java/org/apache/cocoon/el/impl/objectmodel/ObjectModelImplTestCase.java Mon Jan 28 10:52:03 2008
@@ -17,13 +17,13 @@
 package org.apache.cocoon.el.impl.objectmodel;
 
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.Map;
 
-import org.apache.cocoon.el.impl.objectmodel.ObjectModelImpl;
-import org.apache.cocoon.el.objectmodel.ObjectModel;
-
 import junit.framework.TestCase;
 
+import org.apache.cocoon.el.objectmodel.ObjectModel;
+
 public class ObjectModelImplTestCase extends TestCase {
     
     private ObjectModel objectModel;
@@ -120,6 +120,24 @@
         assertTrue(objectModel.containsKey("foo"));
         assertTrue(objectModel.get("foo") instanceof Map);
         assertEquals(((Map)objectModel.get("foo")).get("bar"), "xyz");
+    }
+    
+    public void testPutAtMultiValues() {
+    	objectModel.markLocalContext();
+    	objectModel.putAt("foo/bar", "xyz");
+    	objectModel.markLocalContext();
+    	objectModel.putAt("foo/bar", "abc");
+    	Collection allFoos = (Collection)objectModel.getAll().get("foo");
+    	Iterator it = allFoos.iterator();
+    	assertEquals("abc", ((Map)it.next()).get("bar"));
+    	assertEquals("xyz", ((Map)it.next()).get("bar"));
+    	objectModel.cleanupLocalContext();
+    	
+    	allFoos = (Collection)objectModel.getAll().get("foo");
+    	it = allFoos.iterator();
+    	assertEquals(1, allFoos.size());
+    	assertEquals("xyz", ((Map)it.next()).get("bar"));
+    	objectModel.cleanupLocalContext();
     }
 
     public void testPathInLocalContext() {