[
https://issues.apache.org/jira/browse/TRINIDAD-1251?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Matthias Weßendorf resolved TRINIDAD-1251.
------------------------------------------
Resolution: Fixed
Fix Version/s: 1.2.10-core
Assignee: Matthias Weßendorf
> Work-around buggy implementation of Collections.checkedList(),
> Collections.synchronizedList(), Collections.unmodifiableList()
> -----------------------------------------------------------------------------------------------------------------------------
>
> Key: TRINIDAD-1251
> URL: https://issues.apache.org/jira/browse/TRINIDAD-1251
> Project: MyFaces Trinidad
> Issue Type: Bug
> Affects Versions: 1.2.9-core, 1.2.10-core
> Environment: all
> Reporter: Blake Sullivan
> Assignee: Matthias Weßendorf
> Fix For: 1.2.10-core
>
> Attachments: JIRA_1251_1291.patch
>
> Original Estimate: 2h
> Remaining Estimate: 2h
>
> CollectionUtils.getSerializableList() attempt to optimize its behavior by
> only wrapping the List if the passed in backing List does not implement
> Serializable. However, Collections.checkedList(),
> Collections.synchronizedList(), Collections.unmodifiableList() are all
> implemented incorrectly with regard to Serialization. The implementation
> classes used always implement Serializable regardless of whether the supplied
> backing List is itself Serializable. This results in
> CollectionUtils.getSerializableList() not attempting to wrap the resulting
> List and thus Serialization errors.
> Two solutions are provided:
> 1) A new function that always wraps is now provided:
> /**
> * Returns a List based on the passed in List <code>l</code>,
> * guaranteed to be Serializable. List <code>l</code> will be
> * wrapped in a List that implements Serializable and upon
> * Serialization the contents of <code>l</code> will be copied into
> * the result.
> * <p>
> * If <code>l</code> implements RandomAccess, any returned List will also
> * implement RandomAccess.
> * <p>
> * The results is very similar to creating a new ArrayList with the
> * contents of <code>l</code>, but no wrapper is created unless necessary
> * and the actual creation of the Serializable copy is deferred until
> * Serialization occurs.
> * <p>
> * Code that calls List.subList() and needs the result to be Serializable
> should always
> * use <code>newSerializableList</code> rather than
> <code>getSerializableList</code> because
> * the <code>java.util.Collections</code> implementations of
> <code>checkedList</code>,
> * <code>unmodifiableList</code>, and <code>synchronizedList</code> all lie
> and always implement
> * Serializable, regardless of the serializability of their backing List.
> * @param l The List to get a Serializable version of
> * @return A Serializable version of List <code>l</code>
> * @see #getSerializableList
> * @see #getSerializableCollection
> */
> public static <T> List<T> newSerializableList(List<T> l)
> 2) The implementation of public static <T> List<T>
> getSerializableList(List<T> l) has been changed to always wrap the result if
> the backing list was generated by Collections.checkedList(),
> Collections.synchronizedList() or Collections.unmodifiableList()
> In addition, the previous calls to Collectionutils.getSerializableList() are
> changed to CollectionUtils.newSerializableList() and the support for
> whitespace between the commas was removed, since it won't work when the
> System property is specified on the command line
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.