You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2006/09/02 13:26:16 UTC
svn commit: r439574 - in /cocoon: branches/BRANCH_2_1_X/
trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/
Author: vgritsenko
Date: Sat Sep 2 04:26:15 2006
New Revision: 439574
URL: http://svn.apache.org/viewvc?rev=439574&view=rev
Log:
<action dev="VG" type="fix">
CForms: Repeater identity binding was failing on save if widget path was
given.
</action>
<action dev="VG" type="fix">
CForms: Inherit fb:on-delete-row, fb:on-insert-row, fb:identity repeater
bindings from the parent. Fix detection of 'simple' mode.
</action>
Modified:
cocoon/branches/BRANCH_2_1_X/status.xml
cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBinding.java
cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBindingBuilder.java
Modified: cocoon/branches/BRANCH_2_1_X/status.xml
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/status.xml?rev=439574&r1=439573&r2=439574&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml (original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml Sat Sep 2 04:26:15 2006
@@ -184,8 +184,17 @@
<release version="@version@" date="@date@">
-->
<release version="2.1.10" date="TBD">
+ <action dev="VG" type="fix">
+ CForms: Repeater identity binding was failing on save if widget path was
+ given.
+ </action>
+ <action dev="VG" type="fix">
+ CForms: Inherit fb:on-delete-row, fb:on-insert-row, fb:identity repeater
+ bindings from the parent. Fix detection of 'simple' mode.
+ </action>
<action dev="AN" type="add">
- ZipArchiveSerializer: Set time stamp of ZIP entries to last modification time of source file.
+ ZipArchiveSerializer: Set time stamp of ZIP entries to last modification
+ time of source file.
</action>
<action dev="AG" type="update">
Updated ehcache to 1.2.2.
@@ -206,7 +215,7 @@
Core: CopySourceAction generate NPE.
</action>
<action dev="AG" type="fix" fixes-bug="COCOON-1849" due-to="Mark Lundquist" due-to-email="mlundquist2@comcast.net">
- CForms: debug logging left in AggregateFieldDefinitionBuilder.java.
+ CForms: Removed debug logging left in AggregateFieldDefinitionBuilder.java.
</action>
<action dev="MPO" type="fix" fixes-bug="COCOON-1687" >
CForms: Reverting incompatible change introduced in version 2.1.9. When binding a widget with value null, XML
Modified: cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBinding.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBinding.java?rev=439574&r1=439573&r2=439574&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBinding.java (original)
+++ cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBinding.java Sat Sep 2 04:26:15 2006
@@ -1,12 +1,12 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -43,7 +43,7 @@
* @version $Id$
*/
public class RepeaterJXPathBinding extends JXPathBindingBase {
-
+
private final String repeaterId;
private final String repeaterPath;
private final String rowPath;
@@ -52,7 +52,7 @@
private final JXPathBindingBase insertRowBinding;
private final JXPathBindingBase deleteRowBinding;
private final ComposedJXPathBindingBase identityBinding;
-
+
/**
* Constructs RepeaterJXPathBinding
*/
@@ -67,17 +67,17 @@
this.repeaterPath = repeaterPath;
this.rowPath = rowPath;
this.rowPathForInsert = rowPathForInsert;
-
+
this.rowBinding = new ComposedJXPathBindingBase(
JXPathBindingBuilderBase.CommonAttributes.DEFAULT,
childBindings);
this.rowBinding.setParent(this);
-
+
this.insertRowBinding = insertBinding;
if (this.insertRowBinding != null) {
this.insertRowBinding.setParent(this);
}
-
+
if (deleteBindings != null) {
this.deleteRowBinding = new ComposedJXPathBindingBase(
JXPathBindingBuilderBase.CommonAttributes.DEFAULT,
@@ -86,10 +86,10 @@
} else {
this.deleteRowBinding = null;
}
-
-
+
+
if (identityBindings != null) {
-
+
this.identityBinding = new ComposedJXPathBindingBase(
JXPathBindingBuilderBase.CommonAttributes.DEFAULT,
identityBindings);
@@ -98,7 +98,7 @@
else
this.identityBinding = null;
}
-
+
public String getId() { return repeaterId; }
public String getRepeaterPath() { return repeaterPath; }
public String getRowPath() { return rowPath; }
@@ -107,7 +107,7 @@
public ComposedJXPathBindingBase getDeleteRowBinding() { return (ComposedJXPathBindingBase)deleteRowBinding; }
public ComposedJXPathBindingBase getIdentityBinding() { return identityBinding; }
public JXPathBindingBase getInsertRowBinding() { return insertRowBinding; }
-
+
/**
* Binds the unique-id of the repeated rows, and narrows the context on
* objectModelContext and Repeater to the repeated rows before handing
@@ -121,15 +121,15 @@
throw new BindingException("The repeater with the ID [" + this.repeaterId
+ "] referenced in the binding does not exist in the form definition.");
}
-
+
if (repeater.isPageable()) {
PageStorage pageStorage = new PageStorage(repeater,jxpc);
pageStorage.doPageLoad();
return;
}
-
+
repeater.clear();
-
+
Pointer ptr = jxpc.getPointer(this.repeaterPath);
if (ptr.getNode() != null) {
// There are some nodes to load from
@@ -161,7 +161,7 @@
if (getLogger().isDebugEnabled())
getLogger().debug("done loading rows " + toString());
}
-
+
/**
* Uses the mapped identity of each row to detect if rows have been
* updated, inserted or removed. Depending on what happened the appropriate
@@ -171,29 +171,29 @@
throws BindingException {
// Find the repeater
Repeater repeater = (Repeater) selectWidget(frmModel, this.repeaterId);
-
+
if (repeater.isPageable()) {
- jxpc = repeater.getStorage().doSave();
+ repeater.getStorage().doSave();
return;
}
-
+
// and his context, creating the path if needed
JXPathContext repeaterContext =
jxpc.getRelativeContext(jxpc.createPath(this.repeaterPath));
-
+
// create set of updatedRowIds
Set updatedRows = new HashSet();
//create list of rows to insert at end
List rowsToInsert = new ArrayList();
-
+
// iterate rows in the form model...
int formRowCount = repeater.getSize();
for (int i = 0; i < formRowCount; i++) {
Repeater.RepeaterRow thisRow = repeater.getRow(i);
-
+
// Get the identity
List identity = getIdentity(thisRow);
-
+
if (hasNonNullElements(identity)) {
// iterate nodes to find match
Iterator rowPointers = repeaterContext.iteratePointers(this.rowPath);
@@ -323,7 +323,7 @@
/**
* Get the identity of the given row context. That's infact a list of all
- * the values of the fields in the bean or XML that constitute the identity.
+ * the values of the fields in the bean or XML that constitute the identity.
* @param rowContext
* @return List the identity of the row context
*/
@@ -356,14 +356,14 @@
}
}
identity.add(value);
- }
+ }
}
return identity;
}
/**
- * Get the identity of the given row. That's infact a list of all the values
- * of the fields in the form model that constitute the identity.
+ * Get the identity of the given row. That's in fact a list of all the values
+ * of the fields in the form model that constitute the identity.
* @param row
* @return List the identity of the row
*/
@@ -372,15 +372,15 @@
if (this.identityBinding == null) {
return Collections.EMPTY_LIST;
}
-
+
List identity = new ArrayList();
JXPathBindingBase[] childBindings = this.identityBinding.getChildBindings();
if (childBindings != null) {
int size = childBindings.length;
for (int i = 0; i < size; i++) {
- String fieldId = ((ValueJXPathBinding)childBindings[i]).getFieldId();
- Widget widget = row.getChild(fieldId);
+ String fieldId = ((ValueJXPathBinding) childBindings[i]).getFieldId();
+ Widget widget = row.lookupWidget(fieldId);
Object value = widget.getValue();
identity.add(value);
}
@@ -390,7 +390,7 @@
public String toString() {
return "RepeaterJXPathBinding [widget=" + this.repeaterId +
- ", xpath=" + this.repeaterPath + "]";
+ ", xpath=" + this.repeaterPath + "]";
}
public void enableLogging(Logger logger) {
@@ -420,11 +420,11 @@
this.repeater.setStorage(this);
this.updatedRows = new HashMap();
-
+
/*
* workaround for jxpath doesn't simply calls size() on count(..) using collections
*/
-
+
int collectionSize = 0;
Object value = storageContext.getValue(rowPath);
if (value != null) {
@@ -463,7 +463,7 @@
}
if (identityBinding != null) {
identityBinding.loadFormFromModel(thisRow, rowContext);
- }
+ }
rowBinding.loadFormFromModel(thisRow, rowContext);
}
}
@@ -481,7 +481,7 @@
// Get the identity
List identity = getIdentity(thisRow);
-
+
if (hasNonNullElements(identity)) {
// iterate nodes to find match
Iterator rowPointers = repeaterContext.iteratePointers(rowPath + getPaginationClause());
@@ -496,9 +496,9 @@
}
}
}
-
+
public JXPathContext doSave() throws BindingException {
-
+
// iterate context and saveToModel
Iterator rowPointers = this.storageContext.iteratePointers(rowPath);
while (rowPointers.hasNext()) {
@@ -514,32 +514,31 @@
}
return this.storageContext;
}
-
+
private String getPaginationClause() {
- String paginationClause = "";
+ String paginationClause;
int start = repeater.getCurrentPage() * repeater.getPageSize();
int end = start + repeater.getPageSize() + 1;
paginationClause = "[position() > " + start + " and position() < " + end + "]";
return paginationClause;
}
-
+
private boolean isIdentityInUpdatedRows(List identity) {
return this.updatedRows.containsKey(identity);
}
-
+
public int getMaxPage() {
return this.maxPage;
}
-
+
private class RowStore {
private HashMap values;
- private boolean deleted;
-
+
public RowStore(RepeaterRow repeaterRow) {
this.values = new HashMap();
this.storeRow(repeaterRow);
}
-
+
private void recallRow(RepeaterRow repeaterRow) {
Iterator iterator = values.keySet().iterator();
while (iterator.hasNext()) {
@@ -547,7 +546,7 @@
repeaterRow.lookupWidget(key).setValue(values.get(key));
}
}
-
+
private void storeRow(RepeaterRow repeaterRow) {
Iterator iterator = repeaterRow.getChildren();
while (iterator.hasNext()) {
@@ -555,9 +554,9 @@
values.put(widget.getName(),widget.getValue());
}
}
-
+
}
}
-
+
}
Modified: cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBindingBuilder.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBindingBuilder.java?rev=439574&r1=439573&r2=439574&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBindingBuilder.java (original)
+++ cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBindingBuilder.java Sat Sep 2 04:26:15 2006
@@ -1,12 +1,12 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -53,7 +53,7 @@
* @version $Id$
*/
public class RepeaterJXPathBindingBuilder extends JXPathBindingBuilderBase {
-
+
/**
* Creates an instance of {@link RepeaterJXPathBinding} according to the
* attributes and nested comfiguration elements of the bindingElm.
@@ -63,133 +63,121 @@
* @return JXPathBindingBase
*/
public JXPathBindingBase buildBinding(Element bindingElm,
- JXPathBindingManager.Assistant assistant) throws BindingException {
-
+ JXPathBindingManager.Assistant assistant)
+ throws BindingException {
+
if (bindingElm.hasAttribute("unique-row-id")) {
throw new BindingException("Attribute 'unique-row-id' is no more supported, use <fb:identity> instead",
- LocationAttributes.getLocation(bindingElm));
+ LocationAttributes.getLocation(bindingElm));
}
if (bindingElm.hasAttribute("unique-path")) {
throw new BindingException("Attribute 'unique-path' is no more supported, use <fb:identity> instead",
- LocationAttributes.getLocation(bindingElm));
+ LocationAttributes.getLocation(bindingElm));
}
try {
CommonAttributes commonAtts =
JXPathBindingBuilderBase.getCommonAttributes(bindingElm);
- String repeaterId = DomHelper.getAttribute(bindingElm, "id", null);
+ String repeaterId =
+ DomHelper.getAttribute(bindingElm, "id", null);
String parentPath =
- DomHelper.getAttribute(bindingElm, "parent-path", null);
- String rowPath = DomHelper.getAttribute(bindingElm, "row-path", null);
+ DomHelper.getAttribute(bindingElm, "parent-path", null);
+ String rowPath =
+ DomHelper.getAttribute(bindingElm, "row-path", null);
String rowPathForInsert =
- DomHelper.getAttribute(bindingElm, "row-path-insert", rowPath);
-
-// do inheritance
- RepeaterJXPathBinding otherBinding = (RepeaterJXPathBinding)assistant.getContext().getSuperBinding();
+ DomHelper.getAttribute(bindingElm, "row-path-insert", rowPath);
+
+ // retrieve inherited bindings
JXPathBindingBase[] existingOnBind = null;
JXPathBindingBase[] existingOnDelete = null;
JXPathBindingBase[] existingOnInsert = null;
JXPathBindingBase[] existingIdentity = null;
- if(otherBinding!=null) {
- commonAtts = JXPathBindingBuilderBase.mergeCommonAttributes(otherBinding.getCommonAtts(),commonAtts);
-
- if(repeaterId==null)
- repeaterId = otherBinding.getId();
- if(parentPath==null)
- parentPath = otherBinding.getRepeaterPath();
- if(rowPath==null)
- rowPath = otherBinding.getRowPath();
- if(rowPathForInsert==null)
- rowPathForInsert = otherBinding.getInsertRowPath();
-
- if(otherBinding.getRowBinding() != null)
- existingOnBind = otherBinding.getRowBinding().getChildBindings();
- if(otherBinding.getDeleteRowBinding() != null)
- existingOnDelete = otherBinding.getDeleteRowBinding().getChildBindings();
- if(otherBinding.getIdentityBinding() != null)
- existingIdentity = otherBinding.getIdentityBinding().getChildBindings();
- if(otherBinding.getInsertRowBinding() != null)
- existingOnInsert = new JXPathBindingBase[] { otherBinding.getInsertRowBinding() };
+
+ RepeaterJXPathBinding otherBinding = (RepeaterJXPathBinding)assistant.getContext().getSuperBinding();
+ if (otherBinding != null) {
+ commonAtts = JXPathBindingBuilderBase.mergeCommonAttributes(otherBinding.getCommonAtts(), commonAtts);
+
+ if (repeaterId == null)
+ repeaterId = otherBinding.getId();
+ if (parentPath == null)
+ parentPath = otherBinding.getRepeaterPath();
+ if (rowPath == null)
+ rowPath = otherBinding.getRowPath();
+ if (rowPathForInsert == null)
+ rowPathForInsert = otherBinding.getInsertRowPath();
+
+ if (otherBinding.getRowBinding() != null)
+ existingOnBind = otherBinding.getRowBinding().getChildBindings();
+ if (otherBinding.getDeleteRowBinding() != null)
+ existingOnDelete = otherBinding.getDeleteRowBinding().getChildBindings();
+ if (otherBinding.getIdentityBinding() != null)
+ existingIdentity = otherBinding.getIdentityBinding().getChildBindings();
+ if (otherBinding.getInsertRowBinding() != null)
+ existingOnInsert = new JXPathBindingBase[]{otherBinding.getInsertRowBinding()};
}
- // Simple mode will be used if no fb:identity, fb:on-bind, fb:on-delete-row, fb:on-insert-row exists.
- // in that case, the children of fb:repeater will be used as child bindings
+ // Simple mode will be used if no fb:identity, fb:on-bind, fb:on-delete-row,
+ // or fb:on-insert-row exists in this or inherited binding definitions.
+ // In that case, the children of fb:repeater will be used as child bindings.
boolean simpleMode = true;
+
Element childWrapElement =
- DomHelper.getChildElement(bindingElm, BindingManager.NAMESPACE, "on-bind");
-
- if (childWrapElement != null) simpleMode = false;
-
+ DomHelper.getChildElement(bindingElm, BindingManager.NAMESPACE, "on-bind");
JXPathBindingBase[] childBindings =
- assistant.makeChildBindings(childWrapElement,existingOnBind);
- if(childBindings == null)
- childBindings = existingOnBind;
-
- Element deleteWrapElement = DomHelper.getChildElement(bindingElm,
- BindingManager.NAMESPACE, "on-delete-row");
-
- if (deleteWrapElement != null) simpleMode = false;
+ assistant.makeChildBindings(childWrapElement, existingOnBind);
+ if (childWrapElement != null) {
+ // Not checking existingOnBind!=null here because parent can be in 'simpleMode'.
+ simpleMode = false;
+ }
JXPathBindingBase[] deleteBindings = null;
- if (deleteWrapElement != null) {
+ Element deleteWrapElement =
+ DomHelper.getChildElement(bindingElm, BindingManager.NAMESPACE, "on-delete-row");
+ if (deleteWrapElement != null || existingOnDelete != null) {
deleteBindings =
assistant.makeChildBindings(deleteWrapElement,existingOnDelete);
- if(deleteBindings == null)
- deleteBindings = existingOnDelete;
+ simpleMode = false;
}
- Element insertWrapElement = DomHelper.getChildElement(bindingElm,
- BindingManager.NAMESPACE, "on-insert-row");
-
- if (insertWrapElement != null) simpleMode = false;
-
JXPathBindingBase insertBinding = null;
- if (insertWrapElement != null) {
+ Element insertWrapElement =
+ DomHelper.getChildElement(bindingElm, BindingManager.NAMESPACE, "on-insert-row");
+ if (insertWrapElement != null || existingOnInsert != null) {
insertBinding =
- assistant.makeChildBindings(insertWrapElement,existingOnInsert)[0];
- // TODO: we now safely take only the first element here,
- // but we should in fact send out a warning to the log
- // if more were available!
- if(insertBinding == null && existingOnInsert != null)
- insertBinding = existingOnInsert[0];
+ assistant.makeChildBindings(insertWrapElement, existingOnInsert)[0];
+ simpleMode = false;
}
- Element identityWrapElement = DomHelper.getChildElement(bindingElm,
- BindingManager.NAMESPACE, "identity");
-
- if (identityWrapElement != null) simpleMode = false;
-
JXPathBindingBase[] identityBinding = null;
- if (identityWrapElement != null) {
+ Element identityWrapElement =
+ DomHelper.getChildElement(bindingElm, BindingManager.NAMESPACE, "identity");
+ if (identityWrapElement != null || existingIdentity != null) {
// TODO: we can only handle ValueJXPathBinding at the moment:
// http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=107906438632484&w=4
identityBinding =
- assistant.makeChildBindings(identityWrapElement,existingIdentity);
- if (identityBinding != null) {
- for (int i = 0; i < identityBinding.length;i++) {
- if (!(identityBinding[i] instanceof ValueJXPathBinding)) {
- throw new BindingException("Error building repeater binding defined at " +
- DomHelper.getLocation(bindingElm) + ": Only value binding (i.e. fb:value) " +
- "can be used inside fb:identity at the moment. You can read " +
- "http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=107906438632484&w=4" +
- " if you want to know more on this.");
- }
+ assistant.makeChildBindings(identityWrapElement, existingIdentity);
+ for (int i = 0; i < identityBinding.length;i++) {
+ if (!(identityBinding[i] instanceof ValueJXPathBinding)) {
+ throw new BindingException("Error building repeater binding defined at " +
+ DomHelper.getLocation(bindingElm) + ": Only value binding (i.e. fb:value) " +
+ "can be used inside fb:identity at the moment. You can read " +
+ "http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=107906438632484&w=4" +
+ " if you want to know more on this.");
}
- } else {
- identityBinding = existingIdentity;
}
+ simpleMode = false;
}
-
+
if (simpleMode) {
// Use the children of the current element
- childBindings = assistant.makeChildBindings(bindingElm,existingOnBind);
+ childBindings = assistant.makeChildBindings(bindingElm, existingOnBind);
}
RepeaterJXPathBinding repeaterBinding =
new RepeaterJXPathBinding(commonAtts, repeaterId, parentPath,
- rowPath, rowPathForInsert,
+ rowPath, rowPathForInsert,
childBindings, insertBinding, deleteBindings, identityBinding);
return repeaterBinding;
} catch (BindingException e) {
Re: svn commit: r439574 - in /cocoon: branches/BRANCH_2_1_X/ trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/
Posted by Vadim Gritsenko <va...@reverycodes.com>.
Jean-Baptiste Quenot wrote:
> * vgritsenko@apache.org:
>> Author: vgritsenko
>> Date: Sat Sep 2 04:26:15 2006
>> New Revision: 439574
>>
>> <action dev="VG" type="fix">
>> CForms: Repeater identity binding was failing on save if widget path was
>> given.
>> </action>
>>
>
> Hi Vadim,
>
> If that fixes the problems with <fb:identity>, that's great!
> During Cocoon trainings I was often asked why <fb:identity> didn't
> work as advertised. This is good news for our users then.
This commit fixes an exception which was happening when you use widget path:
<fb:identity>
<fb:value id="path/to/widget" path="widget"/>
It might your problems, or it might not - I don't know.
Vadim
Re: svn commit: r439574 - in /cocoon: branches/BRANCH_2_1_X/ trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/
Posted by Jean-Baptiste Quenot <jb...@apache.org>.
* vgritsenko@apache.org:
> Author: vgritsenko
> Date: Sat Sep 2 04:26:15 2006
> New Revision: 439574
>
> URL: http://svn.apache.org/viewvc?rev=439574&view=rev
> Log:
> <action dev="VG" type="fix">
> CForms: Repeater identity binding was failing on save if widget path was
> given.
> </action>
> <action dev="VG" type="fix">
> CForms: Inherit fb:on-delete-row, fb:on-insert-row, fb:identity repeater
> bindings from the parent. Fix detection of 'simple' mode.
> </action>
>
>
> Modified:
> cocoon/branches/BRANCH_2_1_X/status.xml
> cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBinding.java
> cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/binding/RepeaterJXPathBindingBuilder.java
Hi Vadim,
If that fixes the problems with <fb:identity>, that's great!
During Cocoon trainings I was often asked why <fb:identity> didn't
work as advertised. This is good news for our users then.
Thanks again!
--
Jean-Baptiste Quenot
aka John Banana Qwerty
http://caraldi.com/jbq/