You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by ti...@apache.org on 2005/03/04 16:48:10 UTC

svn commit: r156171 [1/3] - in cocoon/whiteboard/forms: WEB-INF/xconf/ java/org/apache/cocoon/forms/acting/ java/org/apache/cocoon/forms/binding/ java/org/apache/cocoon/forms/event/ java/org/apache/cocoon/forms/event/impl/ java/org/apache/cocoon/forms/flow/javascript/ java/org/apache/cocoon/forms/flow/javascript/v2/ java/org/apache/cocoon/forms/flow/javascript/v3/ java/org/apache/cocoon/forms/formmodel/ java/org/apache/cocoon/forms/generation/ java/org/apache/cocoon/forms/transformation/ java/org/apache/cocoon/forms/util/ java/org/apache/cocoon/forms/validation/impl/ samples/ samples/dreamteam/ samples/dreamteam/content/ samples/forms/ samples/resources/ samples/swan/forms/ test/org/apache/cocoon/forms/datatype/convertor/

Author: tim
Date: Fri Mar  4 07:47:41 2005
New Revision: 156171

URL: http://svn.apache.org/viewcvs?view=rev&rev=156171
Log:
Sync with trunk revision 156075.

Removed:
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AddRowActionDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java
Modified:
    cocoon/whiteboard/forms/WEB-INF/xconf/forms.logkit
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/acting/HandleFormSubmitAction.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/ContextJXPathBinding.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/GroupJXPathBinding.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBuilderBase.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JavaScriptJXPathBindingBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBinding.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBindingBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/CreateEvent.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/impl/JavaScriptWidgetListener.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/Form.js
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/Form.js
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/ScriptableWidget.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/Form.js
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/ScriptableWidget.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerWidget.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Action.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ClassDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Field.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Form.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Group.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/GroupDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/MacroDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Messages.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/MessagesDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/MultiValueField.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/MultiValueFieldDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/MultiValueFieldDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/NewDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Output.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/OutputDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Repeater.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/RepeaterDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/SelectableWidget.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Struct.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/StructDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/StructDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/SubmitDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/SubmitDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Union.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/UnionDefinition.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/UnionDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Upload.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/UploadDefinitionBuilder.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Widget.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/WidgetDefinitionList.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/WidgetState.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/generation/jx-macros.xml
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/transformation/EffectPipe.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/transformation/EffectWidgetReplacingPipe.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/transformation/FormsPipelineConfig.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/util/DomHelper.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/util/JavaScriptHelper.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/util/XMLAdapter.java
    cocoon/whiteboard/forms/java/org/apache/cocoon/forms/validation/impl/JavaScriptValidatorBuilder.java
    cocoon/whiteboard/forms/samples/dreamteam/content/teamTemplate.jx
    cocoon/whiteboard/forms/samples/dreamteam/sitemap.xmap
    cocoon/whiteboard/forms/samples/forms/carselector_form.xml
    cocoon/whiteboard/forms/samples/forms/datasource_chooser.xml
    cocoon/whiteboard/forms/samples/forms/datasource_chooser_binding.xml
    cocoon/whiteboard/forms/samples/forms/datasource_chooser_template.xml
    cocoon/whiteboard/forms/samples/forms/dynamicrepeater.xml
    cocoon/whiteboard/forms/samples/forms/dynamicrepeater_template.xml
    cocoon/whiteboard/forms/samples/forms/form1.xml
    cocoon/whiteboard/forms/samples/forms/form1_template.xml
    cocoon/whiteboard/forms/samples/forms/form2_model.xml
    cocoon/whiteboard/forms/samples/forms/form2_template.xml
    cocoon/whiteboard/forms/samples/forms/form_model_gui_binding.xml
    cocoon/whiteboard/forms/samples/forms/form_model_gui_data.xml
    cocoon/whiteboard/forms/samples/forms/form_model_gui_model.xml
    cocoon/whiteboard/forms/samples/forms/form_model_gui_template.xml
    cocoon/whiteboard/forms/samples/forms/htmlarea_template.xml
    cocoon/whiteboard/forms/samples/forms/multipage_binding.xml
    cocoon/whiteboard/forms/samples/forms/multipage_model.xml
    cocoon/whiteboard/forms/samples/forms/multipage_template.xml
    cocoon/whiteboard/forms/samples/forms/registration_template.xml
    cocoon/whiteboard/forms/samples/forms/tasktree.xml
    cocoon/whiteboard/forms/samples/forms/tasktree_binding.xml
    cocoon/whiteboard/forms/samples/forms/tasktree_template.xml
    cocoon/whiteboard/forms/samples/forms/upload_template.xml
    cocoon/whiteboard/forms/samples/forms/xdoceditor_template.xml
    cocoon/whiteboard/forms/samples/resources/forms-field-styling.xsl
    cocoon/whiteboard/forms/samples/sitemap.xmap
    cocoon/whiteboard/forms/samples/swan/forms/binding_template.xml
    cocoon/whiteboard/forms/samples/swan/forms/model_template.xml
    cocoon/whiteboard/forms/samples/swan/forms/sitemap_template.xml
    cocoon/whiteboard/forms/samples/swan/forms/template_template.xml
    cocoon/whiteboard/forms/samples/swan/forms/xreport_template.xml
    cocoon/whiteboard/forms/samples/welcome.xml
    cocoon/whiteboard/forms/test/org/apache/cocoon/forms/datatype/convertor/EnumConvertorBuilderTestCase.java

Modified: cocoon/whiteboard/forms/WEB-INF/xconf/forms.logkit
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/WEB-INF/xconf/forms.logkit?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/WEB-INF/xconf/forms.logkit (original)
+++ cocoon/whiteboard/forms/WEB-INF/xconf/forms.logkit Fri Mar  4 07:47:41 2005
@@ -32,8 +32,7 @@
   </targets>
   <categories>
     <category log-level="ERROR" name="forms">
-    	<log-target id-ref="forms" />
-      <log-target id-ref="error"/>
+      <log-target id-ref="forms" />
     </category>
   </categories>
-</logkit>
\ No newline at end of file
+</logkit>

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/acting/HandleFormSubmitAction.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/acting/HandleFormSubmitAction.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/acting/HandleFormSubmitAction.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/acting/HandleFormSubmitAction.java Fri Mar  4 07:47:41 2005
@@ -83,9 +83,8 @@
 
             if (finished) {
                 return Collections.EMPTY_MAP;
-            } else {
-                return null;
-            }
+            } 
+            return null;
         } finally {
             resolver.release(source);
         }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/ContextJXPathBinding.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/ContextJXPathBinding.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/ContextJXPathBinding.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/ContextJXPathBinding.java Fri Mar  4 07:47:41 2005
@@ -76,6 +76,11 @@
             getLogger().debug("done saving " + toString());
         }
     }
+    
+    /** To allow child classes to know which path they bind to */
+    protected String getXPath() {
+        return this.xpath;
+    }
 
     public String toString() {
         return "ContextJXPathBinding [xpath=" + this.xpath + "]";

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/GroupJXPathBinding.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/GroupJXPathBinding.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/GroupJXPathBinding.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/GroupJXPathBinding.java Fri Mar  4 07:47:41 2005
@@ -30,9 +30,7 @@
  *
  * @version $Id$
  */
-public class GroupJXPathBinding extends ComposedJXPathBindingBase {
-
-    private final String xpath;
+public class GroupJXPathBinding extends ContextJXPathBinding {
 
     private final String widgetId;
 
@@ -43,9 +41,8 @@
      * @param childBindings
      */
     public GroupJXPathBinding(JXPathBindingBuilderBase.CommonAttributes commonAtts, String widgetId, String xpath, JXPathBindingBase[] childBindings) {
-        super(commonAtts, childBindings);
+        super(commonAtts, xpath, childBindings);
         this.widgetId = widgetId;
-        this.xpath = xpath;
     }
 
     /**
@@ -55,11 +52,7 @@
      */
     public void doLoad(Widget frmModel, JXPathContext jxpc) throws BindingException {
         Group groupWidget = (Group)selectWidget(frmModel, this.widgetId);
-        JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath));
-        super.doLoad(groupWidget, subContext);
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("done loading " + toString());
-        }
+        super.doLoad(groupWidget, jxpc);
     }
 
     /**
@@ -69,14 +62,10 @@
      */
     public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
         Group groupWidget = (Group)selectWidget(frmModel, this.widgetId);
-        JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath));
-        super.doSave(groupWidget, subContext);
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("done saving " + toString());
-        }
+        super.doSave(groupWidget, jxpc);
     }
 
     public String toString() {
-        return "GroupJXPathBinding [widget=" + this.widgetId + ", xpath=" + this.xpath + "]";
+        return "GroupJXPathBinding [widget=" + this.widgetId + ", xpath=" + getXPath() + "]";
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java Fri Mar  4 07:47:41 2005
@@ -16,6 +16,7 @@
 package org.apache.cocoon.forms.binding;
 
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.avalon.framework.logger.LogEnabled;
@@ -241,6 +242,7 @@
             throws BindingException {
         boolean inheritedLeniency = jxpc.isLenient();
         applyLeniency(jxpc);
+        applyNSDeclarations(jxpc);
         if (this.commonAtts.loadEnabled) {
             doLoad(frmModel, jxpc);
         }
@@ -280,6 +282,7 @@
             throws BindingException{
         boolean inheritedLeniency = jxpc.isLenient();
         applyLeniency(jxpc);
+        applyNSDeclarations(jxpc);
         if (this.commonAtts.saveEnabled) {
             doSave(frmModel, jxpc);
         }
@@ -305,6 +308,20 @@
     private void applyLeniency(JXPathContext jxpc) {
         if (this.commonAtts.leniency != null) {
             jxpc.setLenient(this.commonAtts.leniency.booleanValue());
+        }
+    }
+
+    private void applyNSDeclarations(JXPathContext jxpc)
+    {
+        if (this.commonAtts.nsDeclarations != null)
+        {
+            Iterator keysIter = this.commonAtts.nsDeclarations.keySet().iterator();
+            while (keysIter.hasNext())
+            {
+                String nsuri = (String) keysIter.next();
+                String pfx = (String) this.commonAtts.nsDeclarations.get(nsuri);
+                jxpc.registerNamespace(pfx, nsuri);
+            }
         }
     }
 

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBuilderBase.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBuilderBase.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBuilderBase.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBuilderBase.java Fri Mar  4 07:47:41 2005
@@ -15,6 +15,8 @@
  */
 package org.apache.cocoon.forms.binding;
 
+import java.util.Map;
+
 import org.apache.avalon.framework.logger.LogEnabled;
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.cocoon.forms.util.DomHelper;
@@ -111,7 +113,22 @@
 
             String leniency = DomHelper.getAttribute(bindingElm, "lenient", null);
 
-            return new CommonAttributes(location, direction, leniency);
+            //TODO: current jxpath is not inheriting registered namespaces over to 
+            // child-relative jxpath contexts --> because of that we can't just 
+            // remember the getLocalNSDeclarations but need the full set from 
+            // getInheritedNSDeclarations
+            // IMPORTANT NOTE: if jxpath would change this behaviour we would however
+            // still need to be able to unregister namespace-declarations 
+            // (in a smart way: unhide what is possably available from your parent.   
+            // So both changes to jxpath need to be available before changing the below.
+            Map nsDeclarationMap = DomHelper.getInheritedNSDeclarations(bindingElm);
+            // we (actually jxpath) doesn't support un-prefixed namespace-declarations:
+            // so we decide to break on those above silently ignoring them
+            if (nsDeclarationMap != null && nsDeclarationMap.values().contains(null))
+                throw new BindingException("Error in binding file " + location
+                                + "\nBinding doesn't support having namespace-declarations without explicit prefixes.");
+            
+            return new CommonAttributes(location, direction, leniency, nsDeclarationMap);
         } catch (BindingException e) {
             throw e;
         } catch (Exception e) {
@@ -143,18 +160,23 @@
          * should be operating in lenient mode or not 
          */
         final Boolean leniency;
+        /**
+         * Array of namespace-declarations (prefix-uri pairs) that need to be set on the jxpath 
+         */
+        final Map nsDeclarations;
 
-        final static CommonAttributes DEFAULT = new CommonAttributes("location unknown", true, true, null);
+        final static CommonAttributes DEFAULT = new CommonAttributes("location unknown", true, true, null, null);
 
-        CommonAttributes(String location, String direction, String leniency){
-            this(location, isLoadEnabled(direction), isSaveEnabled(direction), decideLeniency(leniency));
+        CommonAttributes(String location, String direction, String leniency, Map nsDeclarations){
+            this(location, isLoadEnabled(direction), isSaveEnabled(direction), decideLeniency(leniency), nsDeclarations);
         }
 
-        CommonAttributes(String location, boolean loadEnabled, boolean saveEnabled, Boolean leniency){
+        CommonAttributes(String location, boolean loadEnabled, boolean saveEnabled, Boolean leniency, Map nsDeclarations){
             this.location = location;
             this.loadEnabled = loadEnabled;
             this.saveEnabled = saveEnabled;
             this.leniency = leniency;
+            this.nsDeclarations = nsDeclarations;
         }
 
         /**

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JavaScriptJXPathBindingBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JavaScriptJXPathBindingBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JavaScriptJXPathBindingBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/JavaScriptJXPathBindingBuilder.java Fri Mar  4 07:47:41 2005
@@ -90,7 +90,7 @@
                     throw new BindingException("Element \"load-form\" is missing (" +
                         DomHelper.getLocation(element) + ")");
                 }
-                loadScript = JavaScriptHelper.buildFunction(loadElem, JavaScriptJXPathBinding.LOAD_PARAMS);
+                loadScript = JavaScriptHelper.buildFunction(loadElem, "loadForm", JavaScriptJXPathBinding.LOAD_PARAMS);
             }
 
             // Build save script
@@ -101,7 +101,7 @@
                     throw new BindingException("Element \"save-form\" is missing (" +
                         DomHelper.getLocation(element) + ")");
                 }
-                saveScript = JavaScriptHelper.buildFunction(saveElem, JavaScriptJXPathBinding.SAVE_PARAMS);
+                saveScript = JavaScriptHelper.buildFunction(saveElem, "saveForm", JavaScriptJXPathBinding.SAVE_PARAMS);
             }
 
             // Build child bindings

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBinding.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBinding.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBinding.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBinding.java Fri Mar  4 07:47:41 2005
@@ -30,9 +30,7 @@
  *
  * @version $Id$
  */
-public class StructJXPathBinding extends ComposedJXPathBindingBase {
-
-    private final String xpath;
+public class StructJXPathBinding extends ContextJXPathBinding {
 
     private final String widgetId;
 
@@ -43,9 +41,8 @@
      * @param childBindings
      */
     public StructJXPathBinding(JXPathBindingBuilderBase.CommonAttributes commonAtts, String widgetId, String xpath, JXPathBindingBase[] childBindings) {
-        super(commonAtts, childBindings);
+        super(commonAtts, xpath, childBindings);
         this.widgetId = widgetId;
-        this.xpath = xpath;
     }
 
     /**
@@ -55,11 +52,7 @@
      */
     public void doLoad(Widget frmModel, JXPathContext jxpc) throws BindingException {
         Struct structWidget = (Struct)selectWidget(frmModel, this.widgetId);
-        JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath));
-        super.doLoad(structWidget, subContext);
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("done loading " + toString());
-        }
+        super.doLoad(structWidget, jxpc);
     }
 
     /**
@@ -69,14 +62,10 @@
      */
     public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
         Struct structWidget = (Struct)selectWidget(frmModel, this.widgetId);
-        JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath));
-        super.doSave(structWidget, subContext);
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("done saving " + toString());
-        }
+        super.doSave(structWidget, jxpc);
     }
 
     public String toString() {
-        return "StructJXPathBinding [widget=" + this.widgetId + ", xpath=" + this.xpath + "]";
+        return "StructJXPathBinding [widget=" + this.widgetId + ", xpath=" + getXPath() + "]";
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBindingBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBindingBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBindingBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/binding/StructJXPathBindingBuilder.java Fri Mar  4 07:47:41 2005
@@ -16,6 +16,7 @@
 package org.apache.cocoon.forms.binding;
 
 import org.apache.cocoon.forms.util.DomHelper;
+import org.apache.cocoon.util.log.DeprecationLogger;
 import org.w3c.dom.Element;
 
 /**
@@ -37,6 +38,7 @@
 
     public JXPathBindingBase buildBinding(Element bindingElm, JXPathBindingManager.Assistant assistant)
             throws BindingException {
+        DeprecationLogger.log("'fb:struct' is deprecated and replaced by 'fb:group' at " + DomHelper.getLocation(bindingElm));
         try {
             String widgetId = DomHelper.getAttribute(bindingElm, "id");
             CommonAttributes commonAtts = JXPathBindingBuilderBase.getCommonAttributes(bindingElm);

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/CreateEvent.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/CreateEvent.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/CreateEvent.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/CreateEvent.java Fri Mar  4 07:47:41 2005
@@ -18,7 +18,6 @@
 import org.apache.cocoon.forms.formmodel.Widget;
 
 /**
- * <b>Early prototype of a create event. Don't use it now as the plumbing is not yet ready! (SW)</b>
  * An event raised when a widget is created, once it has been fully set up. For
  * container widgets, this occurs after child widgets, if any, have been created.
  * 

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/impl/JavaScriptWidgetListener.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/impl/JavaScriptWidgetListener.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/impl/JavaScriptWidgetListener.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/event/impl/JavaScriptWidgetListener.java Fri Mar  4 07:47:41 2005
@@ -56,10 +56,12 @@
             
             HashMap values = new HashMap(2);
             values.put("event", event);
+            //FIXME(SW) it would be nice to have "this" be the widget, but I don't know how to define
+            //the "this" object for a script (this is easy for a function)
             
             Map objectModel = ContextHelper.getObjectModel(context);
 
-            // Add the biz data that was passed to showForm()
+            // Add the view data that was passed to showForm()
             Object viewData = FlowHelper.getContextObject(objectModel);
             if (viewData != null) {
                 values.put("viewData", viewData);

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/Form.js
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/Form.js?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/Form.js (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/Form.js Fri Mar  4 07:47:41 2005
@@ -27,28 +27,31 @@
 /**
  * Create a form, given the URI of its definition file
  */
-function Form(uri) {
+function Form(formDefinition) {
     var formMgr = null;
     var resolver = null;
     var src = null;
     var xmlAdapter = null;
     try {
         formMgr = cocoon.getComponent(Packages.org.apache.cocoon.forms.FormManager.ROLE);
-        resolver = cocoon.getComponent(Packages.org.apache.cocoon.environment.SourceResolver.ROLE);
-        src = resolver.resolveURI(uri);
-        this.form = formMgr.createForm(src);
-        this.binding = null;
-        this.eventHandler = null;
-        // FIXME : hack needed because FOM doesn't provide access to the context
-        this.avalonContext = formMgr.getAvalonContext();
-        // TODO : do we keep this ?
-        this.formWidget = new Widget(this.form);
-
+        if ((typeof formDefinition) == "string" || formDefinition instanceof String) {
+            resolver = cocoon.getComponent(Packages.org.apache.cocoon.environment.SourceResolver.ROLE);
+            src = resolver.resolveURI(formDefinition);
+            this.form = formMgr.createForm(src);
+        } else {
+            this.form = formMgr.createForm(formDefinition)
+        }
     } finally {
         cocoon.releaseComponent(formMgr);
         if (src != null) resolver.release(src);
         cocoon.releaseComponent(resolver);
     }
+    this.binding = null;
+    this.eventHandler = null;
+    // FIXME : hack needed because FOM doesn't provide access to the context
+    this.avalonContext = formMgr.getAvalonContext();
+    // TODO : do we keep this ?
+    this.formWidget = new Widget(this.form);
 }
 
 Form.prototype.getModel = function() {
@@ -95,7 +98,7 @@
  * @parameter bizdata some business data for the view (like in cocoon.sendPageAndWait()).
  *            The "{FormsPipelineConfig.CFORMSKEY}" and "locale" properties are added to this object.
  */
-Form.prototype.showForm = function(uri, bizData) {
+Form.prototype.showForm = function(uri, bizData, fun, ttl) {
 
     if (bizData == undefined) bizData = new Object();
     bizData[Packages.org.apache.cocoon.forms.transformation.FormsPipelineConfig.CFORMSKEY] = this.form;
@@ -110,42 +113,27 @@
     var finished = false;
     this.isValid = false;
 
-    // FIXME: Remove check for removed syntax later.
-    if (this.validator != undefined) {
-        throw "Forms do not support custom javascript validators anymore. Declare your validators in the form model file.";
-    }
-
-    // Fire any events pending from binding, etc.
-    this.form.fireEvents();
-
-    do {
-        var k = cocoon.sendPageAndWait(uri, bizData);
-        if (result == null) result = k;
-
+    var comingBack = false;
+    var bookmark = cocoon.createWebContinuation(ttl);
+    
+    if (comingBack) {
+        // We come back to the bookmark: process the form
         var formContext = new Packages.org.apache.cocoon.forms.FormContext(cocoon.request, this.locale);
-
-        // Prematurely add the bizData as in the object model so that event listeners can use it
-        // (the same is done by cocoon.sendPage())
-        // FIXME : hack needed because FOM doesn't provide access to the object model
-        var objectModel = org.apache.cocoon.components.ContextHelper.getObjectModel(this.avalonContext);
-        org.apache.cocoon.components.flow.FlowHelper.setContextObject(objectModel, bizData);
-
         finished = this.form.process(formContext);
         if (finished) {
             this.isValid = this.form.isValid();
+            var widget = this.form.getSubmitWidget();
+            // Can be null on "normal" submit
+            this.submitId = widget == null ? null : widget.getId();
+            return bookmark;
         }
-
-        // FIXME: Theoretically, we should clone the form widget (this.form) to ensure it keeps its
-        // value with the continuation. We don't do it since there should me not much pratical consequences
-        // except a sudden change of repeaters whose size changed from a continuation to another.
-
-    } while(!finished);
-
-    var widget = this.form.getSubmitWidget();
-    // Can be null on "normal" submit
-    this.submitId = widget == null ? null : widget.getId();
-
-    return result;
+    }
+    comingBack = true;
+    cocoon.sendPage(uri, bizData, bookmark);
+    if (fun && fun instanceof Function) {
+        fun();
+    }
+    FOM_Cocoon.suicide();
 }
 
 Form.prototype.createBinding = function(bindingURI) {

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/Form.js
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/Form.js?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/Form.js (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/Form.js Fri Mar  4 07:47:41 2005
@@ -113,10 +113,6 @@
     var FormContext = Packages.org.apache.cocoon.forms.FormContext;
     // this is needed by the FormTemplateTransformer:
     var javaWidget = this.formWidget_.unwrap();
-
-    // Fire any events pending from binding, etc.
-    javaWidget.fireEvents();
-
     this.formWidget_["CocoonFormsInstance"] = javaWidget;
     cocoon.request.setAttribute(Packages.org.apache.cocoon.forms.transformation.CFORMSKEY, javaWidget);
     var wk = cocoon.sendPageAndWait(uri, this.formWidget_, fun, ttl); 

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/ScriptableWidget.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/ScriptableWidget.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/ScriptableWidget.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v2/ScriptableWidget.java Fri Mar  4 07:47:41 2005
@@ -492,7 +492,7 @@
         return delegate.getRequestParameterName();
     }
 
-    public Scriptable jsFunction_getParent() {
+    public Object jsFunction_getParent() {
         if (delegate != null) {
             return wrap(delegate.getParent());
         }
@@ -681,12 +681,6 @@
                 }
             }
         }
-    }
-
-    public void jsFunction_removeSelectionList() {
-    	if (delegate instanceof SelectableWidget) {
-    		((SelectableWidget)delegate).removeSelectionList();
-    	}
     }
 
     static final Object[] WIDGET_CLASS_MAP = {

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/Form.js
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/Form.js?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/Form.js (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/Form.js Fri Mar  4 07:47:41 2005
@@ -83,9 +83,6 @@
         viewData = new Object();
     viewData["CocoonFormsInstance"] = this.form;
 
-    // Fire any events pending from binding, etc.
-    this.form.fireEvents();
-
     var webCont;
     var finished = false;
     while (!finished) {

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/ScriptableWidget.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/ScriptableWidget.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/ScriptableWidget.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/flow/javascript/v3/ScriptableWidget.java Fri Mar  4 07:47:41 2005
@@ -15,9 +15,21 @@
  */
 
 package org.apache.cocoon.forms.flow.javascript.v3;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.cocoon.forms.datatype.Datatype;
 import org.apache.cocoon.forms.datatype.SelectionList;
-import org.apache.cocoon.forms.event.*;
+import org.apache.cocoon.forms.event.ActionEvent;
+import org.apache.cocoon.forms.event.ActionListener;
+import org.apache.cocoon.forms.event.ActionListenerEnabled;
+import org.apache.cocoon.forms.event.ValueChangedEvent;
+import org.apache.cocoon.forms.event.ValueChangedListener;
+import org.apache.cocoon.forms.event.ValueChangedListenerEnabled;
 import org.apache.cocoon.forms.formmodel.Action;
 import org.apache.cocoon.forms.formmodel.AggregateField;
 import org.apache.cocoon.forms.formmodel.BooleanField;
@@ -37,19 +49,13 @@
 import org.apache.cocoon.forms.validation.ValidationErrorAware;
 import org.apache.cocoon.forms.validation.WidgetValidator;
 import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
 import org.mozilla.javascript.JavaScriptException;
 import org.mozilla.javascript.NativeArray;
-import org.mozilla.javascript.Function;
 import org.mozilla.javascript.Scriptable;
 import org.mozilla.javascript.ScriptableObject;
 import org.mozilla.javascript.Undefined;
 import org.mozilla.javascript.Wrapper;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.LinkedList;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.HashMap;
 
 /**
  * @version $Id$
@@ -384,7 +390,7 @@
             delegate.setValue(value);
         } else if (delegate instanceof BooleanField) {
             BooleanField field = (BooleanField)delegate;
-            field.setValue(new Boolean(Context.toBoolean(value)));
+            field.setValue(Boolean.valueOf(Context.toBoolean(value)));
         } else if (delegate instanceof Repeater) {
             Repeater repeater = (Repeater)delegate;
             if (value instanceof NativeArray) {
@@ -486,7 +492,7 @@
 //        return delegate.getNamespace();
 //    }
 
-    public Scriptable jsFunction_getParent() {
+    public Object jsFunction_getParent() {
         if (delegate != null) {
             return wrap(delegate.getParent());
         }
@@ -746,12 +752,6 @@
                 }
             }
         }
-    }
-
-    public void jsFunction_removeSelectionList() {
-    	if (delegate instanceof SelectableWidget) {
-    		((SelectableWidget)delegate).removeSelectionList();
-    	}
     }
 
     static final Object[] WIDGET_CLASS_MAP = {

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerDefinition.java Fri Mar  4 07:47:41 2005
@@ -40,6 +40,8 @@
     }
 
     public void addWidgetDefinition(WidgetDefinition definition) throws Exception, DuplicateIdException {
+        //FIXME: cannot enforce this check here as more children are added in the resolve() phase
+        //checkMutable();
         if (definition != null) {
             definition.setParent(this);
             if (definition instanceof DefineMacroDefinition) {

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerWidget.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerWidget.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerWidget.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractContainerWidget.java Fri Mar  4 07:47:41 2005
@@ -52,6 +52,8 @@
         while(it.hasNext()) {
           ((Widget)it.next()).initialize();
         }
+        
+        super.initialize();
     }
 
     public void addChild(Widget widget) {

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinition.java Fri Mar  4 07:47:41 2005
@@ -33,23 +33,32 @@
  */
 public abstract class AbstractDatatypeWidgetDefinition extends AbstractWidgetDefinition implements Serviceable {
     private Datatype datatype;
+    private Object initialValue;
     private SelectionList selectionList;
     private ValueChangedListener listener;
     private ServiceManager manager;
 
     public void service(ServiceManager manager) throws ServiceException {
+        checkMutable();
         this.manager = manager;
     }
 
     public Datatype getDatatype() {
         return datatype;
     }
+    
+    public Object getInitialValue() {
+        return this.initialValue;
+    }
 
-    public void setDatatype(Datatype datatype) {
+    public void setDatatype(Datatype datatype, Object initialValue) {
+        checkMutable();
         this.datatype = datatype;
+        this.initialValue = initialValue;
     }
 
     public void setSelectionList(SelectionList selectionList) {
+        checkMutable();
         if (selectionList != null && selectionList.getDatatype() != getDatatype())
             throw new RuntimeException("Tried to assign a SelectionList that is not associated with this widget's datatype.");
         this.selectionList = selectionList;
@@ -86,6 +95,7 @@
     }
     
     public void addValueChangedListener(ValueChangedListener listener) {
+        checkMutable();
         this.listener = WidgetEventMulticaster.add(this.listener, listener);
     }
     

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinitionBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinitionBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractDatatypeWidgetDefinitionBuilder.java Fri Mar  4 07:47:41 2005
@@ -15,11 +15,18 @@
  */
 package org.apache.cocoon.forms.formmodel;
 
+import java.util.Iterator;
+import java.util.Locale;
+
 import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.cocoon.forms.Constants;
+import org.apache.cocoon.forms.datatype.Datatype;
 import org.apache.cocoon.forms.datatype.SelectionList;
 import org.apache.cocoon.forms.datatype.SelectionListBuilder;
+import org.apache.cocoon.forms.datatype.convertor.ConversionResult;
+import org.apache.cocoon.forms.event.ValueChangedListener;
 import org.apache.cocoon.forms.util.DomHelper;
+import org.apache.cocoon.i18n.I18nUtils;
 import org.w3c.dom.Element;
 
 /**
@@ -29,13 +36,47 @@
  */
 public abstract class AbstractDatatypeWidgetDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
     
-    /**
-     * @return true if a selectionlist has actually been build.
-     */
-    protected boolean buildSelectionList(Element widgetElement, AbstractDatatypeWidgetDefinition widget) throws Exception {
+    protected void setupDefinition(Element widgetElement, AbstractDatatypeWidgetDefinition definition) throws Exception {
+        super.setupDefinition(widgetElement, definition);
+        // parse "label", "hint", etc.
+        setDisplayData(widgetElement, definition);
+
+        // parse "on-value-changed"
+        Iterator iter = buildEventListeners(widgetElement, "on-value-changed", ValueChangedListener.class).iterator();
+        while (iter.hasNext()) {
+            definition.addValueChangedListener((ValueChangedListener)iter.next());
+        }
+        
+        //---- parse "datatype"
+        Element datatypeElement = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "datatype");
+        if (datatypeElement == null) {
+            throw new Exception("A nested datatype element is required for the widget " 
+                                + widgetElement.getTagName() + " at " + DomHelper.getLocation(widgetElement));
+        }
+
+        Datatype datatype = datatypeManager.createDatatype(datatypeElement, false);
+        
+        //---- parse "initial-value"
+        Object initialValue = null;
+        Element initialValueElement = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "initial-value", false);
+        if (initialValueElement != null) {
+            String localeValue = DomHelper.getAttribute(initialValueElement, "locale", null);
+            Locale locale = localeValue == null ? null : I18nUtils.parseLocale(localeValue);
+            String value = DomHelper.getElementText(initialValueElement);
+            ConversionResult result = datatype.convertFromString(value, locale);
+            if (!result.isSuccessful()) {
+                throw new Exception("Cannot parse initial value '" + value + "' at " +
+                        DomHelper.getLocation(initialValueElement));
+            }
+            initialValue = result.getResult();
+        }
+        
+        definition.setDatatype(datatype, initialValue);
+        
+        //---- parse "selection-list"
         // FIXME: pass the manager to the definition as a side effect. Should be removed
         // when definition are managed like components.
-        widget.service(this.serviceManager);
+        definition.service(this.serviceManager);
 
         Element selectionListElement = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "selection-list");
         if (selectionListElement != null) {
@@ -50,18 +91,14 @@
                 }
 
                 builder = (SelectionListBuilder)builderSelector.select(listType);
-                SelectionList list = builder.build(selectionListElement, widget.getDatatype());
-                widget.setSelectionList(list);
+                SelectionList list = builder.build(selectionListElement, definition.getDatatype());
+                definition.setSelectionList(list);
             } finally {
                 if (builder != null) {
                     builderSelector.release(builder);
                 }
                 this.serviceManager.release(builderSelector);
             }
-
-            return true;
-        } else {
-            return false;
         }
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java Fri Mar  4 07:47:41 2005
@@ -23,6 +23,7 @@
 import java.util.Map;
 
 import org.apache.cocoon.forms.Constants;
+import org.apache.cocoon.forms.event.CreateEvent;
 import org.apache.cocoon.forms.event.WidgetEvent;
 import org.apache.cocoon.forms.validation.WidgetValidator;
 import org.apache.cocoon.xml.AttributesImpl;
@@ -45,16 +46,6 @@
     private Widget parent;
 
     /**
-     * Process request parameters for this widget?
-     */
-    private boolean processMyRequests = true;
-
-    /**
-     * Process request parameters for children of this widget?
-     */
-    private boolean processChildRequests = true;
-
-    /**
      * The widget's own state
      */
     private WidgetState state = WidgetState.ACTIVE;
@@ -84,7 +75,7 @@
      * looking up case widgets for union widgets.
      */
     public void initialize() {
-        // Do nothing.
+        ((AbstractWidgetDefinition)getDefinition()).widgetCreated(this);
     }
 
     /**
@@ -106,7 +97,7 @@
      * @return the widgetDefinition from which this widget was instantiated. 
      *        (@link WidgetDefinition#createInstance()}
      */
-    protected abstract WidgetDefinition getDefinition();
+    public abstract WidgetDefinition getDefinition();
 
     /**
      * @return the location-information (file, line and column) where this widget was 
@@ -236,36 +227,11 @@
     }
 
     public Object getValue() {
-        return null;
+        throw new UnsupportedOperationException("Widget " + toString() + " has no value, at " + getLocation());
     }
 
     public void setValue(Object object) {
-        throw new RuntimeException("Cannot set the value of widget " + getRequestParameterName());
-    }
-
-    /**
-     * Controls whether {@link #readFromRequest(FormContext formContext)}
-     * processes the request parameter(s) for this widget and its children.
-     */
-    public void setProcessRequests(boolean processRequests) {
-      this.processMyRequests = processRequests;
-      this.processChildRequests = processRequests;
-    }
-
-    /**
-     * Controls whether {@link #readFromRequest(FormContext formContext)}
-     * processes the request parameter(s) for this widget.
-     */
-    public void setProcessMyRequests(boolean processMyRequests) {
-      this.processMyRequests = processMyRequests;
-    }
-
-    /**
-     * Controls whether {@link #readFromRequest(FormContext formContext)}
-     * processes the request parameter(s) for children of this widget.
-     */
-    public void setProcessChildRequests(boolean processChildRequests) {
-      this.processChildRequests = processChildRequests;
+        throw new UnsupportedOperationException("Widget " + toString() + " has no value, at " + getLocation());
     }
 
     public boolean isRequired() {
@@ -279,7 +245,11 @@
      * Concrete subclass widgets need to override when supporting event broadcasting.
      */
     public void broadcastEvent(WidgetEvent event) {
-        throw new UnsupportedOperationException("Widget " + this.getRequestParameterName() + " doesn't handle events.");
+        if (event instanceof CreateEvent) {
+            ((AbstractWidgetDefinition)getDefinition()).fireCreateEvent((CreateEvent)event);
+        } else {
+            throw new UnsupportedOperationException("Widget " + this.getRequestParameterName() + " doesn't handle events.");
+        }
     }
 
     /**
@@ -494,6 +464,6 @@
         if (last != -1) {
             className = className.substring(last+1);
         }
-        return className + "@" + getRequestParameterName();
+        return className + "-" + getRequestParameterName();
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinition.java Fri Mar  4 07:47:41 2005
@@ -43,6 +43,8 @@
     //TODO consider final on these
     private String location = null;
     private String id;
+    /** the definition is mutable when being built */
+    private boolean mutable = true;
     /** The initial map of attributes (can be null) */
     private Map attributes;
     private Map displayData;
@@ -78,11 +80,29 @@
         }
         return this.formDefinition;
     }
+    
+    /**
+     * Locks this definition so that it becomes immutable.
+     */
+    public void makeImmutable() {
+        this.mutable = false;
+    }
+    
+    /**
+     * Check that this definition is mutable, i.e. is in setup phase. If not, throw an exception.
+     */
+    protected void checkMutable() {
+        if (!this.mutable) {
+            throw new IllegalStateException("Attempt to modify an immutable WidgetDefinition");
+        }
+    }
 
     /**
      * Sets the parent of this definition
      */
     public void setParent(WidgetDefinition definition) {
+        //FIXME(SW) calling checkMutable() here is not possible as NewDefinition.resolve() does some weird
+        //reorganization of the definition tree
         this.parent = definition;
     }
 
@@ -99,10 +119,12 @@
     }
 
     public void setState(WidgetState state) {
+        checkMutable();
         this.state = state;
     }
 
     protected void setLocation(String location) {
+        checkMutable();
         this.location = location;
     }
 
@@ -115,10 +137,12 @@
     }
 
     protected void setId(String id) {
+        checkMutable();
         this.id = id;
     }
 
     protected void setAttributes(Map attributes) {
+        checkMutable();
         this.attributes = attributes;   
     }
     
@@ -131,10 +155,21 @@
     }
 
     protected void addCreateListener(CreateListener listener) {
+        checkMutable();
         this.createListener = WidgetEventMulticaster.add(this.createListener, listener);
     }
+    
+    public void widgetCreated(Widget widget) {
+        if (this.createListener != null) {
+            widget.getForm().addWidgetEvent(new CreateEvent(widget));
+        }
+    }
 
     public void fireCreateEvent(CreateEvent event) {
+        // Check that this widget was created by the current definition
+        if (event.getSourceWidget().getDefinition() != this) {
+            throw new IllegalArgumentException("Widget was not created by this definition");
+        }
         if (this.createListener != null) {
             this.createListener.widgetCreated(event);
         }
@@ -152,10 +187,12 @@
      * @param displayData an association of {name, sax fragment}
      */
     public void setDisplayData(Map displayData) {
+        checkMutable();
         this.displayData = displayData;
     }
 
     public void addValidator(WidgetValidator validator) {
+        checkMutable();
         if (this.validators == null) {
             this.validators = new ArrayList();
         }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AbstractWidgetDefinitionBuilder.java Fri Mar  4 07:47:41 2005
@@ -63,8 +63,14 @@
         this.widgetValidatorBuilderSelector = (ServiceSelector) serviceManager.lookup(WidgetValidatorBuilder.ROLE + "Selector");
         this.widgetListenerBuilderSelector = (ServiceSelector) serviceManager.lookup(WidgetListenerBuilder.ROLE + "Selector");
     }
+    
+    protected void setupDefinition(Element widgetElement, AbstractWidgetDefinition definition) throws Exception {
+        setCommonProperties(widgetElement, definition);
+        setValidators(widgetElement, definition);
+        setCreateListeners(widgetElement, definition);
+    }
 
-    protected void setCommonProperties(Element widgetElement, AbstractWidgetDefinition widgetDefinition) throws Exception {
+    private void setCommonProperties(Element widgetElement, AbstractWidgetDefinition widgetDefinition) throws Exception {
         // location
         widgetDefinition.setLocation(DomHelper.getLocation(widgetElement));
 
@@ -164,7 +170,7 @@
         widgetDefinition.setDisplayData(displayData);
     }
 
-    protected void setValidators(Element widgetElement, AbstractWidgetDefinition widgetDefinition) throws Exception {
+    private void setValidators(Element widgetElement, AbstractWidgetDefinition widgetDefinition) throws Exception {
         Element validatorElement = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "validation");
         if (validatorElement != null) {
             NodeList list = validatorElement.getChildNodes();
@@ -187,7 +193,7 @@
         }
     }
 
-    protected void setCreateListeners(Element widgetElement, AbstractWidgetDefinition widgetDefinition) throws Exception {
+    private void setCreateListeners(Element widgetElement, AbstractWidgetDefinition widgetDefinition) throws Exception {
         Iterator iter = buildEventListeners(widgetElement, "on-create", CreateListener.class).iterator();
         while (iter.hasNext()) {
             widgetDefinition.addCreateListener((CreateListener)iter.next());

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Action.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Action.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Action.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Action.java Fri Mar  4 07:47:41 2005
@@ -40,7 +40,7 @@
         this.definition = definition;
     }
 
-    protected WidgetDefinition getDefinition() {
+    public WidgetDefinition getDefinition() {
         return this.definition;
     }
 
@@ -125,8 +125,13 @@
     }
 
     public void broadcastEvent(WidgetEvent event) {
-        this.definition.fireActionEvent((ActionEvent)event);
-        fireActionEvent((ActionEvent)event);
+        if (event instanceof ActionEvent) {
+            this.definition.fireActionEvent((ActionEvent)event);
+            fireActionEvent((ActionEvent)event);
+        } else {
+            // Other kinds of events
+            super.broadcastEvent(event);
+        }
     }
 
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java Fri Mar  4 07:47:41 2005
@@ -41,6 +41,7 @@
     }
 
     public void addActionListener(ActionListener listener) {
+        checkMutable();
         this.listener = WidgetEventMulticaster.add(this.listener, listener);
     }
     

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinitionBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinitionBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinitionBuilder.java Fri Mar  4 07:47:41 2005
@@ -19,6 +19,7 @@
 
 import org.apache.cocoon.forms.event.ActionListener;
 import org.apache.cocoon.forms.util.DomHelper;
+import org.apache.cocoon.util.log.DeprecationLogger;
 import org.w3c.dom.Element;
 
 /**
@@ -27,23 +28,36 @@
  * @version $Id$
  */
 public class ActionDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
+
     public WidgetDefinition buildWidgetDefinition(Element widgetElement) throws Exception {
-        ActionDefinition actionDefinition = createDefinition();
-        setCommonProperties(widgetElement, actionDefinition);
-        setDisplayData(widgetElement, actionDefinition);
+        ActionDefinition definition = new ActionDefinition();
+        setupDefinition(widgetElement, definition);
+        definition.makeImmutable();
+        return definition;
+    }
+    
+    protected void setupDefinition(Element widgetElement, ActionDefinition definition) throws Exception {
+        super.setupDefinition(widgetElement, definition);
+
+        setDisplayData(widgetElement, definition);
 
-        String actionCommand = DomHelper.getAttribute(widgetElement, "action-command");
-        actionDefinition.setActionCommand(actionCommand);
+        // Get the "command" optional attribute
+        String actionCommand = DomHelper.getAttribute(widgetElement, "command", null);
+        
+        // If unspecified, check the deprecated "action-command" deprecated attribute
+        if (actionCommand == null) {
+            actionCommand = DomHelper.getAttribute(widgetElement, "action-command", null);
+            if (actionCommand != null) {
+                DeprecationLogger.log("The 'action-command' attribute is deprecated and replaced by 'command', at " +
+                    DomHelper.getLocation(widgetElement));
+            }
+        }
+        
+        definition.setActionCommand(actionCommand);
 
         Iterator iter = buildEventListeners(widgetElement, "on-action", ActionListener.class).iterator();
         while (iter.hasNext()) {
-            actionDefinition.addActionListener((ActionListener)iter.next());
+            definition.addActionListener((ActionListener)iter.next());
         }
-
-        return actionDefinition;
-    }
-    
-    protected ActionDefinition createDefinition() {
-        return new ActionDefinition();
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinition.java Fri Mar  4 07:47:41 2005
@@ -66,6 +66,7 @@
 
 
     public void addWidgetDefinition(WidgetDefinition widgetDefinition) throws DuplicateIdException {
+        checkMutable();
         container.addWidgetDefinition(widgetDefinition);
     }
 
@@ -74,6 +75,7 @@
     }
 
     protected void setCombineExpression(Expression expression) {
+        checkMutable();
         combineExpr = expression;
     }
 
@@ -82,6 +84,7 @@
     }
 
     protected void setSplitPattern(Pattern pattern, String regexp) {
+        checkMutable();
         this.splitPattern = pattern;
         this.splitRegexp = regexp;
     }
@@ -99,10 +102,12 @@
     }
 
     protected void setSplitFailMessage(XMLizable splitFailMessage) {
+        checkMutable();
         this.splitFailMessage = splitFailMessage;
     }
 
     protected void addSplitMapping(int group, String fieldId) {
+        checkMutable();
         splitMappings.add(new SplitMapping(group, fieldId));
     }
 
@@ -112,6 +117,8 @@
 
     public Widget createInstance() {
         AggregateField aggregateField = new AggregateField(this);
+        // Set the initial selection list, if any
+        aggregateField.setSelectionList(getSelectionList());
 
         Iterator fieldDefinitionIt = container.getWidgetDefinitions().iterator();
         while (fieldDefinitionIt.hasNext()) {

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinitionBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinitionBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/AggregateFieldDefinitionBuilder.java Fri Mar  4 07:47:41 2005
@@ -34,15 +34,23 @@
 public class AggregateFieldDefinitionBuilder extends FieldDefinitionBuilder {
 
     public WidgetDefinition buildWidgetDefinition(Element widgetElement) throws Exception {
-        AggregateFieldDefinition aggregateDefinition = new AggregateFieldDefinition();
-        buildWidgetDefinition(aggregateDefinition, widgetElement);
+        AggregateFieldDefinition definition = new AggregateFieldDefinition();
+        setupDefinition(widgetElement, definition);
+        definition.makeImmutable();
+        return definition;
+    }
+    
+    protected void setupDefinition(Element widgetElement, AggregateFieldDefinition definition) throws Exception {
+        
+        // parse the field definition
+        super.setupDefinition(widgetElement, definition);
 
         // make children fields
         Element widgetsElement = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "widgets", true);
         Element[] fieldElements = DomHelper.getChildElements(widgetsElement, Constants.DEFINITION_NS, "field");
         for (int i = 0; i < fieldElements.length; i++) {
             FieldDefinition fieldDefinition = (FieldDefinition)buildAnotherWidgetDefinition(fieldElements[i]);
-            aggregateDefinition.addWidgetDefinition(fieldDefinition);
+            definition.addWidgetDefinition(fieldDefinition);
         }
 
         // compile splitpattern
@@ -55,7 +63,7 @@
         } catch (MalformedPatternException e) {
             throw new Exception("Invalid regular expression at " + DomHelper.getLocation(splitElement) + ": " + e.getMessage());
         }
-        aggregateDefinition.setSplitPattern(pattern, patternString);
+        definition.setSplitPattern(pattern, patternString);
 
         // read split mappings
         Element[] mapElements = DomHelper.getChildElements(splitElement, Constants.DEFINITION_NS, "map");
@@ -64,7 +72,7 @@
             int group = DomHelper.getAttributeAsInteger(mapElements[i], "group");
             String field = DomHelper.getAttribute(mapElements[i], "field");
             // check that this field exists
-            if (!aggregateDefinition.hasWidget(field)) {
+            if (!definition.hasWidget(field)) {
                 throw new Exception("Unkwon widget id \"" + field + "\", at " +
                                     DomHelper.getLocation(mapElements[i]));
             }
@@ -73,14 +81,14 @@
                                     DomHelper.getLocation(mapElements[i]));
             }
             encounteredFieldMappings.add(field);
-            aggregateDefinition.addSplitMapping(group, field);
+            definition.addSplitMapping(group, field);
         }
 
         // read split fail message (if any)
         Element failMessageElement = DomHelper.getChildElement(splitElement, Constants.DEFINITION_NS, "failmessage");
         if (failMessageElement != null) {
             XMLizable failMessage = DomHelper.compileElementContent(failMessageElement);
-            aggregateDefinition.setSplitFailMessage(failMessage);
+            definition.setSplitFailMessage(failMessage);
         }
 
         // compile combine expression
@@ -93,13 +101,11 @@
             throw new Exception("Problem with combine expression defined at " +
                                 DomHelper.getLocation(combineElement) + ": " + e.getMessage());
         }
-        Class clazz = aggregateDefinition.getDatatype().getTypeClass();
+        Class clazz = definition.getDatatype().getTypeClass();
         if (combineExpr.getResultType() != null && !clazz.isAssignableFrom(combineExpr.getResultType())) {
             throw new Exception("The result of the combine expression should be " + clazz.getName() + ", at " +
                                 DomHelper.getLocation(combineElement));
         }
-        aggregateDefinition.setCombineExpression(combineExpr);
-
-        return aggregateDefinition;
+        definition.setCombineExpression(combineExpr);
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java Fri Mar  4 07:47:41 2005
@@ -58,9 +58,17 @@
         this.definition = definition;
     }
 
-    protected WidgetDefinition getDefinition() {
+    public WidgetDefinition getDefinition() {
         return this.definition;
     }
+    
+    public void initialize() {
+        Boolean value = this.definition.getInitialValue();
+        if (value != null) {
+            setValue(value);
+        }
+        super.initialize();
+    }
 
     public void readFromRequest(FormContext formContext) {
         if (!getCombinedState().isAcceptingInputs()) {
@@ -69,28 +77,13 @@
         validationError = null;
         Object oldValue = value;
         String param = formContext.getRequest().getParameter(getRequestParameterName());
-        if (param != null && param.equalsIgnoreCase("true"))
-            value = Boolean.TRUE;
-        else
-            value = Boolean.FALSE;
-
-        if (value != oldValue) {
+        value = Boolean.valueOf(param);
+        if (!value.equals(oldValue)) {
             getForm().addWidgetEvent(new ValueChangedEvent(this, oldValue, value));
         }
     }
 
     /**
-     * Always return <code>true</code> (an action has no validation)
-     * 
-     * TODO is there a use case for boolean fields having validators?
-     */
-    public boolean validate() {
-        // a boolean field is always valid
-        //return true;
-        return super.validate();
-    }
-
-    /**
      * Returns the validation error, if any. There will always be a validation error in case the
      * {@link #validate()} method returned false.
      */
@@ -148,7 +141,7 @@
 
         Object oldValue = value;
         value = (Boolean)object;
-        if (value != oldValue) {
+        if (!value.equals(oldValue)) {
             getForm().addWidgetEvent(new ValueChangedEvent(this, oldValue, value));
         }
     }
@@ -173,7 +166,12 @@
     }
 
     public void broadcastEvent(WidgetEvent event) {
-        this.definition.fireValueChangedEvent((ValueChangedEvent)event);
-        fireValueChangedEvent((ValueChangedEvent)event);
+        if (event instanceof ValueChangedEvent) {
+            this.definition.fireValueChangedEvent((ValueChangedEvent)event);
+            fireValueChangedEvent((ValueChangedEvent)event);
+        } else {
+            // Other kinds of events
+            super.broadcastEvent(event);
+        }
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinition.java Fri Mar  4 07:47:41 2005
@@ -26,12 +26,24 @@
  */
 public class BooleanFieldDefinition extends AbstractWidgetDefinition {
     private ValueChangedListener listener;
+    
+    private Boolean initialValue;
 
     public Widget createInstance() {
         return new BooleanField(this);
     }
     
+    public void setInitialValue(Boolean value) {
+        checkMutable();
+        this.initialValue = value;
+    }
+    
+    public Boolean getInitialValue() {
+        return this.initialValue;
+    }
+    
     public void addValueChangedListener(ValueChangedListener listener) {
+        checkMutable();
         this.listener = WidgetEventMulticaster.add(this.listener, listener);
     }
     
@@ -46,6 +58,7 @@
     }
         
     public void setRequired(boolean required) {
+        checkMutable();
         throw new UnsupportedOperationException("The property 'required' is not available on widgets of type booleanfield.");
     }    
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/BooleanFieldDefinitionBuilder.java Fri Mar  4 07:47:41 2005
@@ -17,7 +17,9 @@
 
 import java.util.Iterator;
 
+import org.apache.cocoon.forms.Constants;
 import org.apache.cocoon.forms.event.ValueChangedListener;
+import org.apache.cocoon.forms.util.DomHelper;
 import org.w3c.dom.Element;
 
 /**
@@ -25,18 +27,24 @@
  * 
  * @version $Id$
  */
-public class BooleanFieldDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
+public final class BooleanFieldDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
     public WidgetDefinition buildWidgetDefinition(Element widgetElement) throws Exception {
         BooleanFieldDefinition definition = new BooleanFieldDefinition();
-        setCommonProperties(widgetElement, definition);
+        
+        super.setupDefinition(widgetElement, definition);
         setDisplayData(widgetElement, definition);
-        setValidators(widgetElement, definition);
         Iterator iter = buildEventListeners(widgetElement, "on-value-changed", ValueChangedListener.class).iterator();
         while (iter.hasNext()) {
             definition.addValueChangedListener((ValueChangedListener)iter.next());
         }
 
-        // TODO default value
+        // Initial value
+        Element initialValueElement = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "initial-value", false);
+        if (initialValueElement != null) {
+            Boolean initialValue = Boolean.valueOf(DomHelper.getElementText(initialValueElement));
+        }        
+
+        definition.makeImmutable();
         return definition;
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ClassDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ClassDefinitionBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ClassDefinitionBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/ClassDefinitionBuilder.java Fri Mar  4 07:47:41 2005
@@ -24,13 +24,13 @@
  *
  * @version $Id$
  */
-public class ClassDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
+public final class ClassDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
 
     public WidgetDefinition buildWidgetDefinition(Element element) throws Exception {
         ClassDefinition definition = new ClassDefinition();
-        setCommonProperties(element, definition);
+        
+        super.setupDefinition(element, definition);
         setDisplayData(element, definition);
-        setValidators(element, definition);
 
         Element widgetsElement = DomHelper.getChildElement(element, Constants.DEFINITION_NS, "widgets", true);
         // All child elements of the widgets element are widgets
@@ -41,6 +41,7 @@
             definition.addWidgetDefinition(widgetDefinition);
         }
 
+        definition.makeImmutable();
         return definition;
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Field.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Field.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Field.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Field.java Fri Mar  4 07:47:41 2005
@@ -125,9 +125,17 @@
         return this.fieldDefinition;
     }
 
-    protected WidgetDefinition getDefinition() {
+    public WidgetDefinition getDefinition() {
         return this.fieldDefinition;
     }
+    
+    public void initialize() {
+        Object value = this.fieldDefinition.getInitialValue();
+        if (value != null) {
+            setValue(value);
+        }
+        super.initialize();
+    }
 
     public Object getValue() {
         // if getValue() is called on this field while we're validating, then it's because a validation
@@ -197,8 +205,11 @@
             return;
 
         String newEnteredValue = formContext.getRequest().getParameter(getRequestParameterName());
-        // FIXME: Should we consider only non-null values, which allows to
-        // split a form across several screens?
+        // FIXME: Should we consider only non-null values?
+        // Although distinguishing an empty value (input present but blank) from a null value
+        // (input not present in the form) is possible, this distinction is not possible for
+        // several other kinds of widgets such as BooleanField or MultiValueField. So we keep
+        // it consistent with other widgets.
         //if (newEnteredValue != null) {
         readFromRequest(newEnteredValue);
         //}
@@ -398,8 +409,6 @@
         // generate selection list, if any
         if (selectionList != null) {
             selectionList.generateSaxFragment(contentHandler, locale);
-        } else if (getFieldDefinition().getSelectionList() != null) {
-            getFieldDefinition().getSelectionList().generateSaxFragment(contentHandler, locale);
         }
 
         // include some info about the datatype
@@ -453,14 +462,6 @@
         setSelectionList(getFieldDefinition().buildSelectionListFromModel(model, valuePath, labelPath));
     }
 
-    /**
-     * Delete this field's selection list.
-     */
-    public void removeSelectionList() {
-    	this.selectionList = null;
-    	getFieldDefinition().setSelectionList(null);
-    }
-
     public Datatype getDatatype() {
         return getFieldDefinition().getDatatype();
     }
@@ -489,7 +490,12 @@
     }
 
     public void broadcastEvent(WidgetEvent event) {
-        getFieldDefinition().fireValueChangedEvent((ValueChangedEvent)event);
-        fireValueChangedEvent((ValueChangedEvent)event);
+        if (event instanceof ValueChangedEvent) {
+            getFieldDefinition().fireValueChangedEvent((ValueChangedEvent)event);
+            fireValueChangedEvent((ValueChangedEvent)event);
+        } else {
+            // Other kinds of events
+            super.broadcastEvent(event);
+        }
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinition.java Fri Mar  4 07:47:41 2005
@@ -15,8 +15,6 @@
  */
 package org.apache.cocoon.forms.formmodel;
 
-import org.apache.cocoon.forms.event.CreateEvent;
-
 /**
  * The {@link WidgetDefinition} part of a Field widget, see {@link Field} for more information.
  * 
@@ -27,9 +25,8 @@
 
     public Widget createInstance() {
         Field field = new Field(this);
-        if (this.createListener != null) {
-            this.createListener.widgetCreated(new CreateEvent(field));
-        }
+        // Set the initial selection list, if any
+        field.setSelectionList(getSelectionList());
         return field;
     }
 
@@ -38,6 +35,7 @@
     }
 
     public void setRequired(boolean required) {
+        checkMutable();
         this.required = required;
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinitionBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinitionBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FieldDefinitionBuilder.java Fri Mar  4 07:47:41 2005
@@ -15,11 +15,6 @@
  */
 package org.apache.cocoon.forms.formmodel;
 
-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.apache.cocoon.forms.util.DomHelper;
 import org.w3c.dom.Element;
 
@@ -31,36 +26,17 @@
 public class FieldDefinitionBuilder extends AbstractDatatypeWidgetDefinitionBuilder {
 
     public WidgetDefinition buildWidgetDefinition(Element widgetElement) throws Exception {
-        FieldDefinition fieldDefinition = new FieldDefinition();
-        buildWidgetDefinition(fieldDefinition, widgetElement);
-        return fieldDefinition;
+        FieldDefinition definition = new FieldDefinition();
+        setupDefinition(widgetElement, definition);
+        definition.makeImmutable();
+        return definition;
     }
 
-    protected void buildWidgetDefinition(FieldDefinition fieldDefinition, Element widgetElement) throws Exception {
-        setCommonProperties(widgetElement, fieldDefinition);
-
-        Element datatypeElement = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "datatype");
-        if (datatypeElement == null) {
-            throw new Exception("A nested datatype element is required for the widget " 
-                                + widgetElement.getTagName() + " with id \"" + fieldDefinition.getId()
-                                + "\" at " + DomHelper.getLocation(widgetElement));
-        }
-
-        Datatype datatype = datatypeManager.createDatatype(datatypeElement, false);
-        fieldDefinition.setDatatype(datatype);
-
-        buildSelectionList(widgetElement, fieldDefinition);
-
-        Iterator iter = buildEventListeners(widgetElement, "on-value-changed", ValueChangedListener.class).iterator();
-        while (iter.hasNext()) {
-            fieldDefinition.addValueChangedListener((ValueChangedListener)iter.next());
-        }
-
-        setDisplayData(widgetElement, fieldDefinition);
-        setValidators(widgetElement, fieldDefinition);
-        setCreateListeners(widgetElement, fieldDefinition);
-
+    protected void setupDefinition(Element widgetElement, FieldDefinition definition) throws Exception {
+        super.setupDefinition(widgetElement, definition);
+        
+        // parse "@required"
         boolean required = DomHelper.getAttributeAsBoolean(widgetElement, "required", false);
-        fieldDefinition.setRequired(required);
+        definition.setRequired(required);
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Form.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Form.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Form.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Form.java Fri Mar  4 07:47:41 2005
@@ -56,8 +56,28 @@
         super(definition);
         this.definition = definition;
     }
+    
+    /**
+     * Initialize the form by recursively initializing all its children. Any events occuring within the
+     * initialization phase are buffered and fired after initialization is complete, so that any action
+     * from a widget on another one occurs after that other widget has been given the opportunity to
+     * initialize itself.
+     */
+    public void initialize() {
+        try {
+            // Start buffering events
+            this.bufferEvents = true;
+            super.initialize();
+            // Fire events, still buffering them: this ensures they will be handled in the same
+            // order as they were added.
+            fireEvents();
+        } finally {
+            // Stop buffering events
+            this.bufferEvents = false;
+        }
+    }
 
-    protected WidgetDefinition getDefinition() {
+    public WidgetDefinition getDefinition() {
         return this.definition;
     }
 
@@ -86,7 +106,7 @@
      * Fire the events that have been queued.
      * Note that event handling can fire new events.
      */
-    public void fireEvents() {
+    private void fireEvents() {
         if (this.events != null) {
             CursorableLinkedList.Cursor cursor = this.events.cursor();
             while(cursor.hasNext()) {
@@ -205,6 +225,11 @@
         this.submitWidget = null;
         String submitId = formContext.getRequest().getParameter("forms_submit_id");
         if (submitId != null && submitId.length() > 0) {
+            // if the form has an ID, it is used as part of the submitId too
+            // this has ID has to be cut off
+            if(this.getId() != null && !"".equals(this.getId())) {
+                submitId = submitId.substring(submitId.indexOf('.')+1);
+            }
             StringTokenizer stok = new StringTokenizer(submitId, ".");
             Widget submit = this;
             while (stok.hasMoreTokens()) {
@@ -248,7 +273,7 @@
      * @param redisplayForm indicates if the form should be redisplayed to the user.
      */
     public void endProcessing(boolean redisplayForm) {
-        this.endProcessing = new Boolean(!redisplayForm);
+        this.endProcessing = Boolean.valueOf(!redisplayForm);
     }
 
     /**

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinition.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinition.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinition.java Fri Mar  4 07:47:41 2005
@@ -28,7 +28,6 @@
  * @version $Id$
  */
 public class FormDefinition extends AbstractTopDefinition {
-
     private ProcessingPhaseListener listener;
 
     public FormDefinition() {

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/FormDefinitionBuilder.java Fri Mar  4 07:47:41 2005
@@ -24,13 +24,13 @@
  * 
  * @version $Id$
  */
-public class FormDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
+public final class FormDefinitionBuilder extends AbstractWidgetDefinitionBuilder {
 
     public WidgetDefinition buildWidgetDefinition(Element formElement) throws Exception {
         FormDefinition formDefinition = new FormDefinition();
-        setCommonProperties(formElement, formDefinition);
+        
+        super.setupDefinition(formElement, formDefinition);
         setDisplayData(formElement, formDefinition);
-        setValidators(formElement, formDefinition);
 
         Element widgetsElement = DomHelper.getChildElement(formElement, Constants.DEFINITION_NS, "widgets", true);
         // All child elements of the widgets element are widgets
@@ -43,6 +43,7 @@
 
         formDefinition.resolve();
 
+        formDefinition.makeImmutable();
         return formDefinition;
     }
 }

Modified: cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Group.java
URL: http://svn.apache.org/viewcvs/cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Group.java?view=diff&r1=156170&r2=156171
==============================================================================
--- cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Group.java (original)
+++ cocoon/whiteboard/forms/java/org/apache/cocoon/forms/formmodel/Group.java Fri Mar  4 07:47:41 2005
@@ -31,7 +31,7 @@
         this.definition = definition;
     }
     
-    protected WidgetDefinition getDefinition() {
+    public WidgetDefinition getDefinition() {
         return this.definition;
     }