craigmcc    2002/12/17 22:20:41

  Modified:    beanutils/src/java/org/apache/commons/beanutils
                        BasicDynaBean.java BasicDynaClass.java
               beanutils/src/test/org/apache/commons/beanutils
                        BasicDynaBeanTestCase.java
  Log:
  Make BasicDynaBean and BasicDynaClass implement Serializable, including a
  JUnit test case method that ensures successful operation.  Based on a
  suggested patch included in the bug report (but with a slightly altered
  technique).
  
  PR: Bugzilla #15067
  Submitted by: Peter Rossbach <pr at webapp.de> and Roman Stumm
  
  Revision  Changes    Path
  1.7       +10 -5     
jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BasicDynaBean.java
  
  Index: BasicDynaBean.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BasicDynaBean.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- BasicDynaBean.java        25 Oct 2002 00:15:50 -0000      1.6
  +++ BasicDynaBean.java        18 Dec 2002 06:20:40 -0000      1.7
  @@ -63,6 +63,7 @@
   package org.apache.commons.beanutils;
   
   
  +import java.io.Serializable;
   import java.lang.reflect.Array;
   import java.util.HashMap;
   import java.util.List;
  @@ -76,11 +77,15 @@
    * <p><strong>IMPLEMENTATION NOTE</strong> - Instances of this class that are
    * accessed from multiple threads simultaneously need to be synchronized.</p>
    *
  + * <p><strong>IMPLEMENTATION NOTE</strong> - Instances of this class can be
  + * successfully serialized and deserialized <strong>ONLY</strong> if all
  + * property values are <code>Serializable</code>.</p>
  + *
    * @author Craig McClanahan
    * @version $Revision$ $Date$
    */
   
  -public class BasicDynaBean implements DynaBean {
  +public class BasicDynaBean implements DynaBean, Serializable {
   
   
       // ---------------------------------------------------------- Constructors
  
  
  
  1.7       +12 -6     
jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BasicDynaClass.java
  
  Index: BasicDynaClass.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BasicDynaClass.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- BasicDynaClass.java       23 Jan 2002 22:35:58 -0000      1.6
  +++ BasicDynaClass.java       18 Dec 2002 06:20:40 -0000      1.7
  @@ -63,6 +63,7 @@
   package org.apache.commons.beanutils;
   
   
  +import java.io.Serializable;
   import java.lang.reflect.Constructor;
   import java.lang.reflect.InvocationTargetException;
   import java.util.HashMap;
  @@ -80,7 +81,7 @@
    * @version $Revision$ $Date$
    */
   
  -public class BasicDynaClass implements DynaClass {
  +public class BasicDynaClass implements DynaClass, Serializable {
   
   
       // ----------------------------------------------------------- Constructors
  @@ -138,7 +139,7 @@
        * The constructor of the <code>dynaBeanClass</code> that we will use
        * for creating new instances.
        */
  -    protected Constructor constructor = null;
  +    protected transient Constructor constructor = null;
   
   
       /**
  @@ -248,6 +249,11 @@
               throws IllegalAccessException, InstantiationException {
   
           try {
  +            // Refind the constructor after a deserialization (if needed)
  +            if (constructor == null) {
  +                setDynaBeanClass(this.dynaBeanClass);
  +            }
  +            // Invoke the constructor to create a new bean instance
               return ((DynaBean) constructor.newInstance(constructorValues));
           } catch (InvocationTargetException e) {
               throw new InstantiationException
  
  
  
  1.7       +83 -4     
jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/BasicDynaBeanTestCase.java
  
  Index: BasicDynaBeanTestCase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/BasicDynaBeanTestCase.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- BasicDynaBeanTestCase.java        25 Oct 2002 00:27:42 -0000      1.6
  +++ BasicDynaBeanTestCase.java        18 Dec 2002 06:20:41 -0000      1.7
  @@ -63,6 +63,11 @@
   package org.apache.commons.beanutils;
   
   
  +import java.io.ByteArrayInputStream;
  +import java.io.ByteArrayOutputStream;
  +import java.io.ObjectInputStream;
  +import java.io.ObjectOutputStream;
  +
   import java.util.ArrayList;
   import java.util.HashMap;
   import java.util.List;
  @@ -676,6 +681,80 @@
           } catch (Throwable t) {
               fail("Exception: " + t);
           }
  +
  +    }
  +
  +
  +    /**
  +     * Test serialization and deserialization.
  +     */
  +    public void testSerialization() {
  +
  +        // Serialize the test bean
  +        ByteArrayOutputStream baos = new ByteArrayOutputStream();
  +        try {
  +            ObjectOutputStream oos = new ObjectOutputStream(baos);
  +            oos.writeObject(bean);
  +            oos.flush();
  +            oos.close();
  +        } catch (Exception e) {
  +            fail("Exception during serialization: " + e);
  +        }
  +
  +        // Deserialize the test bean
  +        try {
  +            bean = null;
  +            ByteArrayInputStream bais =
  +                new ByteArrayInputStream(baos.toByteArray());
  +            ObjectInputStream ois = new ObjectInputStream(bais);
  +            bean = (DynaBean) ois.readObject();
  +            bais.close();
  +        } catch (Exception e) {
  +            fail("Exception during deserialization: " + e);
  +        }
  +
  +        // Confirm property values
  +        testGetDescriptorArguments();
  +        testGetDescriptorBoolean();
  +        testGetDescriptorDouble();
  +        testGetDescriptorFloat();
  +        testGetDescriptorInt();
  +        testGetDescriptorLong();
  +        testGetDescriptorSecond();
  +        testGetDescriptorShort();
  +        testGetDescriptorString();
  +        testGetDescriptors();
  +        testGetIndexedArguments();
  +        testGetIndexedValues();
  +        testGetMappedArguments();
  +        testGetMappedValues();
  +        testGetSimpleArguments();
  +        testGetSimpleBoolean();
  +        testGetSimpleDouble();
  +        testGetSimpleFloat();
  +        testGetSimpleInt();
  +        testGetSimpleLong();
  +        testGetSimpleShort();
  +        testGetSimpleString();
  +        testMappedContains();
  +        testMappedRemove();
  +
  +        // Ensure that we can create a new instance of the same DynaClass
  +        try {
  +            bean = bean.getDynaClass().newInstance();
  +        } catch (Exception e) {
  +            fail("Exception creating new instance: " + e);
  +        }
  +        testGetDescriptorArguments();
  +        testGetDescriptorBoolean();
  +        testGetDescriptorDouble();
  +        testGetDescriptorFloat();
  +        testGetDescriptorInt();
  +        testGetDescriptorLong();
  +        testGetDescriptorSecond();
  +        testGetDescriptorShort();
  +        testGetDescriptorString();
  +        testGetDescriptors();
   
       }
   
  
  
  

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

Reply via email to