[ 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.