sylvain     2003/11/03 09:05:02

  Modified:    src/blocks/woody/java/org/apache/cocoon/woody/binding
                        JavaScriptJXPathBinding.java
                        SimpleRepeaterJXPathBinding.java
                        SimpleRepeaterJXPathBindingBuilder.java
  Log:
  Fix bug in JS binding, add new "delete-if-empty" on simple-repeater
  
  Revision  Changes    Path
  1.2       +20 -22    
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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JavaScriptJXPathBinding.java      3 Oct 2003 13:40:41 -0000       1.1
  +++ JavaScriptJXPathBinding.java      3 Nov 2003 17:05:02 -0000       1.2
  @@ -90,28 +90,26 @@
           
           // Move to widget context
           Pointer pointer = jctx.getPointer(this.path);
  -        JXPathContext widgetCtx = jctx.getRelativeContext(pointer);
  -        if (pointer.getNode() != null) {
  -            // There are some nodes to load from
  -    
  -            // FIXME: remove this ugly hack and get the request from the 
Avalon context once
  -            // binding builder are real components
  -            Request request = 
ObjectModelHelper.getRequest(CocoonComponentManager.getCurrentEnvironment().getObjectModel());
  -            
  -            try {
  -                Map values = new HashMap(3);
  -                values.put("widget", widget);
  -                values.put("jxpathContext", widgetCtx);
  -                values.put("jxpathPointer", pointer);
  -                
  -                JavaScriptHelper.execScript(this.loadScript, values, 
request);
  -                
  -            } catch(RuntimeException re) {
  -                // rethrow
  -                throw re;
  -            } catch(Exception e) {
  -                throw new CascadingRuntimeException("Error invoking 
JavaScript event handler", e);
  +
  +        // FIXME: remove this ugly hack and get the request from the Avalon 
context once
  +        // binding builder are real components
  +        Request request = 
ObjectModelHelper.getRequest(CocoonComponentManager.getCurrentEnvironment().getObjectModel());
  +        
  +        try {
  +            Map values = new HashMap(3);
  +            values.put("widget", widget);
  +            values.put("jxpathPointer", pointer);
  +            if (pointer.getNode() != null) {
  +                values.put("jxpathContext", 
jctx.getRelativeContext(pointer));
               }
  +            
  +            JavaScriptHelper.execScript(this.loadScript, values, request);
  +            
  +        } catch(RuntimeException re) {
  +            // rethrow
  +            throw re;
  +        } catch(Exception e) {
  +            throw new CascadingRuntimeException("Error invoking JavaScript 
event handler", e);
           }
       }
   
  
  
  
  1.3       +21 -12    
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.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SimpleRepeaterJXPathBinding.java  3 Oct 2003 13:40:41 -0000       1.2
  +++ SimpleRepeaterJXPathBinding.java  3 Nov 2003 17:05:02 -0000       1.3
  @@ -74,14 +74,16 @@
       private final String rowPath;
       private final boolean clearOnLoad;
       private final JXPathBindingBase rowBinding;
  +    private final boolean deleteIfEmpty;
   
       public SimpleRepeaterJXPathBinding(
  -      String repeaterId, String repeaterPath, String rowPath, boolean 
clearOnLoad, JXPathBindingBase rowBinding) {
  +      String repeaterId, String repeaterPath, String rowPath, boolean 
clearOnLoad, boolean deleteIfEmpty, JXPathBindingBase rowBinding) {
           this.repeaterId = repeaterId;
           this.repeaterPath = repeaterPath;
           this.rowPath = rowPath;
           this.rowBinding = rowBinding;
           this.clearOnLoad = clearOnLoad;
  +        this.deleteIfEmpty = deleteIfEmpty;
       }
   
       public void loadFormFromModel(Widget frmModel, JXPathContext jctx) {
  @@ -129,18 +131,25 @@
           // Find the repeater
           Repeater repeater = (Repeater) frmModel.getWidget(this.repeaterId);
   
  -        // Move to repeater context and create the path if needed
  -        // FIXME: should avoid creating the path if repeater is empty
  -        JXPathContext repeaterContext = 
jctx.getRelativeContext(jctx.createPath(this.repeaterPath));
  +        if (repeater.getSize() == 0 && this.deleteIfEmpty) {
  +            // Repeater is empty : erase all
  +            jctx.removeAll(this.repeaterPath);
   
  -        // Delete all that is already present
  -        repeaterContext.removeAll(this.rowPath);
  -        
  -        for (int i = 0; i < repeater.getSize(); i++) {
  -            String path = this.rowPath + '[' + (i+1) + ']';
  -            Pointer rowPtr = repeaterContext.createPath(path);
  -            JXPathContext rowContext = 
repeaterContext.getRelativeContext(rowPtr);
  -            this.rowBinding.saveFormToModel(repeater.getRow(i), rowContext);
  +        } else {
  +            // Repeater is not empty
  +            
  +            // Move to repeater context and create the path if needed
  +            JXPathContext repeaterContext = 
jctx.getRelativeContext(jctx.createPath(this.repeaterPath));
  +
  +            // Delete all that is already present
  +            repeaterContext.removeAll(this.rowPath);
  +
  +            for (int i = 0; i < repeater.getSize(); i++) {
  +                String path = this.rowPath + '[' + (i+1) + ']';
  +                Pointer rowPtr = repeaterContext.createPath(path);
  +                JXPathContext rowContext = 
repeaterContext.getRelativeContext(rowPtr);
  +                this.rowBinding.saveFormToModel(repeater.getRow(i), 
rowContext);
  +            }
           }
       }
   
  
  
  
  1.3       +2 -1      
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.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SimpleRepeaterJXPathBindingBuilder.java   3 Oct 2003 13:40:41 -0000       
1.2
  +++ SimpleRepeaterJXPathBindingBuilder.java   3 Nov 2003 17:05:02 -0000       
1.3
  @@ -78,10 +78,11 @@
               String parentPath = DomHelper.getAttribute(bindingElem, 
"parent-path");
               String rowPath = DomHelper.getAttribute(bindingElem, "row-path");
               boolean clearOnLoad = 
DomHelper.getAttributeAsBoolean(bindingElem, "clear-before-load", true);
  +            boolean deleteIfEmpty = 
DomHelper.getAttributeAsBoolean(bindingElem, "delete-parent-if-empty", false);
   
               JXPathBindingBase[] childBindings = 
assistant.makeChildBindings(bindingElem);
   
  -            return new SimpleRepeaterJXPathBinding(repeaterId, parentPath, 
rowPath, clearOnLoad,
  +            return new SimpleRepeaterJXPathBinding(repeaterId, parentPath, 
rowPath, clearOnLoad, deleteIfEmpty,
                   new ComposedJXPathBindingBase(childBindings));
           } catch (BindingException e) {
               throw e;
  
  
  

Reply via email to