cocoon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From anto...@apache.org
Subject svn commit: r159461 - cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java
Date Wed, 30 Mar 2005 03:49:21 GMT
Author: antonio
Date: Tue Mar 29 19:49:20 2005
New Revision: 159461

URL: http://svn.apache.org/viewcvs?view=rev&rev=159461
Log:
Allow <fb:javascript direction="save"> interact with fields of a bean even when them
were not initialized and still has null value.

Modified:
    cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java?view=diff&r1=159460&r2=159461
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java
(original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/binding/JXPathBindingBase.java
Tue Mar 29 19:49:20 2005
@@ -26,6 +26,8 @@
 import org.apache.cocoon.util.jxpath.DOMFactory;
 import org.apache.commons.jxpath.JXPathContext;
 import org.apache.commons.jxpath.Pointer;
+import org.apache.commons.jxpath.ri.model.beans.BeanPropertyPointer;
+import org.apache.commons.jxpath.util.TypeUtils;
 
 /**
  * Provides a base class for hooking up Binding implementations that use the
@@ -273,6 +275,9 @@
         public boolean createObject(JXPathContext context, Pointer pointer, Object parent,
String name, int index) {
             if (createCollectionItem(context, pointer, parent, name, index)) {
                 return true;
+            // AG: If this is a bean, then the object is supposed to exists.  
+            } else if (pointer instanceof BeanPropertyPointer) {
+                return createBeanField(context, pointer, parent, name, index);
             } else {
                 return super.createObject(context, pointer, parent, name, index);
             }
@@ -284,7 +289,7 @@
             final Object o = context.getValue(name);
             if (o == null) {
                 return false;
-            }
+            } 
             if (o instanceof Collection) {
                 ((Collection)o).add(null);
             } else if(o.getClass().isArray()) {
@@ -294,6 +299,43 @@
                 return false;
             }
             return true;
+        }
+
+        // AG: Create the Object for the field as defined in the Bean.
+        // The value we will set here is not important. JXPath knows that it is UNITIALIZED.
+        // if we set it Pointer Value to null then the code will throw an exception.
+        //
+        // In short, there is no harm. The value will never show up.
+        // TODO: Manage other forms' types as Date, Bean and others not covered by this method.
+        private boolean createBeanField(JXPathContext context, Pointer pointer, Object parent,
String name, int index) {
+            try {
+                Class clazz = parent.getClass().getDeclaredField(name).getType();
+                Object o = context.getValue(name);
+                if (o == null) {
+                    final Class[] parametersTypes = {String.class};
+                    final Object[] initArgs = {"0"};
+                    try {
+                        // AG: Here we service Booleans, Strings and Number() + his Direct
know subclasses:
+                        // (BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short)
+                        // as well as other classes that use an String as Constructor parameter.
+                        o = clazz.getConstructor(parametersTypes).newInstance(initArgs);
+                    } catch (Exception e) {
+                        // AG: The class has not a constructor using a String as a parameter.
+                        // ie: Boolean(String), Integer(String), etc.
+                        // Lets try with a constructor with no parameters. ie: Number().
+                        o = clazz.newInstance();
+                    }
+                } else if (TypeUtils.canConvert(o, clazz)) {
+                    o = TypeUtils.convert(o, clazz);
+                }
+                if (o != null) {
+                    pointer.setValue(o);
+                    return true;  // OK. We have an initial Object of the right Class initialized.
+                }
+            } catch (Exception e) {
+                // TODO: Output info in logs.
+            }
+            return false;
         }
     }
 }



Mime
View raw message