You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Scott Yeadon <sc...@anu.edu.au> on 2004/06/23 00:21:17 UTC

CForm bind problem (EvaluatorException: org.mozilla.javascript.UniqueTag)

Hello,

I am trying to understand the process and minimum requirement for 
setting up a simple CForm in Cocoon 2.1.5. I have followed the doco and 
samples where possible but I think I've hit a wall. I have created a 
simple form, but failed when binding from an XML file with the following 
error:
org.mozilla.javascript.EvaluatorException: 
"resource://org/apache/cocoon/forms/flow/javascript/Form.js", line 164: 
Invalid JavaScript value of type org.mozilla.javascript.UniqueTag

I reduced the form down to a simple single text field bind, but still 
received the same error.

What I have set up is a simple form called batchUpload with its own dir 
area as follows:
BASEDIR: cocoon2.1.5/build/webapp/forms-test
Forms: $BASEDIR/forms
Flow: $BASEDIR/flow
Resources: $BASEDIR/resources (this is a copy of the cocoon resources 
dir build/webapp/samples/blocks/forms/resources, so has the field 
stylesheets, etc)
Messages: $BASEDIR/messages
Sitemap: $BASEDIR/sitemap.xmap

The sitemap file is as follows:

<?xml version="1.0"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
 <map:components>
  <map:transformers default="xalan">
    <map:transformer name="i18n" 
src="org.apache.cocoon.transformation.I18nTransformer">
      <catalogues default="other">
        <catalogue id="other" name="OtherMessages" location="./messages"/>
      </catalogues>
      <cache-at-startup>true</cache-at-startup>
    </map:transformer>
  </map:transformers>
 </map:components>

<map:flow language="javascript">
  <map:script src="flow/batchUpload.js"/>
</map:flow>

 <map:pipelines>
   <map:pipeline>

<map:match pattern="batchUpload">
  <map:call function="handleForm">
    <map:parameter name="function" value="batchUpload"/>
    <map:parameter name="form-definition" value="forms/batchUpload.xml"/>
    <map:parameter name="documentURI" value="forms/batchUpload_data.xml"/>
    <map:parameter name="bindingURI" value="forms/batchUpload_bind.xml"/>
  </map:call>
</map:match>

<map:match pattern="*.continue">
  <map:call continuation="{1}"/>
</map:match>

<map:match pattern="batchUpload-display-pipeline">
  <map:generate src="forms/batchUpload_template.xml"/>
  <map:transform type="forms"/>
  <map:transform type="i18n">
    <map:parameter name="locale" value="en-US"/>
  </map:transform>
  <map:transform src="resources/forms-samples-styling.xsl"/>
  <map:serialize/>
</map:match>

<map:match pattern="batchUpload-success-pipeline.jx">
  <map:generate type="jx" src="forms/batchUpload_success.jx"/>
  <map:serialize/>
</map:match>
</map:pipeline>
</map:pipelines>
</map:sitemap>

=====================
The Javascript to do the form load (batchUpload.js), bind and display is 
as follows (within the form.load() is where the exception mentioned 
above is thrown)

cocoon.load("resource://org/apache/cocoon/forms/flow/javascript/Form.js");

function batchUpload() {
    var form = new Form("forms/batchUpload.xml");
// added for bind
    var documentURI = cocoon.parameters["documentURI"];

    // parse the document to a DOM-tree
    var document = loadDocument(documentURI);

    // bind the document data to the form
    form.load(document);

    // The showForm function will keep redisplaying the form until
    // everything is valid
    form.showForm("batchUpload-display-pipeline");
}

function loadDocument(uri) {
    var parser = null;
    var source = null;
    var resolver = null;
    try {
        parser = 
cocoon.getComponent(Packages.org.apache.excalibur.xml.dom.DOMParser.ROLE);
        resolver = 
cocoon.getComponent(Packages.org.apache.cocoon.environment.SourceResolver.ROLE);
        source = resolver.resolveURI(uri);
        var is = new 
Packages.org.xml.sax.InputSource(source.getInputStream());
        is.setSystemId(source.getURI());
        return parser.parseDocument(is);
    } finally {
        if (source != null)
            resolver.release(source);
        cocoon.releaseComponent(parser);
        cocoon.releaseComponent(resolver);
    }
}

============

The binding file (batchUpload_bind.xml) is the simplified bding file:

<?xml version="1.0"?>
<fb:context xmlns:fb="http://apache.org/cocoon/forms/1.0#binding" 
path="/" direction="load" 
xmlns:fd="http://apache.org/cocoon/forms/1.0#definition">
    <fb:value id="bitstreamDirSelect" path="/dc-elements/dc-element1"/>
</fb:context>

==============

The simplified data file (batchUpload_data.xml) is as follows:

<?xml version="1.0"?>
<dc-elements>
   <dc-element1 qualified="true">subject.other</dc-element1>
</dc-elements>

===================

The form definition (batchUpload.xml) is as follows:

<?xml version="1.0"?>
<fd:form
  xmlns:fd="http://apache.org/cocoon/forms/1.0#definition"
  xmlns:i18n="http://apache.org/cocoon/i18n/2.1">
  <fd:widgets>

    <fd:upload id="metafileSelect" required="true">
      <fd:label>Metadata File:</fd:label>
    </fd:upload>

    <fd:field id="bitstreamDirSelect" required="true">
      <fd:label>Content Directory:</fd:label>
      <fd:datatype base="string">
    <fd:validation>
      <fd:length min="5">
       <fd:failmessage>This field must be at least five 
chars</fd:failmessage>
      </fd:length>
    </fd:validation>
      </fd:datatype>
    </fd:field>

    <fd:field id="bitstreamNameField" required="true">
      <fd:label>Filename Field:</fd:label>
      <fd:datatype base="string"/>
      <fd:selection-list>
    <fd:item value="title"/>
    <fd:item value="library category"/>
    <fd:item value="filename"/>
    <fd:item value=" other categories"/>
      </fd:selection-list>
    </fd:field>

    <fd:field id="licenseFile" required="false">
      <fd:label>License File:</fd:label>
      <fd:datatype base="string"/>
    </fd:field>

    <fd:repeater id="DCMap" initial-size="3">
      <fd:label>Dublin Core Mapping</fd:label>
      <fd:widgets>
    <fd:field id="DCElement">
      <fd:datatype base="string"/>
      <fd:label>Dublin Core Field</fd:label>
      <fd:selection-list>
        <fd:item value=""/>
        <fd:item value="title"/>
        <fd:item value="subject.lcc"/>
        <fd:item value="subject.other"/>
      </fd:selection-list>
    </fd:field>
    <fd:field id="metadataField" required="true">
       <fd:datatype base="string"/>
       <fd:label>Metadata Field</fd:label>
       <fd:selection-list>
              <fd:item value="title"/>
              <fd:item value="library category"/>
              <fd:item value="filename"/>
              <fd:item value="other categories"/>
       </fd:selection-list>
    </fd:field>
    <fd:field id="separator">
       <fd:datatype base="string"/>
       <fd:label>Separator</fd:label>
    </fd:field>
      </fd:widgets>
    </fd:repeater>

    <fd:repeater id="results" initial-size="3">
      <fd:label>Results</fd:label>
      <fd:widgets>
    <fd:output id="failedItem">
      <fd:datatype base="string"/>
      <fd:label>Failed Item</fd:label>
    </fd:output>
    <fd:output id="failedReason">
      <fd:datatype base="string"/>
      <fd:label>Failed Reason</fd:label>
    </fd:output>
      </fd:widgets>
    </fd:repeater> 
  </fd:widgets>
</fd:form>

==================

Finally, the template file (batchUpload_template.xml) is as follows:
<?xml version="1.0"?>
<page xmlns:ft="http://apache.org/cocoon/forms/1.0#template"
  xmlns:fi="http://apache.org/cocoon/forms/1.0#instance" 
xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">
  <title>BatchUpload</title>
  <content>
    <ft:form-template action="batchUpload" method="POST" 
enctype="multipart/form-data">
    <fi:group>
      <fi:styling type="fieldset" layout="columns"/>
      <fi:label>Metadata and Content Setup</fi:label>
      <fi:items>
         <ft:widget id="metafileSelect"/>
         <ft:widget id="bitstreamDirSelect"/>
         <ft:widget id="bitstreamNameField"/>
         <ft:widget id="licenseFile"/>
      </fi:items>
    </fi:group>

    <br/>
    <fi:group>
    <fi:styling type="fieldset"/>
   
    <fi:label><ft:widget-label id="DCMap"/></fi:label>
    <fi:items>
    <table cellspacing="10">
        <tr>
          <th><ft:repeater-widget-label id="DCMap" 
widget-id="DCElement"/></th>
          <th><ft:repeater-widget-label id="DCMap" 
widget-id="metadataField"/></th>
          <th><ft:repeater-widget-label id="DCMap" 
widget-id="separator"/></th>
        </tr>
       <ft:repeater-widget id="DCMap">
          <tr>
            <td><ft:widget id="DCElement"/></td>
            <td><ft:widget id="metadataField"/></td>
            <td><ft:widget id="separator"/></td>
          </tr>
        </ft:repeater-widget>
    </table>
    </fi:items>
    </fi:group>

        <fi:group>
      <fi:styling type="fieldset" layout="columns"/>
      <fi:label>Status Window</fi:label>
      <fi:items>
        <ft:widget id="results"/>
      </fi:items>
        </fi:group>
    </ft:form-template>
    <script>
    </script>
  </content>
</page>

Anyone know what's behind this error?

Thanks.

Scott.