craigmcc 2002/07/13 11:05:05 Modified: src/share/org/apache/struts/action DynaActionFormClass.java Log: Make it possible to serialize DynaActionForm instances, as long as the property values themselves are also Serializable. This also relies on a fix in the 20020714 nightly build of commons-beanutils to be effective. PR: Bugzilla #10380 Submitted by: Matt Raible (matt at raibledesigns.com> Revision Changes Path 1.7 +41 -10 jakarta-struts/src/share/org/apache/struts/action/DynaActionFormClass.java Index: DynaActionFormClass.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/DynaActionFormClass.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- DynaActionFormClass.java 29 Jun 2002 03:14:19 -0000 1.6 +++ DynaActionFormClass.java 13 Jul 2002 18:05:05 -0000 1.7 @@ -63,6 +63,7 @@ package org.apache.struts.action; +import java.io.Serializable; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -87,7 +88,7 @@ * @since Struts 1.1 */ -public class DynaActionFormClass implements DynaClass { +public class DynaActionFormClass implements DynaClass, Serializable { // ----------------------------------------------------------- Constructors @@ -120,7 +121,7 @@ * The <code>DynaActionForm</code> implementation <code>Class</code> which * we will use to create new bean instances. */ - protected Class beanClass = null; + protected transient Class beanClass = null; /** @@ -156,7 +157,14 @@ * The set of <code>DynaActionFormClass</code> instances that have * ever been created, keyed by the form bean name. */ - protected static HashMap dynaClasses = new HashMap(); + protected transient static HashMap dynaClasses = new HashMap(); + + + /** + * The lockable object we can synchronize on, even if dynaClasses + * is null, + */ + protected static String lock = ""; // ------------------------------------------------------ DynaClass Methods @@ -227,7 +235,8 @@ public DynaBean newInstance() throws IllegalAccessException, InstantiationException { - DynaActionForm dynaBean = (DynaActionForm) beanClass.newInstance(); + DynaActionForm dynaBean = + (DynaActionForm) getBeanClass().newInstance(); dynaBean.setDynaActionFormClass(this); FormPropertyConfig props[] = config.findFormPropertyConfigs(); for (int i = 0; i < props.length; i++) { @@ -272,7 +281,10 @@ */ public static void clear() { - synchronized (dynaClasses) { + synchronized (lock) { + if (dynaClasses == null) { + dynaClasses = new HashMap(); + } dynaClasses.clear(); } @@ -293,7 +305,10 @@ public static DynaActionFormClass createDynaActionFormClass(FormBeanConfig config) { - synchronized (dynaClasses) { + synchronized (lock) { + if (dynaClasses == null) { + dynaClasses = new HashMap(); + } DynaActionFormClass dynaClass = (DynaActionFormClass) dynaClasses.get(config.getName()); if (dynaClass == null) { @@ -307,6 +322,22 @@ // ------------------------------------------------------ Protected Methods + + + /** + * Return the implementation class we are using to construct new + * instances, re-introspecting our {@link FormBeanConfig} if necessary + * (i.e. after being deserialized, since <code>beanClass</code> is + * marked transient. + */ + protected Class getBeanClass() { + + if (beanClass == null) { + introspect(config); + } + return (beanClass); + + } /**
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>