Author: simoneg
Date: Wed Jan 4 18:53:52 2012
New Revision: 1227264
URL: http://svn.apache.org/viewvc?rev=1227264&view=rev
Log:
Changed binding of sub-beans to avoid creating empty and useless sub-beans,
even in case they have required properties, if they are not marked as required
in the parent bean
Added:
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/Address.java
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddress.java
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddressReq.java
Modified:
labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartForm.java
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/SmartFormBindingTest.java
Modified:
labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartForm.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartForm.java?rev=1227264&r1=1227263&r2=1227264&view=diff
==============================================================================
---
labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartForm.java
(original)
+++
labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartForm.java
Wed Jan 4 18:53:52 2012
@@ -28,6 +28,7 @@ import org.apache.magma.conversion.Conve
import org.apache.magma.lateconfig.LateConfigurable;
import org.apache.magma.lateconfig.LateConfigurationTrigger;
import org.apache.magma.validation.ValidationError;
+import org.apache.magma.view.tree.ContainerProperty;
import org.apache.magma.view.tree.FieldNode;
import org.apache.magma.view.tree.Node;
import org.apache.magma.view.tree.ViewUtils;
@@ -214,17 +215,53 @@ public class SmartForm extends WebHandle
handlers = new HashMap<MagmaBeanSupport, BeanHandler>();
Node root = bean.beanData().getViewTree(this.layers);
Set<Node> allNodes = root.getAllNodes();
+
+ // Bind all nodes
for (Node node : allNodes) {
if (node instanceof FieldNode) {
MagmaBeanSupport properBean =
ViewUtils.findProperBean((FieldNode) node, bean, true);
BeanHandler h = handlers.get(properBean);
if (h == null) {
h = properBean.handler();
+ }
+ if (bind(h, node)) {
handlers.put(properBean, h);
}
- bind(h, node);
}
}
+
+ // Clean up sub-beans for which we have not bound any property
+ for (Node node : allNodes) {
+ if (node instanceof FieldNode) {
+ FieldNode cpnode = (FieldNode) node;
+ MagmaBeanSupport acbean = null;
+ BeanHandler handler = null;
+ PropertyInfo prop = null;
+ if (cpnode.getLogicalPropertyParents() != null)
{
+ acbean = bean;
+ for (PropertyInfo acprop :
cpnode.getLogicalPropertyParents()) {
+ handler = acbean.handler();
+ prop = acprop;
+ Object acobj =
handler.getValue(acprop.getName());
+ if (acobj == null) {
+ acbean = null;
+ break;
+ }
+ if (!(acobj instanceof
MagmaBeanSupport)) throw new MagmaException("The bean {0} obtained with
property {1}.{2} is not a magma bean!", acobj.getClass().getName(),
acprop.getName(), acbean.getClass().getName());
+ acbean = (MagmaBeanSupport)
acobj;
+ }
+ }
+ if (acbean == null) continue;
+ if (!handlers.containsKey(acbean)) {
+ if (prop.getValidator() == null ||
prop.getValidator().acceptsNulls(null)) {
+
handler.setValue(prop.getName(), null);
+ } else {
+ handlers.put(acbean,
acbean.handler());
+ }
+ }
+ }
+ }
+
for (int i = 0; i < actions.size(); i++) {
if (binding.get("__action_" + i) != null) {
return actions.get(i);
@@ -233,7 +270,8 @@ public class SmartForm extends WebHandle
return defaultAction;
}
- protected void bind(BeanHandler h, Node node) {
+ protected boolean bind(BeanHandler h, Node node) {
+ boolean atlo = false;
String val = binding.get(node.getId());
PropertyInfo property = ((FieldNode)node).getProperty();
if (property.isWriteable()) {
@@ -242,15 +280,18 @@ public class SmartForm extends WebHandle
if (piece instanceof ParsingHtmlFormPiece) {
Object preval = h.getValue(name);
Object nval =
((ParsingHtmlFormPiece)piece).parse(binding, node.getId(), preval);
+ atlo |= nval != null;
h.setValue(name, nval);
} else {
if (val == null) {
h.setStringValue(name, null);
} else {
+ atlo = true;
h.setFormattedStringValue(name, val);
}
}
}
+ return atlo;
}
void checkValidity() {
@@ -259,7 +300,6 @@ public class SmartForm extends WebHandle
for (BeanHandler handler : handlers.values()) {
try {
handler.validate(this.validationLayers);
- handler.commit();
} catch (ValidationError ve) {
List<LocalizableString> messages =
ve.getMessages();
fillErrors(messages);
@@ -268,6 +308,12 @@ public class SmartForm extends WebHandle
fillErrors(messages);
}
}
+
+ if (errors.size() == 0) {
+ for (BeanHandler handler : handlers.values()) {
+ handler.commit();
+ }
+ }
}
private void fillErrors(List<LocalizableString> messages) {
Modified:
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/SmartFormBindingTest.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/SmartFormBindingTest.java?rev=1227264&r1=1227263&r2=1227264&view=diff
==============================================================================
---
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/SmartFormBindingTest.java
(original)
+++
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/SmartFormBindingTest.java
Wed Jan 4 18:53:52 2012
@@ -21,9 +21,12 @@ import java.util.List;
import java.util.Map;
import org.apache.magma.basics.LocalizableStringWithSubject;
+import org.apache.magma.beans.PropertyInfo;
import org.apache.magma.website.beansview.stuff.Person;
import org.apache.magma.website.beansview.stuff.Person2;
import org.apache.magma.website.beansview.stuff.Person4;
+import org.apache.magma.website.beansview.stuff.PersonWithAddress;
+import org.apache.magma.website.beansview.stuff.PersonWithAddressReq;
import org.hamcrest.core.IsNull;
import org.junit.Test;
@@ -129,4 +132,97 @@ public class SmartFormBindingTest {
}
}
+ @Test
+ public void bindOnSubBeanNotRequiredNoError() throws Exception {
+ PersonWithAddress p = new PersonWithAddress();
+ Map<String, String> binding = new HashMap<String, String>();
+ binding.put("name", "Simone");
+ binding.put("surname", "Gianni");
+
+ SmartForm sf = new SmartForm(p, null);
+ sf.binding = binding;
+ sf.executeBinding();
+ sf.checkValidity();
+
+ List<LocalizableStringWithSubject> errors = sf.errors;
+ assertNotNull(errors);
+ assertThat(errors.size(), equalTo(0));
+
+ assertThat(p.getName(), equalTo("Simone"));
+ assertThat(p.getSurname(), equalTo("Gianni"));
+ assertThat(p.getAddress(), equalTo(null));
+
+ }
+
+ @Test
+ public void bindOnSubBeanRequiredError() throws Exception {
+ PersonWithAddressReq p = new PersonWithAddressReq();
+ Map<String, String> binding = new HashMap<String, String>();
+ binding.put("name", "Simone");
+ binding.put("surname", "Gianni");
+
+ SmartForm sf = new SmartForm(p, null);
+ sf.binding = binding;
+ sf.executeBinding();
+ sf.checkValidity();
+
+ List<LocalizableStringWithSubject> errors = sf.errors;
+ assertNotNull(errors);
+ assertThat(errors.size(), equalTo(1));
+
+ LocalizableStringWithSubject err = errors.get(0);
+ assertThat(((PropertyInfo)err.getSubject()).getName(),
equalTo("cityName"));
+
+ assertThat(p.getName(), equalTo(null));
+ assertThat(p.getSurname(), equalTo(null));
+ assertThat(p.getAddress(), equalTo(null));
+ }
+
+
+ @Test
+ public void bindOnSubBeanRequiredPass() throws Exception {
+ PersonWithAddressReq p = new PersonWithAddressReq();
+ Map<String, String> binding = new HashMap<String, String>();
+ binding.put("name", "Simone");
+ binding.put("surname", "Gianni");
+ binding.put("address-cityName","Rome");
+
+ SmartForm sf = new SmartForm(p, null);
+ sf.binding = binding;
+ sf.executeBinding();
+ sf.checkValidity();
+
+ assertThat(p.getName(), equalTo("Simone"));
+ assertThat(p.getSurname(), equalTo("Gianni"));
+ assertThat(p.getAddress(), notNullValue());
+ assertThat(p.getAddress().getCityName(), equalTo("Rome"));
+
+ List<LocalizableStringWithSubject> errors = sf.errors;
+ assertNotNull(errors);
+ assertThat(errors.size(), equalTo(0));
+ }
+
+ @Test
+ public void bindOnSubBeanNotRequiredPass() throws Exception {
+ PersonWithAddressReq p = new PersonWithAddressReq();
+ Map<String, String> binding = new HashMap<String, String>();
+ binding.put("name", "Simone");
+ binding.put("surname", "Gianni");
+ binding.put("address-cityName","Rome");
+
+ SmartForm sf = new SmartForm(p, null);
+ sf.binding = binding;
+ sf.executeBinding();
+ sf.checkValidity();
+
+ assertThat(p.getName(), equalTo("Simone"));
+ assertThat(p.getSurname(), equalTo("Gianni"));
+ assertThat(p.getAddress(), notNullValue());
+ assertThat(p.getAddress().getCityName(), equalTo("Rome"));
+
+ List<LocalizableStringWithSubject> errors = sf.errors;
+ assertNotNull(errors);
+ assertThat(errors.size(), equalTo(0));
+ }
+
}
Added:
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/Address.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/Address.java?rev=1227264&view=auto
==============================================================================
---
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/Address.java
(added)
+++
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/Address.java
Wed Jan 4 18:53:52 2012
@@ -0,0 +1,32 @@
+package org.apache.magma.website.beansview.stuff;
+
+import org.apache.magma.beans.MagmaBean;
+import org.apache.magma.validation.validators.Required;
+import org.apache.magma.view.MagView;
+
+@MagmaBean
+public class Address {
+
+ private String cityName;
+
+ private String streetName;
+
+
+ @Required
+ @MagView(order=1)
+ public String getCityName() {
+ return cityName;
+ }
+ public void setCityName(String cityName) {
+ this.cityName = cityName;
+ }
+
+ @MagView(order=2)
+ public String getStreetName() {
+ return streetName;
+ }
+ public void setStreetName(String streetName) {
+ this.streetName = streetName;
+ }
+
+}
Added:
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddress.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddress.java?rev=1227264&view=auto
==============================================================================
---
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddress.java
(added)
+++
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddress.java
Wed Jan 4 18:53:52 2012
@@ -0,0 +1,39 @@
+package org.apache.magma.website.beansview.stuff;
+
+import org.apache.magma.beans.MagmaBean;
+import org.apache.magma.validation.validators.Required;
+import org.apache.magma.view.MagView;
+
+@MagmaBean
+public class PersonWithAddress {
+
+ private String name;
+ private String surname;
+ private Address address;
+
+ @Required
+ @MagView(order=1)
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @MagView(order=2)
+ public String getSurname() {
+ return surname;
+ }
+ public void setSurname(String surname) {
+ this.surname = surname;
+ }
+
+ @MagView(order=3,expanded=true)
+ public Address getAddress() {
+ return address;
+ }
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+}
Added:
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddressReq.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddressReq.java?rev=1227264&view=auto
==============================================================================
---
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddressReq.java
(added)
+++
labs/magma/trunk/website-beansview/src/test/java/org/apache/magma/website/beansview/stuff/PersonWithAddressReq.java
Wed Jan 4 18:53:52 2012
@@ -0,0 +1,40 @@
+package org.apache.magma.website.beansview.stuff;
+
+import org.apache.magma.beans.MagmaBean;
+import org.apache.magma.validation.validators.Required;
+import org.apache.magma.view.MagView;
+
+@MagmaBean
+public class PersonWithAddressReq {
+
+ private String name;
+ private String surname;
+ private Address address;
+
+ @Required
+ @MagView(order=1)
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @MagView(order=2)
+ public String getSurname() {
+ return surname;
+ }
+ public void setSurname(String surname) {
+ this.surname = surname;
+ }
+
+ @MagView(order=3,expanded=true)
+ @Required
+ public Address getAddress() {
+ return address;
+ }
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]