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()));
> >
> >
> >
>
>