You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by mp...@apache.org on 2003/12/16 16:05:55 UTC

cvs commit: cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding InsertBeanJXPathBinding.java InsertNodeJXPathBinding.java RepeaterJXPathBindingBuilder.java JXPathBindingBase.java ContextJXPathBindingBuilder.java SetAttributeJXPathBinding.java DeleteNodeJXPathBinding.java ValueJXPathBinding.java JavaScriptJXPathBinding.java JXpathBindingBuilderBase.java ValueJXPathBindingBuilder.java ContextJXPathBinding.java SimpleRepeaterJXPathBindingBuilder.java SimpleRepeaterJXPathBinding.java JavaScriptJXPathBindingBuilder.java AggregateJXPathBinding.java RepeaterJXPathBinding.java SetAttributeJXPathBindingBuilder.java ComposedJXPathBindingBase.java DeleteNodeJXPathBindingBuilder.java InsertNodeJXPathBindingBuilder.java AggregateJXPathBindingBuilder.java InsertBeanJXPathBindingBuilder.java

mpo         2003/12/16 07:05:55

  Modified:    src/blocks/woody/java/org/apache/cocoon/woody/binding
                        InsertBeanJXPathBinding.java
                        InsertNodeJXPathBinding.java
                        RepeaterJXPathBindingBuilder.java
                        JXPathBindingBase.java
                        ContextJXPathBindingBuilder.java
                        SetAttributeJXPathBinding.java
                        DeleteNodeJXPathBinding.java
                        ValueJXPathBinding.java
                        JavaScriptJXPathBinding.java
                        JXpathBindingBuilderBase.java
                        ValueJXPathBindingBuilder.java
                        ContextJXPathBinding.java
                        SimpleRepeaterJXPathBindingBuilder.java
                        SimpleRepeaterJXPathBinding.java
                        JavaScriptJXPathBindingBuilder.java
                        AggregateJXPathBinding.java
                        RepeaterJXPathBinding.java
                        SetAttributeJXPathBindingBuilder.java
                        ComposedJXPathBindingBase.java
                        DeleteNodeJXPathBindingBuilder.java
                        InsertNodeJXPathBindingBuilder.java
                        AggregateJXPathBindingBuilder.java
                        InsertBeanJXPathBindingBuilder.java
  Log:
  Adding support for @direction on all attributes.
  The value of direction should be one of both(default)|load|save and indicates
  which binding directions are active for any given binding.
  This new attribute replaces the @readonly that was available on some selected 
  binding implementations, so this changes previously supported semantics.
  Reasoning and discussion for this feature are here:
  - use cases: http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=107062380411523&w=2
  - @direction choice: http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=107105729827081&w=2
  
  Revision  Changes    Path
  1.3       +4 -3      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/InsertBeanJXPathBinding.java
  
  Index: InsertBeanJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/InsertBeanJXPathBinding.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InsertBeanJXPathBinding.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ InsertBeanJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -75,7 +75,8 @@
       /**
        * Constructs InsertBeanJXPathBinding
        */
  -    public InsertBeanJXPathBinding(String className, String addMethod) {
  +    public InsertBeanJXPathBinding(boolean loadEnabled, boolean saveEnabled, String className, String addMethod) {
  +        super(loadEnabled, saveEnabled);
           this.className = className;
           this.addMethodName = addMethod;
       }
  @@ -83,7 +84,7 @@
       /**
        * Do-nothing implementation of the interface.
        */
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           // doesn't do a thing when loading.
       }
   
  @@ -93,7 +94,7 @@
        * The factory will insert a new instance of the specified bean (classname) 
        * inside this object into the target objectmodel.
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) throws BindingException {
  +    public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
           jxpc.setFactory(new AbstractFactory() {
               public boolean createObject(JXPathContext context, Pointer pointer,
                                           Object parent, String name, int index) {
  
  
  
  1.3       +4 -3      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/InsertNodeJXPathBinding.java
  
  Index: InsertNodeJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/InsertNodeJXPathBinding.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InsertNodeJXPathBinding.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ InsertNodeJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -75,14 +75,15 @@
       /**
        * Constructs InsertNodeJXPathBinding
        */
  -    public InsertNodeJXPathBinding(DocumentFragment domTemplate) {       
  +    public InsertNodeJXPathBinding(boolean loadEnabled, boolean saveEnabled, DocumentFragment domTemplate) {
  +        super(loadEnabled, saveEnabled);
           this.template = domTemplate;
       }
   
       /**
        * Do-nothing implementation of the interface.
        */
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           // doesn't do a thing when loading.
       }
   
  @@ -92,7 +93,7 @@
        * The factory will inserts a clone of the 'template' DocumentFragment 
        * inside this object into the target objectmodel.
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doSave(Widget frmModel, JXPathContext jxpc) {
   
           jxpc.setFactory(new AbstractFactory() {
               public boolean createObject(JXPathContext context, Pointer pointer,
  
  
  
  1.7       +3 -0      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/RepeaterJXPathBindingBuilder.java
  
  Index: RepeaterJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/RepeaterJXPathBindingBuilder.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- RepeaterJXPathBindingBuilder.java	5 Dec 2003 14:06:23 -0000	1.6
  +++ RepeaterJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.7
  @@ -102,6 +102,8 @@
           JXPathBindingManager.Assistant assistant) throws BindingException {
   
           try {
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElm); 
  +            
               String repeaterId = DomHelper.getAttribute(bindingElm, "id");
               String parentPath =
                   DomHelper.getAttribute(bindingElm, "parent-path");
  @@ -157,6 +159,7 @@
   
               RepeaterJXPathBinding repeaterBinding =
                   new RepeaterJXPathBinding(
  +                    directionAtts.loadEnabled, directionAtts.saveEnabled,
                       repeaterId, parentPath, rowPath, rowPathForInsert,
                       uniqueRowId, uniqueRowIdPath,
                       convertor, convertorLocale, 
  
  
  
  1.5       +53 -5     cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/JXPathBindingBase.java
  
  Index: JXPathBindingBase.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/JXPathBindingBase.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- JXPathBindingBase.java	29 Oct 2003 14:18:16 -0000	1.4
  +++ JXPathBindingBase.java	16 Dec 2003 15:05:54 -0000	1.5
  @@ -52,8 +52,10 @@
   
   import org.apache.avalon.framework.logger.LogEnabled;
   import org.apache.avalon.framework.logger.Logger;
  +import org.apache.cocoon.util.jxpath.DOMFactory;
   import org.apache.cocoon.woody.formmodel.Widget;
   import org.apache.commons.jxpath.JXPathContext;
  +import org.w3c.dom.Node;
   
   /**
    * Provides a base class for hooking up Binding implementations that use the 
  @@ -66,13 +68,44 @@
        * Avalon Logger to use in all subclasses.
        */
       private Logger logger;
  +    
  +    /**
  +     * Flag indicating if the nested load-binding on this level should be performed.
  +     */
  +    private final boolean loadEnabled;
  +    
  +    /**
  +     * Flag indicating if the nested save-binding on this level should be performed.
  +     */    
  +    private final boolean saveEnabled;
  +
  +
  +    private JXPathBindingBase() {
  +        this(true, true);
  +    }
  +    
  +    protected JXPathBindingBase(boolean loadEnabled, boolean saveEnabled) {
  +        this.loadEnabled = loadEnabled;
  +        this.saveEnabled = saveEnabled;
  +    }
  +    
  +    /**
  +     * Performs the actual load binding regardless of the flag {@see #loadEnabled}.
  +     * Abstract method that subclasses need to implement for specific activity.
  +     */
  +    public abstract void doLoad(Widget frmModel, JXPathContext jxpc);
   
       /**
        * Redefines the Binding action as working on a JXPathContext Type rather 
        * then on generic objects.
  -     * Abstract method that subclasses need to implement for specific activity.
  +     * Executes the actual loading {@see #doLoad(Widget, JXPathContext)} 
  +     * depending on the value of {@see #loadEnabled}
        */
  -    public abstract void loadFormFromModel(Widget frmModel, JXPathContext jxpc);
  +    public final void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +        if (this.loadEnabled) {
  +            doLoad(frmModel, jxpc);
  +        }    
  +    }
   
       /**
        * Hooks up with the more generic Binding of any objectModel by wrapping
  @@ -87,6 +120,10 @@
           JXPathContext jxpc;
           if (!(objModel instanceof JXPathContext)) {
               jxpc = JXPathContext.newContext(objModel);
  +            
  +            if (objModel instanceof Node) {
  +                jxpc.setFactory(new DOMFactory());
  +            }
           } else {
               jxpc = (JXPathContext) objModel;
           }
  @@ -94,12 +131,23 @@
       }
   
       /**
  +     * Performs the actual save binding regardless of the flag {@see #saveEnabled}.
  +     * Abstract method that subclasses need to implement for specific activity.
  +     */
  +    public abstract void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException;
  +    
  +    /**
        * Redefines the Binding action as working on a JXPathContext Type rather 
        * then on generic objects.
  -     * Abstract method that subclasses need to implement for specific activity.
  +     * Executes the actual saving {@see #doSave(Widget, JXPathContext)} 
  +     * depending on the value of {@see #saveEnabled}
        */
  -    public abstract void saveFormToModel(Widget frmModel, JXPathContext jxpc) throws BindingException;
  -
  +    public final void saveFormToModel(Widget frmModel, JXPathContext jxpc) throws BindingException{
  +        if (this.saveEnabled) {
  +            doSave(frmModel, jxpc);
  +        }    
  +    }
  +    
       /**
        * Hooks up with the more generic Binding of any objectModel by wrapping
        * it up in a JXPathContext object and then transfering control over to
  
  
  
  1.3       +2 -1      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ContextJXPathBindingBuilder.java
  
  Index: ContextJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ContextJXPathBindingBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ContextJXPathBindingBuilder.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ ContextJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -74,11 +74,12 @@
           JXPathBindingManager.Assistant assistant) throws BindingException {
   
           try {
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElm);             
               String xpath = DomHelper.getAttribute(bindingElm, "path");
   
               JXPathBindingBase[] childBindings = assistant.makeChildBindings(bindingElm);
   
  -            ContextJXPathBinding contextBinding = new ContextJXPathBinding(xpath, childBindings);
  +            ContextJXPathBinding contextBinding = new ContextJXPathBinding(directionAtts.loadEnabled, directionAtts.saveEnabled, xpath, childBindings);
               return contextBinding;
           } catch (BindingException e) {
               throw e;
  
  
  
  1.3       +4 -3      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/SetAttributeJXPathBinding.java
  
  Index: SetAttributeJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/SetAttributeJXPathBinding.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SetAttributeJXPathBinding.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ SetAttributeJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -69,7 +69,8 @@
       /**
        * Constructs SetAttributeJXPathBinding
        */
  -    public SetAttributeJXPathBinding(String attName, String attValue) {
  +    public SetAttributeJXPathBinding(boolean loadEnabled, boolean saveEnabled, String attName, String attValue) {
  +        super(loadEnabled, saveEnabled);
           this.name = attName;
           this.value = attValue;
       }
  @@ -77,14 +78,14 @@
       /**
        * Do-Nothing implementation.
        */
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           //this does nothing in the loading of things
       }
   
       /**
        * Sets the attribute value on the passed JXPathContext
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doSave(Widget frmModel, JXPathContext jxpc) {
           jxpc.setValue("@" + this.name, this.value);
           if (getLogger().isDebugEnabled())
               getLogger().debug("done saving " + toString());
  
  
  
  1.2       +6 -2      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/DeleteNodeJXPathBinding.java
  
  Index: DeleteNodeJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/DeleteNodeJXPathBinding.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DeleteNodeJXPathBinding.java	22 Jul 2003 11:52:30 -0000	1.1
  +++ DeleteNodeJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.2
  @@ -63,8 +63,12 @@
    * </ol>
    */
   public class DeleteNodeJXPathBinding extends JXPathBindingBase {
  +    
  +    public DeleteNodeJXPathBinding(boolean loadEnabled, boolean saveEnabled) {
  +        super(loadEnabled, saveEnabled);
  +    }
   
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           // doesn't do a thing when loading.
       }
   
  @@ -72,7 +76,7 @@
       /** 
        * Removes the current context-bean from the jxpath context.
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doSave(Widget frmModel, JXPathContext jxpc) {
           // get rid of the contextbean
           jxpc.removePath(".");
       }
  
  
  
  1.7       +42 -49    cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ValueJXPathBinding.java
  
  Index: ValueJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ValueJXPathBinding.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ValueJXPathBinding.java	18 Nov 2003 21:39:17 -0000	1.6
  +++ ValueJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.7
  @@ -79,11 +79,6 @@
       /**
        * Flag indicating if the objectModel-property can be altered or not
        */
  -    private final boolean readonly;
  -
  -    /**
  -     * Flag indicating if the objectModel-property can be altered or not
  -     */
       private final JXPathBindingBase updateBinding;
   
       /**
  @@ -103,12 +98,12 @@
        *
        * @param convertor may be null
        */
  -    public ValueJXPathBinding(String widgetId, String xpath, boolean readonly, JXPathBindingBase[] updateBindings,
  +    public ValueJXPathBinding(boolean loadEnabled, boolean saveEnabled, String widgetId, String xpath, JXPathBindingBase[] updateBindings,
                                 Convertor convertor, Locale convertorLocale) {
  +        super(loadEnabled, saveEnabled);
           this.fieldId = widgetId;
           this.xpath = xpath;
  -        this.readonly = readonly;
  -        this.updateBinding = new ComposedJXPathBindingBase(updateBindings);
  +        this.updateBinding = new ComposedJXPathBindingBase(true, true, updateBindings);
           this.convertor = convertor;
           this.convertorLocale = convertorLocale;
       }
  @@ -117,7 +112,7 @@
        * Actively performs the binding from the ObjectModel wrapped in a jxpath
        * context to the Woody-form-widget specified in this object.
        */
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           try {
               Widget widget = frmModel.getWidget(this.fieldId);
               Object value = jxpc.getValue(this.xpath);
  @@ -143,53 +138,51 @@
        * Actively performs the binding from the Woody-form to the ObjectModel
        * wrapped in a jxpath context
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) throws BindingException {
  -        if (!this.readonly) {
  -            try {
  -                Widget widget = frmModel.getWidget(this.fieldId);
  -                Object value = widget.getValue();
  -                if (value != null && convertor != null) {
  -                    value = convertor.convertToString(value, convertorLocale, null);
  -                }
  +    public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
  +        try {
  +            Widget widget = frmModel.getWidget(this.fieldId);
  +            Object value = widget.getValue();
  +            if (value != null && convertor != null) {
  +                value = convertor.convertToString(value, convertorLocale, null);
  +            }
   
  -                Object oldValue = jxpc.getValue(this.xpath);
  -                if (getLogger().isDebugEnabled()) {
  -                    getLogger().debug("value= " + value + "-- oldvalue=" + oldValue);
  -                }
  +            Object oldValue = jxpc.getValue(this.xpath);
  +            if (getLogger().isDebugEnabled()) {
  +                getLogger().debug("value= " + value + "-- oldvalue=" + oldValue);
  +            }
   
  -                boolean update = false;
  +            boolean update = false;
   
  -                if ((value == null && oldValue != null) || value != null && !value.equals(oldValue)) {
  -                    // first update the value itself
  -                    jxpc.createPathAndSetValue(this.xpath, value);
  -
  -                    // now perform any other bindings that need to be performed when the value is updated
  -                    JXPathContext subContext = null;
  -                    try {
  -                        subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath));
  -                    } catch (JXPathException e) {
  -                        // if the value has been set to null and the underlying model is a bean, then
  -                        // JXPath will not be able to create a relative context
  -                        if (getLogger().isDebugEnabled()) {
  -                            getLogger().debug("(Ignorable) problem binding field " + widget.getFullyQualifiedId(), e);
  -                        }
  -                    }
  -                    if (subContext != null) {
  -                        this.updateBinding.saveFormToModel(frmModel, subContext);
  +            if ((value == null && oldValue != null) || value != null && !value.equals(oldValue)) {
  +                // first update the value itself
  +                jxpc.createPathAndSetValue(this.xpath, value);
  +
  +                // now perform any other bindings that need to be performed when the value is updated
  +                JXPathContext subContext = null;
  +                try {
  +                    subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath));
  +                } catch (JXPathException e) {
  +                    // if the value has been set to null and the underlying model is a bean, then
  +                    // JXPath will not be able to create a relative context
  +                    if (getLogger().isDebugEnabled()) {
  +                        getLogger().debug("(Ignorable) problem binding field " + widget.getFullyQualifiedId(), e);
                       }
  -
  -                    update = true;
                   }
  -
  -                if (getLogger().isDebugEnabled()) {
  -                    getLogger().debug("done saving " + toString() + " -- value= " + value + " -- on-update == " + update);
  +                if (subContext != null) {
  +                    this.updateBinding.saveFormToModel(frmModel, subContext);
                   }
  -            } catch (Exception e) {
  -                throw new BindingException("Problem binding field " + this.fieldId +
  -                                           " (parent = \"" + frmModel.getFullyQualifiedId() + "\") to xpath " +
  -                                           this.xpath + " (context xpath = \"" + jxpc.getContextPointer().asPath() + "\")",
  -                                           e);
  +
  +                update = true;
  +            }
  +
  +            if (getLogger().isDebugEnabled()) {
  +                getLogger().debug("done saving " + toString() + " -- value= " + value + " -- on-update == " + update);
               }
  +        } catch (Exception e) {
  +            throw new BindingException("Problem binding field " + this.fieldId +
  +                                       " (parent = \"" + frmModel.getFullyQualifiedId() + "\") to xpath " +
  +                                       this.xpath + " (context xpath = \"" + jxpc.getContextPointer().asPath() + "\")",
  +                                       e);
           }
       }
   
  
  
  
  1.3       +5 -4      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/JavaScriptJXPathBinding.java
  
  Index: JavaScriptJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/JavaScriptJXPathBinding.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- JavaScriptJXPathBinding.java	3 Nov 2003 17:05:02 -0000	1.2
  +++ JavaScriptJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -75,14 +75,15 @@
       private final Script loadScript;
       private final Script saveScript;
       
  -    public JavaScriptJXPathBinding(String id, String path, Script loadScript, Script saveScript) {
  +    public JavaScriptJXPathBinding(boolean loadEnabled, boolean saveEnabled, String id, String path, Script loadScript, Script saveScript) {        
  +        super(loadEnabled && (loadScript != null), saveEnabled && (saveScript != null));
           this.id = id;
           this.path = path;
           this.loadScript = loadScript;
           this.saveScript = saveScript;
       }
   
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jctx) {
  +    public void doLoad(Widget frmModel, JXPathContext jctx) {
           
           if (this.loadScript == null) return;
           
  @@ -113,7 +114,7 @@
           }
       }
   
  -    public void saveFormToModel(Widget frmModel, JXPathContext jctx) throws BindingException {
  +    public void doSave(Widget frmModel, JXPathContext jctx) throws BindingException {
           if (this.saveScript == null) return;
           
           Widget widget = frmModel.getWidget(this.id);
  
  
  
  1.4       +69 -1     cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/JXpathBindingBuilderBase.java
  
  Index: JXpathBindingBuilderBase.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/JXpathBindingBuilderBase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JXpathBindingBuilderBase.java	30 Jul 2003 15:17:43 -0000	1.3
  +++ JXpathBindingBuilderBase.java	16 Dec 2003 15:05:54 -0000	1.4
  @@ -52,14 +52,24 @@
   
   import org.apache.avalon.framework.logger.LogEnabled;
   import org.apache.avalon.framework.logger.Logger;
  +import org.apache.cocoon.woody.util.DomHelper;
   import org.w3c.dom.Element;
   
   /**
  - * Abstract base class enabling the logging.
  + * Abstract base class enabling logging and supporting the intrepretation of 
  + * common configuration settings on all specific implementations of
  + * {@see org.apache.cocoon.woody.binding.JXPathBindingBase}.
  + * 
  + * Common supported configurations:
  + * <ul>
  + * <li>Attribute direction="load|save|both": {@see #getDirectionAttributes(Element)}</li>
  + * </ul>
    */
   public abstract class JXpathBindingBuilderBase implements LogEnabled {
   
       private Logger logger;
  +    private static final int LOAD_DIRECTION = 0;
  +    private static final int SAVE_DIRECTION = 1;
   
       /**
        * Receives the Avalon logger to use.
  @@ -90,4 +100,62 @@
           Element bindingElm,
           JXPathBindingManager.Assistant assistant) throws BindingException;
   
  +    /**
  +     * Helper method for interpreting the direction="" attribute which is supported
  +     * on each of the Bindings.  Direction can hold one of the following values:
  +     * <ol><li><code>load</code>: This binding will only load.</li>
  +     * <li><code>save</code>: This binding will only save.</li>
  +     * <li><code>both</code>: This binding will perform both operations.</li>
  +     * </ol>
  +     * @param bindingElm
  +     * @return an instance of DirectionAttributes
  +     * @throws BindingException
  +     */
  +     static DirectionAttributes getDirectionAttributes(Element bindingElm) throws BindingException {
  +        try {
  +            String direction = DomHelper.getAttribute(bindingElm, "direction", "both");                       
  +            return new DirectionAttributes(direction);
  +        } catch (BindingException e) {
  +            throw e;
  +        } catch (Exception e) {
  +            throw new BindingException("Error building binding defined at " + DomHelper.getLocation(bindingElm), e);
  +        }
  +     }
  +    
  +     /**
  +      * DirectionAttributes is a simple helper class for holding the distinct data
  +      * member fields indicating the activity of the sepearate load and save 
  +      * actions of a given binding.
  +      */
  +     static class DirectionAttributes{
  +        final boolean loadEnabled;
  +        final boolean saveEnabled;
  +        
  +        DirectionAttributes(String direction){
  +            this(isLoadEnabled(direction), isSaveEnabled(direction));
  +        }
  +        
  +        DirectionAttributes(boolean loadEnabled, boolean saveEnabled){
  +                this.loadEnabled = loadEnabled;
  +            this.saveEnabled = saveEnabled;
  +        }
  +        
  +        /** 
  +         * Interprets the value of the direction attribute into activity of the load action.
  +         * @param direction
  +         * @return true if direction is either set to "both" or "load"
  +         */
  +        private static boolean isLoadEnabled(String direction) {            
  +            return "both".equals(direction) || "load".equals(direction);
  +        }
  +        
  +        /** 
  +         * Interprets the value of the direction attribute into activity of the save action.
  +         * @param direction
  +         * @return true if direction is either set to "both" or "save"
  +         */
  +        private static boolean isSaveEnabled(String direction) {            
  +            return "both".equals(direction) || "save".equals(direction);
  +        }       
  +    }
   }
  
  
  
  1.3       +3 -2      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ValueJXPathBindingBuilder.java
  
  Index: ValueJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ValueJXPathBindingBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ValueJXPathBindingBuilder.java	29 Oct 2003 14:18:16 -0000	1.2
  +++ ValueJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -82,7 +82,7 @@
       public JXPathBindingBase buildBinding(Element bindingElm, JXPathBindingManager.Assistant assistant) throws BindingException {
   
           try {
  -            boolean readonly = DomHelper.getAttributeAsBoolean(bindingElm, "readonly", false);
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElm); 
               String xpath = DomHelper.getAttribute(bindingElm, "path");
               String widgetId = DomHelper.getAttribute(bindingElm, "id");
   
  @@ -104,7 +104,8 @@
               }
   
               ValueJXPathBinding fieldBinding =
  -                    new ValueJXPathBinding(widgetId, xpath, readonly, updateBindings, convertor, convertorLocale);
  +                    new ValueJXPathBinding(directionAtts.loadEnabled, directionAtts.saveEnabled, 
  +                            widgetId, xpath, updateBindings, convertor, convertorLocale);
   
               return fieldBinding;
           } catch (BindingException e) {
  
  
  
  1.5       +6 -6      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ContextJXPathBinding.java
  
  Index: ContextJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ContextJXPathBinding.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ContextJXPathBinding.java	18 Nov 2003 21:39:17 -0000	1.4
  +++ ContextJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.5
  @@ -69,8 +69,8 @@
       /**
        * Constructs ContextJXPathBinding for the specified xpath sub-context
        */
  -    public ContextJXPathBinding(String contextPath, JXPathBindingBase[] childBindings) {
  -        super(childBindings);
  +    public ContextJXPathBinding(boolean loadEnabled, boolean saveEnabled, String contextPath, JXPathBindingBase[] childBindings) {
  +        super(loadEnabled, saveEnabled, childBindings);
           this.xpath = contextPath;
       }
   
  @@ -78,11 +78,11 @@
        * Actively performs the binding from the ObjectModel wrapped in a jxpath 
        * context to the Woody-form.
        */
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           Pointer ptr = jxpc.getPointer(this.xpath);
           if (ptr.getNode() != null) {
               JXPathContext subContext = jxpc.getRelativeContext(ptr);
  -            super.loadFormFromModel(frmModel, subContext);
  +            super.doLoad(frmModel, subContext);
               if (getLogger().isDebugEnabled())
                   getLogger().debug("done loading " + toString());
           } else {
  @@ -96,7 +96,7 @@
        * Actively performs the binding from the Woody-form to the ObjectModel 
        * wrapped in a jxpath context.
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) throws BindingException {
  +    public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
           Pointer ptr = jxpc.getPointer(this.xpath);
           if (ptr.getNode() == null) {
               jxpc.createPath(this.xpath);
  @@ -104,7 +104,7 @@
               ptr = jxpc.getPointer(this.xpath);
           }
           JXPathContext subContext = jxpc.getRelativeContext(ptr);
  -        super.saveFormToModel(frmModel, subContext);
  +        super.doSave(frmModel, subContext);
           if (getLogger().isDebugEnabled()) {
               getLogger().debug("done saving " + toString());
           }
  
  
  
  1.4       +4 -2      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/SimpleRepeaterJXPathBindingBuilder.java
  
  Index: SimpleRepeaterJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/SimpleRepeaterJXPathBindingBuilder.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SimpleRepeaterJXPathBindingBuilder.java	3 Nov 2003 17:05:02 -0000	1.3
  +++ SimpleRepeaterJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.4
  @@ -74,6 +74,8 @@
           JXPathBindingManager.Assistant assistant) throws BindingException {
   
           try {
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElem); 
  +            
               String repeaterId = DomHelper.getAttribute(bindingElem, "id");
               String parentPath = DomHelper.getAttribute(bindingElem, "parent-path");
               String rowPath = DomHelper.getAttribute(bindingElem, "row-path");
  @@ -82,8 +84,8 @@
   
               JXPathBindingBase[] childBindings = assistant.makeChildBindings(bindingElem);
   
  -            return new SimpleRepeaterJXPathBinding(repeaterId, parentPath, rowPath, clearOnLoad, deleteIfEmpty,
  -                new ComposedJXPathBindingBase(childBindings));
  +            return new SimpleRepeaterJXPathBinding( directionAtts.loadEnabled, directionAtts.saveEnabled, repeaterId, parentPath, rowPath, clearOnLoad, deleteIfEmpty,
  +                new ComposedJXPathBindingBase(true, true, childBindings));
           } catch (BindingException e) {
               throw e;
           } catch (Exception e) {
  
  
  
  1.4       +4 -3      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/SimpleRepeaterJXPathBinding.java
  
  Index: SimpleRepeaterJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/SimpleRepeaterJXPathBinding.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SimpleRepeaterJXPathBinding.java	3 Nov 2003 17:05:02 -0000	1.3
  +++ SimpleRepeaterJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.4
  @@ -77,7 +77,8 @@
       private final boolean deleteIfEmpty;
   
       public SimpleRepeaterJXPathBinding(
  -      String repeaterId, String repeaterPath, String rowPath, boolean clearOnLoad, boolean deleteIfEmpty, JXPathBindingBase rowBinding) {
  +            boolean loadEnabled, boolean saveEnabled, String repeaterId, String repeaterPath, String rowPath, boolean clearOnLoad, boolean deleteIfEmpty, JXPathBindingBase rowBinding) {
  +        super(loadEnabled, saveEnabled);
           this.repeaterId = repeaterId;
           this.repeaterPath = repeaterPath;
           this.rowPath = rowPath;
  @@ -86,7 +87,7 @@
           this.deleteIfEmpty = deleteIfEmpty;
       }
   
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jctx) {
  +    public void doLoad(Widget frmModel, JXPathContext jctx) {
           // Find the repeater and clear it
           Repeater repeater = (Repeater) frmModel.getWidget(this.repeaterId);
           
  @@ -127,7 +128,7 @@
               getLogger().debug("done loading rows " + toString());
       }
   
  -    public void saveFormToModel(Widget frmModel, JXPathContext jctx) throws BindingException {
  +    public void doSave(Widget frmModel, JXPathContext jctx) throws BindingException {
           // Find the repeater
           Repeater repeater = (Repeater) frmModel.getWidget(this.repeaterId);
   
  
  
  
  1.2       +15 -12    cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/JavaScriptJXPathBindingBuilder.java
  
  Index: JavaScriptJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/JavaScriptJXPathBindingBuilder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JavaScriptJXPathBindingBuilder.java	3 Oct 2003 13:40:41 -0000	1.1
  +++ JavaScriptJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.2
  @@ -81,7 +81,10 @@
    * <li><code>jxpathPointer</code>: the JXPath pointer corresponding to the "path" attribute,
    * <li><code>jxpathContext</code> (not shown): the JXPath context corresponding to the "path" attribute
    * </ul>
  - * The &lt;wb:save-form&gt; snippet should be ommitted if the "read-only" attribute is present.
  + * <b>Notes:</b><ul>
  + * <li>The &lt;wb:save-form&gt; snippet should be ommitted if the "direction" attribute is set to "load".</li>
  + * <li>The &lt;wb:load-form&gt; snippet should be ommitted if the "direction" attribute is set to "save".</li>
  + * </ul>
    * 
    * @author <a href="http://www.apache.org/~sylvain/">Sylvain Wallez</a>
    * @version CVS $Id$
  @@ -90,24 +93,24 @@
   
       public JXPathBindingBase buildBinding(Element element, Assistant assistant) throws BindingException {
           try {
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(element); 
  +            
               String id = DomHelper.getAttribute(element, "id");
               String path = DomHelper.getAttribute(element, "path");
               
  -            boolean readOnly = DomHelper.getAttributeAsBoolean(element, "read-only", false);
  -        
  -
  -            Element loadElem = DomHelper.getChildElement(element, BindingManager.NAMESPACE, "load-form");
  -            Script loadScript = JavaScriptHelper.buildScript(loadElem);
  +            Script loadScript = null;
  +            if (directionAtts.loadEnabled) {
  +                Element loadElem = DomHelper.getChildElement(element, BindingManager.NAMESPACE, "load-form");
  +                loadScript = JavaScriptHelper.buildScript(loadElem);
  +            }
               
  -            Script saveScript;
  -            if (readOnly) {
  -                saveScript = null;
  -            } else {
  +            Script saveScript = null;
  +            if (directionAtts.saveEnabled) {
                   Element saveElem = DomHelper.getChildElement(element, BindingManager.NAMESPACE, "save-form");
                   saveScript = JavaScriptHelper.buildScript(saveElem);
               }
   
  -            return new JavaScriptJXPathBinding(id, path, loadScript, saveScript);
  +            return new JavaScriptJXPathBinding(directionAtts.loadEnabled, directionAtts.saveEnabled, id, path, loadScript, saveScript);
   
           } catch(Exception e) {
               throw new BindingException("Cannot build binding at " + DomHelper.getLocation(element), e);
  
  
  
  1.4       +6 -6      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/AggregateJXPathBinding.java
  
  Index: AggregateJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/AggregateJXPathBinding.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AggregateJXPathBinding.java	18 Nov 2003 21:39:17 -0000	1.3
  +++ AggregateJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.4
  @@ -75,8 +75,8 @@
        * @param xpath
        * @param childBindings
        */
  -    public AggregateJXPathBinding(String widgetId, String xpath, JXPathBindingBase[] childBindings) {
  -        super(childBindings);
  +    public AggregateJXPathBinding(boolean loadEnabled, boolean saveEnabled, String widgetId, String xpath, JXPathBindingBase[] childBindings) {
  +        super(loadEnabled, saveEnabled, childBindings);
           this.widgetId = widgetId;
           this.xpath = xpath;
       }
  @@ -86,10 +86,10 @@
        * narrows the scope on the object-model to the member xpath-context 
        * before continuing the binding over the child-bindings.
        */
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           AggregateField aggregate = (AggregateField) frmModel.getWidget(this.widgetId);
           JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath));
  -        super.loadFormFromModel(aggregate, subContext);
  +        super.doLoad(aggregate, subContext);
           if (getLogger().isDebugEnabled()) {
               getLogger().debug("done loading " + toString());
           }
  @@ -100,10 +100,10 @@
        * narrows the scope on the object-model to the member xpath-context 
        * before continuing the binding over the child-bindings.
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) throws BindingException {
  +    public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
           AggregateField aggregate = (AggregateField) frmModel.getWidget(this.widgetId);
           JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath));
  -        super.saveFormToModel(aggregate, subContext);
  +        super.doSave(aggregate, subContext);
           if (getLogger().isDebugEnabled()) {
               getLogger().debug("done saving " + toString());
           }
  
  
  
  1.11      +11 -8     cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/RepeaterJXPathBinding.java
  
  Index: RepeaterJXPathBinding.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/RepeaterJXPathBinding.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- RepeaterJXPathBinding.java	5 Dec 2003 14:06:23 -0000	1.10
  +++ RepeaterJXPathBinding.java	16 Dec 2003 15:05:54 -0000	1.11
  @@ -87,23 +87,26 @@
       /**
        * Constructs RepeaterJXPathBinding
        */
  -    public RepeaterJXPathBinding(String repeaterId, String repeaterPath, 
  +    public RepeaterJXPathBinding(boolean loadEnabled, boolean saveEnabled, 
  +                                 String repeaterId, String repeaterPath, 
                                    String rowPath, String rowPathForInsert,
                                    String uniqueRowId, String uniqueRowPath, 
                                    JXPathBindingBase[] childBindings,
                                    JXPathBindingBase insertBinding, JXPathBindingBase[] deleteBindings) {
  -        this(repeaterId, repeaterPath, rowPath, rowPathForInsert, uniqueRowId, uniqueRowPath, null, null, childBindings, insertBinding, deleteBindings);
  +        this(loadEnabled, saveEnabled, repeaterId, repeaterPath, rowPath, rowPathForInsert, uniqueRowId, uniqueRowPath, null, null, childBindings, insertBinding, deleteBindings);
       }
   
       /**
        * Constructs RepeaterJXPathBinding
        */
  -    public RepeaterJXPathBinding(String repeaterId, String repeaterPath, 
  +    public RepeaterJXPathBinding(boolean loadEnabled, boolean saveEnabled, 
  +                                 String repeaterId, String repeaterPath, 
                                    String rowPath, String rowPathForInsert,
                                    String uniqueRowId, String uniqueRowPath, 
                                    Convertor convertor, Locale convertorLocale, 
                                    JXPathBindingBase[] childBindings,
                                    JXPathBindingBase insertBinding, JXPathBindingBase[] deleteBindings) {
  +        super(loadEnabled, saveEnabled);
           this.repeaterId = repeaterId;
           this.repeaterPath = repeaterPath;
           this.rowPath = rowPath;
  @@ -111,12 +114,12 @@
           this.uniqueRowId = uniqueRowId;
           this.uniqueRowIdPath = uniqueRowPath;
           this.uniqueFieldBinding =
  -            new ValueJXPathBinding(uniqueRowId, uniqueRowPath, true, null, convertor, convertorLocale);
  +            new ValueJXPathBinding(true, true, uniqueRowId, uniqueRowPath, null, convertor, convertorLocale);
           this.uniqueRowIdConvertor = convertor;
           this.uniqueRowIdConvertorLocale = convertorLocale;
  -        this.rowBinding = new ComposedJXPathBindingBase(childBindings);
  +        this.rowBinding = new ComposedJXPathBindingBase(true, true, childBindings);
           this.insertRowBinding = insertBinding;
  -        this.deleteRowBinding = new ComposedJXPathBindingBase(deleteBindings);
  +        this.deleteRowBinding = new ComposedJXPathBindingBase(true, true, deleteBindings);
       }
   
   
  @@ -125,7 +128,7 @@
        * objectModelContext and Repeater to the repeated rows before handing 
        * over to the actual binding-children.
        */
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           // Find the repeater
           Repeater repeater = (Repeater) frmModel.getWidget(this.repeaterId);
           repeater.removeRows();
  @@ -158,7 +161,7 @@
        * updated, inserted or removed.  Depending on what happened the appropriate
        * child-bindings are alowed to visit the narrowed contexts.
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) throws BindingException {
  +    public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
           // Find the repeater
           Repeater repeater = (Repeater) frmModel.getWidget(this.repeaterId);
   
  
  
  
  1.3       +3 -1      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/SetAttributeJXPathBindingBuilder.java
  
  Index: SetAttributeJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/SetAttributeJXPathBindingBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SetAttributeJXPathBindingBuilder.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ SetAttributeJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -76,11 +76,13 @@
           JXPathBindingManager.Assistant assistant) throws BindingException {
   
           try {
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElm); 
  +            
               String attName = DomHelper.getAttribute(bindingElm, "name");
               String attValue = DomHelper.getAttribute(bindingElm, "value");
   
               SetAttributeJXPathBinding attBinding =
  -                new SetAttributeJXPathBinding(attName, attValue);
  +                new SetAttributeJXPathBinding(directionAtts.loadEnabled, directionAtts.saveEnabled, attName, attValue);
   
               return attBinding;
           } catch (BindingException e) {
  
  
  
  1.3       +4 -3      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ComposedJXPathBindingBase.java
  
  Index: ComposedJXPathBindingBase.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/ComposedJXPathBindingBase.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ComposedJXPathBindingBase.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ ComposedJXPathBindingBase.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -67,7 +67,8 @@
        * 
        * @param childBindings sets the array of childBindings
        */
  -    protected ComposedJXPathBindingBase(JXPathBindingBase[] childBindings) {
  +    protected ComposedJXPathBindingBase(boolean loadEnabled, boolean saveEnabled, JXPathBindingBase[] childBindings) {
  +        super(loadEnabled, saveEnabled);
           this.subBindings = childBindings;
       }
   
  @@ -88,7 +89,7 @@
        * Actively performs the binding from the ObjectModel to the Woody-form
        * by passing the task onto it's children.
        */
  -    public void loadFormFromModel(Widget frmModel, JXPathContext jxpc) {
  +    public void doLoad(Widget frmModel, JXPathContext jxpc) {
           if (this.subBindings != null) {
               int size = this.subBindings.length;
               for (int i = 0; i < size; i++) {
  @@ -101,7 +102,7 @@
        * Actively performs the binding from the Woody-form to the ObjectModel 
        * by passing the task onto it's children.
        */
  -    public void saveFormToModel(Widget frmModel, JXPathContext jxpc) throws BindingException {
  +    public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException {
           if (this.subBindings != null) {
               int size = this.subBindings.length;
               for (int i = 0; i < size; i++) {
  
  
  
  1.3       +4 -3      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/DeleteNodeJXPathBindingBuilder.java
  
  Index: DeleteNodeJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/DeleteNodeJXPathBindingBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DeleteNodeJXPathBindingBuilder.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ DeleteNodeJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -69,8 +69,9 @@
       /**
        * Creates an instance of {@link DeleteNodeJXPathBinding}.
        */
  -    public JXPathBindingBase buildBinding(Element bindingElm, Assistant assistant) {
  -
  -        return new DeleteNodeJXPathBinding();
  +    public JXPathBindingBase buildBinding(Element bindingElm, Assistant assistant) throws BindingException {
  +        DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElm); 
  +        
  +        return new DeleteNodeJXPathBinding(directionAtts.loadEnabled, directionAtts.saveEnabled);
       }
   }
  
  
  
  1.5       +3 -1      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/InsertNodeJXPathBindingBuilder.java
  
  Index: InsertNodeJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/InsertNodeJXPathBindingBuilder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- InsertNodeJXPathBindingBuilder.java	5 Sep 2003 10:41:27 -0000	1.4
  +++ InsertNodeJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.5
  @@ -82,6 +82,8 @@
           JXPathBindingManager.Assistant assistant) throws BindingException {
   
           try {
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElm); 
  +            
               DocumentFragment domTemplate = null;
   
               String src = bindingElm.getAttribute("src");
  @@ -124,7 +126,7 @@
                   }
               }
   
  -            return new InsertNodeJXPathBinding(domTemplate);
  +            return new InsertNodeJXPathBinding(directionAtts.loadEnabled, directionAtts.saveEnabled, domTemplate);
           } catch (Exception e) {
               throw new BindingException("Error building the insert-node binding defined at " + DomHelper.getLocation(bindingElm), e);
           }
  
  
  
  1.3       +2 -1      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/AggregateJXPathBindingBuilder.java
  
  Index: AggregateJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/AggregateJXPathBindingBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AggregateJXPathBindingBuilder.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ AggregateJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -70,12 +70,13 @@
       public JXPathBindingBase buildBinding(Element bindingElm, JXPathBindingManager.Assistant assistant)
               throws BindingException {
           try {
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElm); 
               String xpath = DomHelper.getAttribute(bindingElm, "path");
               String widgetId = DomHelper.getAttribute(bindingElm, "id");
   
               JXPathBindingBase[] childBindings = assistant.makeChildBindings(bindingElm);
   
  -            AggregateJXPathBinding aggregateBinding = new AggregateJXPathBinding(widgetId, xpath, childBindings);
  +            AggregateJXPathBinding aggregateBinding = new AggregateJXPathBinding(directionAtts.loadEnabled, directionAtts.saveEnabled, widgetId, xpath, childBindings);
               return aggregateBinding;
           } catch (BindingException e) {
               throw e;
  
  
  
  1.3       +3 -1      cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/InsertBeanJXPathBindingBuilder.java
  
  Index: InsertBeanJXPathBindingBuilder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/binding/InsertBeanJXPathBindingBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InsertBeanJXPathBindingBuilder.java	24 Jul 2003 12:39:17 -0000	1.2
  +++ InsertBeanJXPathBindingBuilder.java	16 Dec 2003 15:05:54 -0000	1.3
  @@ -73,12 +73,14 @@
       public JXPathBindingBase buildBinding(Element bindingElm, Assistant assistant) throws BindingException {
   
           try {
  +            DirectionAttributes directionAtts = JXpathBindingBuilderBase.getDirectionAttributes(bindingElm); 
  +            
               String className =
                   DomHelper.getAttribute(bindingElm, "classname");
               String addMethod =
                   DomHelper.getAttribute(bindingElm, "addmethod");
   
  -            return new InsertBeanJXPathBinding(className, addMethod);
  +            return new InsertBeanJXPathBinding(directionAtts.loadEnabled, directionAtts.saveEnabled, className, addMethod);
           } catch (BindingException e) {
               throw e;
           } catch (Exception e) {