You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Huib Verweij <hu...@streamtec.nl> on 2005/06/14 19:31:57 UTC

CForms, xindice database and boolean

Hi cocooners,

I posted this question to the users-list earlier but got no response sofar. Perhaps it is more a dev-list question, because it is about a possbile bug, or feature, and a fix.

I'm relatively new to Cocoon and have been struggling to get the CForms framework (it's great!) to work with the embedded xindice database to load and save data for the form. I've solved this problem thanks to one message I found (can't find it right now) that said to use the JXPath engine to insert the DOM-tree in the XML pipeline using <jx:out value="#{dom/*}"/> where 'dom' is the (DOM-) document that comes out of the CForms framework. When you have your XML-document in the pipeline again you can use Xupdate to save it back to the xindice database.

So that works and it's great! But I had one small problem. When I defined a boolean value in my form it was saved as:

 <mail> 
    <spam-me-baby value="true"/> 
</mail> 

but when I requested the form again I got the error

'Cannot set value of boolean field "spam-me-baby" to a non-Boolean value.'

I suspected that getting the value from the xindice db would be different (i.e. String) than getting the value from a bean (i.e. Boolean) for instance. I fixed it by editing the file

src/blocks/forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java.

I inserted the following code in the function setValue, just after the check (object == null):

        if (object instanceof String) {
            object = new Boolean((String) object);
        }

That solved the problem, but now I have a few questions.

1    Was my assumption about the datatype of the value from xindice vs. bean correct?
2    Is my fix correct? (I think there's probably a more elegant way ;-) )
3    Is the described behaviour a bug or a feature? In other words, did I fix something (and will it still be fixed in the next release?) or haven't I understood how to use the boolean in a CForm?

The relevant parts of my CForms-definitions are:


*** In the form-definition XML file: ***
    <fd:booleanfield id="spam-me-baby">
      <fd:label><i18n:text key="account_info-field-spam_me_baby">hou mij op de hoogte</i18n:text>:</fd:label>
    </fd:booleanfield>


*** In the binding XML file: ***
    <fb:context xmlns:fb="http://apache.org/cocoon/forms/1.0#binding"
                     xmlns:fd="http://apache.org/cocoon/forms/1.0#definition"
                     path="/db:results/db:result/user" >
   .....
  <fb:value id="spam-me-baby" path="personal/preferences/mail/spam-me-baby/@value" />


*** Generating the XML input: ***
  <map:call function="handleForm">
       <map:parameter name="function" value="account2xml"/>
       <map:parameter name="form-definition" value="forms/account.xml"/>
       <map:parameter name="bindingURI" value="forms/binding/account-bind.xml"/>
       <map:parameter name="documentURI" value="xmldb:xindice-embed:///db/god/#//users/user[@id='{ID}']" />
  </map:call>

(The {ID} comes from the authentication-fw)


*** Saving the XML output: ***

in account.js:

    // save the DOM-tree back to XML using the JXPath framework
   cocoon.sendPage("account-success-pipeline", { "dom":document } );

in the sitemap (internal call):
  <map:generate type="jx" src="jx/account-success-pipeline.jx">
      <map:parameter name="lenient-xpath" value="true"/>
  </map:generate>

jx/account-success-pipeline.jx contains:

  <jx:out value="#{dom/*[local-name()='results']/*[local-name()='result']/*}"/>

and then xupdate is used to save the XML back to the embedded xindice database.


Regards and many thanks for any answers!

Huib.