[
https://issues.apache.org/jira/browse/CXF-1906?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12646578#action_12646578
]
Marcus Christie commented on CXF-1906:
--------------------------------------
I submitted a patch to fix this bug (I actually submitted the patch twice, but
I realized that the first attempt had a problem with it; please disregard it).
The bug in CollectionType.createCollection is that Set "isAssignableFrom"
SortedSet because it is a supertype of SortedSet, so the SortedSet "if" clause
should come second. Here is how the code is in that method with the patch
applied:
if (getTypeClass().isAssignableFrom(List.class)) {
values = new ArrayList();
} else if (getTypeClass().isAssignableFrom(Set.class)) {
values = new HashSet();
} else if (getTypeClass().isAssignableFrom(SortedSet.class)) {
values = new TreeSet();
} else if (getTypeClass().isAssignableFrom(Vector.class)) {
values = new Vector();
} else if (getTypeClass().isInterface()) {
values = new ArrayList();
} else {
....
This way, if your class has a Set, Aegis will create a HashSet to add values
to. In the case that the typeClass if a SortedSet, it will fail the second
"if" clause since SortedSet is not a supertype of Set, but will pass the third
"if" clause since, obviously, SortedSet "is assignable from" a SortedSet. So
the fix is really to just reorder the "if" clauses a bit so that not every Set
is treated as a SortedSet.
> Unmarshalling Set to TreeSet instead of HashSet
> -----------------------------------------------
>
> Key: CXF-1906
> URL: https://issues.apache.org/jira/browse/CXF-1906
> Project: CXF
> Issue Type: Bug
> Components: Aegis Databinding
> Affects Versions: 2.1.3
> Reporter: Marcus Christie
> Priority: Critical
> Attachments: CXF-1906_patch.txt, CXF-1906_patch.txt
>
>
> When using the Aegis databinding, if you are deserializing to a class that
> has a Set in it, Aegis is currently instantiating the set as a SortedSet.
> This fails for cases where the objects being added to the set do not
> implement Comparable, and is undesired in any case.
> The error occurs in CollectionType.java:
> {code:java}
> protected Collection<Object> createCollection() {
> Collection values = null;
> if (getTypeClass().isAssignableFrom(List.class)) {
> values = new ArrayList();
> } else if (getTypeClass().isAssignableFrom(SortedSet.class)) {
> values = new TreeSet();
> } else if (getTypeClass().isAssignableFrom(Set.class)) {
> values = new HashSet();
> } else if (getTypeClass().isAssignableFrom(Vector.class)) {
> values = new Vector();
> } else if (getTypeClass().isInterface()) {
> values = new ArrayList();
> } else {
> ....
> {code}
> If the typeClass is Set, then the second "if" clause evaluates to true since
> Set is a superclass/superinterface of SortedSet.
> I've got a patch I'll submit and I'll explain the fix.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.