Thanks.  That does work.  I'll close the bug.

However, it's rather a pain in the neck to have to a specify a converter
(excuse me, convertor) for all the non-string form fields.  A patch to fix
that is attached (should I open another Bugzilla bug?).  

ValueJXPathBinding has been modified so that if the Widget implements
DataWidget and no converter is defined on the binding, the converter from
the Widget is used.  BooleanField now also implements DataWidget.  

I can't say I'm familiar enough with the code to know if this is the best
solution, but it works for me.  

Pete

> ------- Additional Comments From [EMAIL PROTECTED]  2004-07-27 22:09
> -------
> Isn't this the task of the convertor? See
> http://cocoon.apache.org/2.1/userdocs/forms/binding.html#fb%3Avalue for
> more
> info. If my assumption is correct, please close this bug marking it
> "INVALID".
> 
> Jörg
> 

-- 
NEU: WLAN-Router f�r 0,- EUR* - auch f�r DSL-Wechsler!
GMX DSL = superg�nstig & kabellos http://www.gmx.net/de/go/dsl
diff -urb 
C:\Temp\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/binding/ValueJXPathBinding.java
 
C:\eclipseWorkspace\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/binding/ValueJXPathBinding.java
--- 
C:\Temp\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/binding/ValueJXPathBinding.java
        2004-07-09 10:03:42.000000000 +0200
+++ 
C:\eclipseWorkspace\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/binding/ValueJXPathBinding.java
    2004-07-28 02:24:12.000000000 +0200
@@ -20,6 +20,7 @@
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.cocoon.forms.datatype.convertor.Convertor;
 import org.apache.cocoon.forms.datatype.convertor.ConversionResult;
+import org.apache.cocoon.forms.formmodel.DataWidget;
 import org.apache.cocoon.forms.formmodel.Widget;
 import org.apache.commons.jxpath.JXPathContext;
 import org.apache.commons.jxpath.JXPathException;
@@ -88,9 +89,10 @@
         }
 
         Object value = jxpc.getValue(this.xpath);
-        if (value != null && convertor != null) {
+        Convertor c = getConvertor(widget);
+        if (value != null && c != null) {
             if (value instanceof String) {
-                ConversionResult conversionResult = 
convertor.convertFromString((String)value, convertorLocale, null);
+                ConversionResult conversionResult = 
c.convertFromString((String)value, convertorLocale, null);
                 if (conversionResult.isSuccessful())
                     value = conversionResult.getResult();
                 else
@@ -113,8 +115,9 @@
     public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
         Widget widget = selectWidget(frmModel, this.fieldId);
         Object value = widget.getValue();
-        if (value != null && convertor != null) {
-            value = convertor.convertToString(value, convertorLocale, null);
+        Convertor c = getConvertor(widget);
+        if (value != null && c != null) {
+            value = c.convertToString(value, convertorLocale, null);
         }
 
         Object oldValue = jxpc.getValue(this.xpath);
@@ -172,6 +175,18 @@
         return this.convertor;
     }
 
+    private Convertor getConvertor(Widget widget) {
+        if (getConvertor() != null) {
+            return getConvertor();
+        } else {
+            if (widget instanceof DataWidget) {
+                return ((DataWidget)widget).getDatatype().getConvertor();
+            } else {
+                return null;
+            }
+        }
+    }
+
     public Locale getConvertorLocale() {
         return this.convertorLocale;
     }
diff -urb 
C:\Temp\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java
 
C:\eclipseWorkspace\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java
--- 
C:\Temp\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java
    2004-07-09 10:04:48.000000000 +0200
+++ 
C:\eclipseWorkspace\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java
        2004-07-28 02:24:30.000000000 +0200
@@ -19,6 +19,7 @@
 
 import org.apache.cocoon.forms.Constants;
 import org.apache.cocoon.forms.FormContext;
+import org.apache.cocoon.forms.datatype.Datatype;
 import org.apache.cocoon.forms.event.*;
 import org.apache.cocoon.xml.XMLUtils;
 import org.xml.sax.ContentHandler;
@@ -37,7 +38,7 @@
  * 
  * @version $Id: BooleanField.java,v 1.10 2004/05/07 13:42:10 mpo Exp $
  */
-public class BooleanField extends AbstractWidget implements 
ValueChangedListenerEnabled {
+public class BooleanField extends AbstractWidget implements DataWidget, 
ValueChangedListenerEnabled {
     // FIXME(SW) : should the initial value be false or null ? This would allow
     // event listeners to be triggered at bind time.
     private Boolean value = Boolean.FALSE;
@@ -142,4 +143,8 @@
         this.definition.fireValueChangedEvent((ValueChangedEvent)event);
         fireValueChangedEvent((ValueChangedEvent)event);
     }
+    
+    public Datatype getDatatype() {
+        return definition.getDatatype();
+    }
 }
diff -urb 
C:\Temp\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java
 
C:\eclipseWorkspace\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java
--- 
C:\Temp\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java
  2004-07-09 10:03:28.000000000 +0200
+++ 
C:\eclipseWorkspace\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java
      2004-07-28 02:24:43.000000000 +0200
@@ -15,6 +15,7 @@
  */
 package org.apache.cocoon.forms.formmodel;
 
+import org.apache.cocoon.forms.datatype.Datatype;
 import org.apache.cocoon.forms.event.ValueChangedEvent;
 import org.apache.cocoon.forms.event.ValueChangedListener;
 import org.apache.cocoon.forms.event.WidgetEventMulticaster;
@@ -26,6 +27,7 @@
  */
 public class BooleanFieldDefinition extends AbstractWidgetDefinition {
     private ValueChangedListener listener;
+    private Datatype datatype;
 
     public Widget createInstance() {
         return new BooleanField(this);
@@ -48,4 +50,12 @@
     public void setRequired(boolean required) {
         throw new UnsupportedOperationException("The property 'required' is not 
available on widgets of type booleanfield.");
     }    
+    
+    public Datatype getDatatype() {
+        return datatype;
+    }
+    
+    public void setDatatype(Datatype datatype) {
+        this.datatype = datatype;
+    }
 }
diff -urb 
C:\Temp\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java
 
C:\eclipseWorkspace\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java
--- 
C:\Temp\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java
   2004-07-09 10:03:48.000000000 +0200
+++ 
C:\eclipseWorkspace\cocoon-2.1.5.1\src\blocks\forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java
       2004-07-28 02:24:58.000000000 +0200
@@ -17,6 +17,8 @@
 
 import java.util.Iterator;
 
+import org.apache.cocoon.forms.Constants;
+import org.apache.cocoon.forms.datatype.Datatype;
 import org.apache.cocoon.forms.event.ValueChangedListener;
 import org.w3c.dom.Element;
 
@@ -37,6 +39,15 @@
             definition.addValueChangedListener((ValueChangedListener)iter.next());
         }
 
+        Element datatypeElement = 
+            widgetElement.getOwnerDocument().createElementNS(
+                Constants.DEFINITION_NS, "datatype");
+        
+        datatypeElement.setAttribute("base", "boolean");
+        
+        Datatype datatype = datatypeManager.createDatatype(datatypeElement, false);
+        definition.setDatatype(datatype);
+
         // TODO default value
         return definition;
     }

Reply via email to