craigmcc    2002/06/29 18:49:21

  Modified:    .        build-tests.xml
               src/share/org/apache/struts/config FormPropertyConfig.java
               src/test/org/apache/struts/action TestDynaActionForm.java
                        TestDynaActionFormClass.java
  Log:
  It is now possible to initialize the value of an indexed property in a
  DynaActionForm bean, with syntax like this:
  
    <form-property name="intArray" type="int[]"
                initial="{ 0, 1, 2, 3}"/>
  
    <form-property name="doubleArray" type="double[]"
                initial="0.1 2.3 4.5"/>
  
    <form-property name="stringArray", type="java.lang.String[]",
                initial="'String 0', 'String 1', 'String 2'"/>
  
  if you are using a version of commons-beanutils >= the 20020630 nightly build
  (or any upcoming 1.4 release).  In addition, you can register your own
  String->ArrayType converters in ConvertUtils for arrays of non-primitive
  types, and parse the initial value string any way you like.
  
  The syntax for primitive and String indexed initialization was designed to be
  similar to that a Java developer uses to initialize arrays directly:
  
    int intArray[] = new int[] { 0, 1, 2, 3};
  
  with the following adjustments:
  
  * Only literal values are accepted -- no expression evaluation the way
    a compiler would do it.
  
  * Beginning and ending "{" and "}" are optional -- you need both or neither.
  
  * Commas in between elements are considered whitespace, so they are
    optional as well.
  
  * You can use either single quotes or double quotes around strings, and
    embed the opposite type inside the String.  (Commas can, of course,
    be embedded as well.
  
  When the reset() method of a DynaActionFormBean is called (including when it
  is created initially for you), the default functionality is to initialize
  all form bean properties to the initial values again.  You can override this
  in your own DynaActionForm subclass if need something extra.
  
  Revision  Changes    Path
  1.7       +1 -0      jakarta-struts/build-tests.xml
  
  Index: build-tests.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/build-tests.xml,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- build-tests.xml   29 Jun 2002 00:44:34 -0000      1.6
  +++ build-tests.xml   30 Jun 2002 01:49:21 -0000      1.7
  @@ -98,6 +98,7 @@
         <pathelement location="${cactus.jar}"/>
         <pathelement location="${junit.jar}"/>
         <pathelement location="${servlet.jar}"/>
  +      <pathelement location="${struts.jar}"/>
       </path>
   
   <!-- ========== Executable Targets ======================================== -->
  
  
  
  1.6       +22 -28    
jakarta-struts/src/share/org/apache/struts/config/FormPropertyConfig.java
  
  Index: FormPropertyConfig.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/FormPropertyConfig.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FormPropertyConfig.java   29 Jun 2002 00:44:34 -0000      1.5
  +++ FormPropertyConfig.java   30 Jun 2002 01:49:21 -0000      1.6
  @@ -253,38 +253,32 @@
        */
       public Object initial() {
   
  +        // Compute our initial value the first time it is requested
           // Don't bother synchronizing, a race is basically harmless
           if (!initialized) {
               try {
  -                if (initial == null) {
  -                    if ("boolean".equals(type)) {
  -                        initialValue = Boolean.FALSE;
  -                    } else if ("byte".equals(type)) {
  -                        initialValue = new Byte((byte) 0);
  -                    } else if ("char".equals(type)) {
  -                        initialValue = new Character((char) 0);
  -                    } else if ("double".equals(type)) {
  -                        initialValue = new Double((double) 0.0);
  -                    } else if ("float".equals(type)) {
  -                        initialValue = new Float((float) 0.0);
  -                    } else if ("int".equals(type)) {
  -                        initialValue = new Integer(0);
  -                    } else if ("long".equals(type)) {
  -                        initialValue = new Long((long) 0);
  -                    } else if ("short".equals(type)) {
  -                        initialValue = new Short((short) 0);
  -                    } else {
  -                        initialValue = null;
  -                    }
  -                } else {
  -                    Class clazz = getTypeClass();
  -                    initialValue = ConvertUtils.convert(initial, clazz);
  -                }
  +                Class clazz = getTypeClass();
  +                initialValue = ConvertUtils.convert(initial, clazz);
               } catch (Throwable t) {
                   initialValue = null;
               }
               initialized = true;
           }
  +
  +        // Clone if the initial value is an array
  +        if ((initialValue != null) &&
  +            (initialValue.getClass().isArray())) {
  +            int n = Array.getLength(initialValue);
  +            Class componentType =
  +                initialValue.getClass().getComponentType();
  +            Object newValue = Array.newInstance(componentType, n);
  +            for (int j = 0; j < n; j++) {
  +                Array.set(newValue, j, Array.get(initialValue, j));
  +            }
  +            return (newValue);
  +        }
  +
  +        // Return the calculated value
           return (initialValue);
   
       }
  
  
  
  1.4       +138 -32   
jakarta-struts/src/test/org/apache/struts/action/TestDynaActionForm.java
  
  Index: TestDynaActionForm.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/test/org/apache/struts/action/TestDynaActionForm.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestDynaActionForm.java   29 Jun 2002 05:50:25 -0000      1.3
  +++ TestDynaActionForm.java   30 Jun 2002 01:49:21 -0000      1.4
  @@ -63,6 +63,9 @@
   import junit.framework.*;
   import org.apache.cactus.*;
   import org.apache.commons.beanutils.DynaProperty;
  +import org.apache.struts.action.ActionMapping;
  +import org.apache.struts.config.ApplicationConfig;
  +import org.apache.struts.config.FormBeanConfig;
   
   
   /**
  @@ -110,12 +113,24 @@
   
   
       /**
  +     * Dummy ApplicationConfig for calls to reset() and validate().
  +     */
  +    protected ApplicationConfig appConfig = null;
  +
  +
  +    /**
        * The basic <code>DynaActionForm</code> to use for testing.
        */
       protected DynaActionForm dynaForm = null;
   
   
       /**
  +     * Dummy ActionMapping for calls to reset() and validate().
  +     */
  +    protected ActionMapping mapping = null;
  +
  +
  +    /**
        * The set of property names we expect to have returned when calling
        * <code>getDynaProperties()</code>.  You should update this list
        * when new properties are added to TestBean.
  @@ -153,33 +168,10 @@
           } catch (InstantiationException e) {
               throw new RuntimeException(e.getMessage());
           }
  +        setupComplexProperties();
  +        appConfig = new TestDynaActionFormConfig(beanConfig);
  +        mapping = new TestDynaActionFormMapping(appConfig);
   
  -        // Temporarily, set up the complex properties manually
  -        int intArray[] = { 0, 10, 20, 30, 40 };
  -        dynaForm.set("intArray", intArray);
  -        int intIndexed[] = { 0, 10, 20, 30, 40 };
  -        dynaForm.set("intIndexed", intIndexed);
  -        List listIndexed = new ArrayList();
  -        listIndexed.add("String 0");
  -        listIndexed.add("String 1");
  -        listIndexed.add("String 2");
  -        listIndexed.add("String 3");
  -        listIndexed.add("String 4");
  -        dynaForm.set("listIndexed", listIndexed);
  -        Map mappedProperty = new HashMap();
  -        mappedProperty.put("First Key", "First Value");
  -        mappedProperty.put("Second Key", "Second Value");
  -        dynaForm.set("mappedProperty", mappedProperty);
  -        Map mappedIntProperty = new HashMap();
  -        mappedIntProperty.put("One", new Integer(1));
  -        mappedIntProperty.put("Two", new Integer(2));
  -        dynaForm.set("mappedIntProperty", mappedIntProperty);
  -        String stringArray[] =
  -                { "String 0", "String 1", "String 2", "String 3", "String 4" };
  -        dynaForm.set("stringArray", stringArray);
  -        String stringIndexed[] =
  -                { "String 0", "String 1", "String 2", "String 3", "String 4" };
  -        dynaForm.set("stringIndexed", stringIndexed);
   
       }
   
  @@ -187,8 +179,9 @@
       public void tearDown() {
   
           super.tearDown();
  +        appConfig = null;
           dynaForm = null;
  -        
  +        mapping = null;
   
       }
   
  @@ -207,8 +200,8 @@
                        (Double) dynaForm.get("doubleProperty"));
           assertEquals("floatProperty", new Float((float) 123.0),
                        (Float) dynaForm.get("floatProperty"));
  -        // FIXME - intArray
  -        // FIXME - intIndexed
  +        assertEquals("intProperty", new Integer(123),
  +                     (Integer) dynaForm.get("intProperty"));
           // FIXME - listIndexed
           assertEquals("longProperty", new Long((long) 321),
                        (Long) dynaForm.get("longProperty"));
  @@ -218,14 +211,64 @@
                        (String) dynaForm.get("nullProperty"));
           assertEquals("shortProperty", new Short((short) 987),
                        (Short) dynaForm.get("shortProperty"));
  -        // FIXME - stringArray
  -        // FIXME - stringIndexed
           assertEquals("stringProperty", "This is a string",
                        (String) dynaForm.get("stringProperty"));
   
       }
   
   
  +    // Test reset() method on indexed values to ensure that the
  +    // result returned by FormPropertyConfig().initial() is never clobbered
  +    public void testIndexedReset() {
  +
  +        // Update some values in the indexed properties
  +        dynaForm.set("intArray", 1, new Integer(111));
  +        assertEquals("intArray[1]", new Integer(111),
  +                     (Integer) dynaForm.get("intArray", 1));
  +        dynaForm.set("intIndexed", 2, new Integer(222));
  +        assertEquals("intIndexed[2]", new Integer(222),
  +                     (Integer) dynaForm.get("intIndexed", 2));
  +        dynaForm.set("stringArray", 3, "New String 3");
  +        assertEquals("stringArray[3]", "New String 3",
  +                     (String) dynaForm.get("stringArray", 3));
  +        dynaForm.set("stringIndexed", 4, "New String 4");
  +        assertEquals("stringIndexed[4]", "New String 4",
  +                     (String) dynaForm.get("stringIndexed", 4));
  +
  +        // Perform reset and revalidate the original values
  +        // while ensuring our initial values did not get corrupted
  +        dynaForm.reset(mapping, (ServletRequest) null);
  +        setupComplexProperties();
  +        testGetIndexedValues();
  +
  +    }
  +
  +
  +    // Test reset() method going back to initial values
  +    public void testScalarReset() {
  +
  +        // Update a bunch of scalar properties to new values
  +        dynaForm.set("booleanProperty", Boolean.FALSE);
  +        assertEquals("booleanProperty", Boolean.FALSE,
  +                     (Boolean) dynaForm.get("booleanProperty"));
  +        dynaForm.set("booleanSecond", Boolean.FALSE);
  +        dynaForm.set("doubleProperty", new Double(654.0));
  +        dynaForm.set("floatProperty", new Float((float) 543.0));
  +        dynaForm.set("intProperty", new Integer(555));
  +        dynaForm.set("longProperty", new Long((long) 777));
  +        dynaForm.set("shortProperty", new Short((short) 222));
  +        dynaForm.set("stringProperty", "New String Value");
  +        assertEquals("stringProperty", "New String Value",
  +                     (String) dynaForm.get("stringProperty"));
  +
  +        // Reset and revalidate the original values
  +        dynaForm.reset(mapping, (ServletRequest) null);
  +        setupComplexProperties();
  +        testBeanCreate();
  +
  +    }
  +
  +
       // --------------------------------------- Tests from BasicDynaBeanTestCase
   
   
  @@ -405,7 +448,7 @@
                   assertNotNull("intIndexed returned value " + i, value);
                   assertTrue("intIndexed returned Integer " + i,
                           value instanceof Integer);
  -                assertEquals("intIndexed returned correct " + i, i * 10,
  +                assertEquals("intIndexed returned correct " + i, i * 100,
                           ((Integer) value).intValue());
               } catch (Throwable t) {
                   fail("intIndexed " + i + " threw " + t);
  @@ -962,6 +1005,34 @@
   
   
       /**
  +     * Set up the complex properties that cannot be configured from the
  +     * initial value expression.
  +     */
  +    protected void setupComplexProperties() {
  +
  +        List listIndexed = new ArrayList();
  +        listIndexed.add("String 0");
  +        listIndexed.add("String 1");
  +        listIndexed.add("String 2");
  +        listIndexed.add("String 3");
  +        listIndexed.add("String 4");
  +        dynaForm.set("listIndexed", listIndexed);
  +
  +        Map mappedProperty = new HashMap();
  +        mappedProperty.put("First Key", "First Value");
  +        mappedProperty.put("Second Key", "Second Value");
  +        dynaForm.set("mappedProperty", mappedProperty);
  +
  +        Map mappedIntProperty = new HashMap();
  +        mappedIntProperty.put("One", new Integer(1));
  +        mappedIntProperty.put("Two", new Integer(2));
  +        dynaForm.set("mappedIntProperty", mappedIntProperty);
  +
  +    }
  +
  +
  +
  +    /**
        * Base for testGetDescriptorXxxxx() series of tests.
        *
        * @param name Name of the property to be retrieved
  @@ -980,5 +1051,40 @@
   
       }
   
  +
  +}
  +
  +
  +class TestDynaActionFormMapping extends ActionMapping {
  +
  +    public TestDynaActionFormMapping(ApplicationConfig appConfig) {
  +        this.appConfig = appConfig;
  +    }
  +
  +    private ApplicationConfig appConfig = null;
  +
  +    public ApplicationConfig getApplicationConfig() {
  +        return (this.appConfig);
  +    }
  +
  +    public String getName() {
  +        return ("dynaForm");
  +    }
  +
  +}
  +
  +
  +class TestDynaActionFormConfig extends ApplicationConfig {
  +
  +    public TestDynaActionFormConfig(FormBeanConfig beanConfig) {
  +        super("");
  +        this.beanConfig = beanConfig;
  +    }
  +
  +    private FormBeanConfig beanConfig = null;
  +
  +    public FormBeanConfig findFormBeanConfig(String name) {
  +        return (this.beanConfig);
  +    }
   
   }
  
  
  
  1.4       +8 -7      
jakarta-struts/src/test/org/apache/struts/action/TestDynaActionFormClass.java
  
  Index: TestDynaActionFormClass.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/test/org/apache/struts/action/TestDynaActionFormClass.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestDynaActionFormClass.java      29 Jun 2002 05:50:25 -0000      1.3
  +++ TestDynaActionFormClass.java      30 Jun 2002 01:49:21 -0000      1.4
  @@ -120,14 +120,15 @@
        * The set of <code>FormPropertyConfig</code> objects to use when
        * creating our <code>FormBeanConfig</code>.
        */
  -    // FIXME - initial values for arrays/lists/maps?
       protected static final FormPropertyConfig[] dynaProperties = {
           new FormPropertyConfig("booleanProperty", "boolean", "true"),
           new FormPropertyConfig("booleanSecond", "boolean", "true"),
           new FormPropertyConfig("doubleProperty", "double", "321.0"),
           new FormPropertyConfig("floatProperty", "float", "123.0"),
  -        new FormPropertyConfig("intArray", "int[]", null),
  -        new FormPropertyConfig("intIndexed", "int[]", null),
  +        new FormPropertyConfig("intArray", "int[]",
  +                               "{ 0, 10,20, \"30\" '40' }"),
  +        new FormPropertyConfig("intIndexed", "int[]",
  +                               " 0 100, 200, 300, 400 "),
           new FormPropertyConfig("intProperty", "int", "123"),
           new FormPropertyConfig("listIndexed", "java.util.List", null),
           new FormPropertyConfig("longProperty", "long", "321"),
  @@ -135,8 +136,10 @@
           new FormPropertyConfig("mappedIntProperty", "java.util.Map", null),
           new FormPropertyConfig("nullProperty", "java.lang.String", null),
           new FormPropertyConfig("shortProperty", "short", "987"),
  -        new FormPropertyConfig("stringArray", "java.lang.String[]", null),
  -        new FormPropertyConfig("stringIndexed", "java.lang.String[]", null),
  +        new FormPropertyConfig("stringArray", "java.lang.String[]",
  +                               "{ 'String 0', 'String 1', 'String 2', 'String 3', 
'String 4'}"),
  +        new FormPropertyConfig("stringIndexed", "java.lang.String[]",
  +                               "{ 'String 0', 'String 1', 'String 2', 'String 3', 
'String 4'}"),
           new FormPropertyConfig("stringProperty", "java.lang.String",
                                  "This is a string"),
      };
  @@ -250,8 +253,6 @@
           assertEquals("floatProperty value",
                        new Float((float) 123.0),
                        beanConfig.findFormPropertyConfig("floatProperty").initial());
  -        // FIXME - intArray
  -        // FIXME - intIndexed
           assertEquals("intProperty value",
                        new Integer(123),
                        beanConfig.findFormPropertyConfig("intProperty").initial());
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to