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);