You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2005/03/22 11:31:25 UTC

svn commit: r158591 - in cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding: JXPathBindingBase.java MultiValueJXPathBinding.java

Author: sylvain
Date: Tue Mar 22 02:31:24 2005
New Revision: 158591

URL: http://svn.apache.org/viewcvs?view=rev&rev=158591
Log:
merge DOMFactory and the new support for collections

Modified:
    cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java
    cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/MultiValueJXPathBinding.java

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java?view=diff&r1=158590&r2=158591
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java Tue Mar 22 02:31:24 2005
@@ -15,6 +15,7 @@
  */
 package org.apache.cocoon.forms.binding;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -24,7 +25,7 @@
 import org.apache.cocoon.forms.formmodel.Widget;
 import org.apache.cocoon.util.jxpath.DOMFactory;
 import org.apache.commons.jxpath.JXPathContext;
-import org.w3c.dom.Node;
+import org.apache.commons.jxpath.Pointer;
 
 /**
  * Provides a base class for hooking up Binding implementations that use the
@@ -244,9 +245,7 @@
         if (!(objModel instanceof JXPathContext)) {
             jxpc = JXPathContext.newContext(objModel);
             jxpc.setLenient(true);
-            if (objModel instanceof Node) {
-                jxpc.setFactory(new DOMFactory());
-            }
+            jxpc.setFactory(new BindingJXPathFactory());
         } else {
             jxpc = (JXPathContext) objModel;
         }
@@ -264,5 +263,37 @@
 
     protected Logger getLogger() {
         return logger;
+    }
+    
+    /**
+     * JXPath factory that combines the DOMFactory and support for collections.
+     */
+    private static class BindingJXPathFactory extends DOMFactory {
+        
+        public boolean createObject(JXPathContext context, Pointer pointer, Object parent, String name, int index) {
+            if (createCollectionItem(context, pointer, parent, name, index)) {
+                return true;
+            } else {
+                return super.createObject(context, pointer, parent, name, index);
+            }
+        }
+        
+        private boolean createCollectionItem(JXPathContext context, Pointer pointer, Object parent, String name, int index) {
+            // FIXME: don't clearly understand how this works.
+            // see http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=111148567029114&w=2
+            final Object o = context.getValue(name);
+            if (o == null) {
+                return false;
+            }
+            if (o instanceof Collection) {
+                ((Collection)o).add(null);
+            } else if(o.getClass().isArray()) {
+                // not yet supported
+                return false;
+            } else {
+                return false;
+            }
+            return true;
+        }
     }
 }

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/MultiValueJXPathBinding.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/MultiValueJXPathBinding.java?view=diff&r1=158590&r2=158591
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/MultiValueJXPathBinding.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/MultiValueJXPathBinding.java Tue Mar 22 02:31:24 2005
@@ -104,24 +104,7 @@
         Object[] values = (Object[])widget.getValue();
 
         JXPathContext multiValueContext = jctx.getRelativeContext(jctx.createPath(this.multiValuePath));
-        multiValueContext.setFactory( new AbstractFactory() {
-            public boolean createObject(JXPathContext context, Pointer pointer,
-                                        Object parent, String name, int index) {
-                final Object o = context.getValue(name);
-		if( o == null ) {
-		    return false;
-		}
-                if( Collection.class.isAssignableFrom( o.getClass() ) ) {
-                    ((Collection)context.getValue(name)).add(null);
-                } else if( o.getClass().isArray() ) {
-                    // not yet supported
-                    return false;
-                } else {
-                    return false;
-                }
-                return true;
-            }
-        });
+
         // Delete all that is already present
         multiValueContext.removeAll(this.rowPath);