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]>