[ 
https://issues.apache.org/jira/browse/CXF-1906?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12646578#action_12646578
 ] 

marcuschristie edited comment on CXF-1906 at 11/11/08 8:02 AM:
----------------------------------------------------------------

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 after the Set "if" clause.  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.

      was (Author: marcuschristie):
    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.

Reply via email to