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() {