From f777b14fdce26b37ad63b21159a3de46b878a8a8 Mon Sep 17 00:00:00 2001 From: Paul Hoadley Date: Thu, 21 May 2015 11:48:02 +0930 Subject: [PATCH] Makes ERXDisplayGroup serializable. #651 The java.lang.reflect.Field ivar displayedObjectsField was not serializable. Here we make that field transient, and add a method to lazily fetch its value from the parent object as required. --- .../extensions/appserver/ERXDisplayGroup.java | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/appserver/ERXDisplayGroup.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/appserver/ERXDisplayGroup.java index 25f403638c2..31fd6ac10d3 100644 --- a/Frameworks/Core/ERExtensions/Sources/er/extensions/appserver/ERXDisplayGroup.java +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/appserver/ERXDisplayGroup.java @@ -38,7 +38,10 @@ * @param data type of the displaygroup's objects */ public class ERXDisplayGroup extends WODisplayGroup { - private Field displayedObjectsField; + /** + * {@code _displayedObjects} field in parent object + */ + private transient Field displayedObjectsField; /** * Do I need to update serialVersionUID? @@ -52,16 +55,29 @@ public class ERXDisplayGroup extends WODisplayGroup { public ERXDisplayGroup() { super(); - try { - displayedObjectsField = WODisplayGroup.class.getDeclaredField("_displayedObjects"); - displayedObjectsField.setAccessible(true); - } - catch (SecurityException e) { - throw NSForwardException._runtimeExceptionForThrowable(e); - } - catch (NoSuchFieldException e) { - throw NSForwardException._runtimeExceptionForThrowable(e); + } + + /** + * Fetches the {@code _displayedObjects} field from the parent + * {@link WODisplayGroup}. This is used in the overriden + * {@link #setSelectedObjects(NSArray)} method. + * + * @return {@code _displayedObjects} field from parent object + */ + private Field displayedObjectsField() { + if (displayedObjectsField == null) { + try { + displayedObjectsField = WODisplayGroup.class.getDeclaredField("_displayedObjects"); + displayedObjectsField.setAccessible(true); + } + catch (SecurityException e) { + throw NSForwardException._runtimeExceptionForThrowable(e); + } + catch (NoSuchFieldException e) { + throw NSForwardException._runtimeExceptionForThrowable(e); + } } + return displayedObjectsField; } /** @@ -222,7 +238,7 @@ public void setSelectedObjects(NSArray objects) { // wrong indexes when calling displayedObjects() NSMutableArray displayedObjects; try { - displayedObjects = (NSMutableArray) displayedObjectsField.get(this); + displayedObjects = (NSMutableArray) displayedObjectsField().get(this); } catch (IllegalArgumentException e) { throw NSForwardException._runtimeExceptionForThrowable(e);