Just had a look at the spec (i.e. javadoc) and the RI source code: How we handled the List was absolutely correct IMO. The problem you have, would also arise with the RI. So, I do not so a reason to do this "trick" in the MyFaces implementation. The drawback of your patch is: If someone has a List other than an ArrayList the method will fail.
-Manfred 2005/8/3, Sylvain Vieujot <[EMAIL PROTECTED]>: > Hello Manfred, > > Here is a specific example where savestate would fail : > <x:saveState value="#{myLinkedList}/> > > The save state would return a List, and not a LinkedList. > So if you use somewhere in your code myLinkedList.pool(), it would fail. > In fact it fails earlier, as the saved value can't be coerced to a > LinkedList. > > I think this is important as you expect the saveState to return exactly > what you saved, and not a object with a different type. > > In my applications, I have a base backing bean that uses this scheme : > > public class BaseFace implements Serializable { > > public LinkedList<Object> getStates(){ > return new LinkedList<Object>(); > } > > /** > * Restore the states. > */ > public void setStates(@SuppressWarnings("unused") > LinkedList<Object> states) throws Exception{ > // NoOp > } > ... > } > > It's quite nice because at you can extend this class easily and still have > an easy job saving / restoring the state : > > public class BaseFaceForObjectWithUnid<T extends ObjectWithUnid> extends > BaseFace { > ... > > @Override > public LinkedList<Object> getStates(){ > LinkedList<Object> states = super.getStates(); > states.add( object == null ? null : object.getUnid() ); > return states; > } > > @Override > public void setStates(LinkedList<Object> states) throws Exception{ > super.setStates(states); > setUnid(states == null ? null : (String)states.poll()); > } > ... > } > > It worked fine until the related UIComponentBase had been modified. > So I limited the case for ArrayList. > > But I still have problems with this > UIComponentBase.saveAttachedState code, as I guess similar > problems with other types (like a custom class implementing List) could > arrise. > What I understand is that we need this "trick" to check if the List doesn't > contain any StateHolder. > If I'm right and if we still need that, then maybe we can do a recursive > check for any StateHolder object, and if there is none, then just serialize > the object. > > By the way, it's not exactly clear for me why we need to have a special > treatment for StateHolders. > Could you clarify this for me please ? > > Thanks, > > Sylvain. > > > > On Wed, 2005-07-27 at 21:48 +0200, Manfred Geiler wrote: > Sylvain, > This change does not make much sense IMHO. > Why do you check for ArrayList instead of List. There is only a List > cast after that, so why not just check for List? > Is there anything a LinkedList does not correctly implement from the > List interface?! > > -Manfred > > 2005/7/26, [EMAIL PROTECTED] <[EMAIL PROTECTED]>: > > Author: svieujot > > Date: Tue Jul 26 08:25:26 2005 > > New Revision: 225327 > > > > URL: http://svn.apache.org/viewcvs?rev=225327&view=rev > > Log: > > Bugfix for savestate with a linkedlist (couldn't coerce a value of type > "java.util.ArrayList" to type "java.util.LinkedList". > > > > Modified: > > > myfaces/api/trunk/src/java/javax/faces/component/UIComponentBase.java > > > > Modified: > myfaces/api/trunk/src/java/javax/faces/component/UIComponentBase.java > > URL: > http://svn.apache.org/viewcvs/myfaces/api/trunk/src/java/javax/faces/component/UIComponentBase.java?rev=225327&r1=225326&r2=225327&view=diff > > > ============================================================================== > > --- > myfaces/api/trunk/src/java/javax/faces/component/UIComponentBase.java > (original) > > +++ > myfaces/api/trunk/src/java/javax/faces/component/UIComponentBase.java > Tue Jul 26 08:25:26 2005 > > @@ -593,9 +593,9 @@ > > Object attachedObject) > > { > > if (attachedObject == null) return null; > > - if (attachedObject instanceof List) > > + if (attachedObject instanceof ArrayList) > > { > > - ArrayList lst = new > ArrayList(((List)attachedObject).size()); > > + List lst = new > ArrayList(((List)attachedObject).size()); > > for (Iterator it = ((List)attachedObject).iterator(); > it.hasNext(); ) > > { > > lst.add(saveAttachedState(context, it.next())); > > > > > > > >