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]

Reply via email to