On Oct 28, 2008, at 2:22 PM, Thomas Mortagne wrote:

> On Tue, Oct 28, 2008 at 3:12 AM, Vincent Massol <[EMAIL PROTECTED]>  
> wrote:
>>
>> On Oct 28, 2008, at 11:07 AM, Sergiu Dumitriu wrote:
>>
>>> vmassol (SVN) wrote:
>>>> Author: vmassol
>>>> Date: 2008-10-28 09:19:23 +0100 (Tue, 28 Oct 2008)
>>>> New Revision: 13864
>>>>
>>>> Added:
>>>>  platform/core/trunk/xwiki-rendering/src/test/java/org/xwiki/
>>>> rendering/block/XMLBlockTest.java
>>>> Modified:
>>>>  platform/core/trunk/xwiki-rendering/src/main/java/org/xwiki/
>>>> rendering/block/XMLBlock.java
>>>> Log:
>>>> XWIKI-2785: The order in which XML attributes are printed when
>>>> converted to XWiki syntax is not fixed
>>>>
>>>
>>>> +    public void testAttributeOrder()
>>>> +    {
>>>> +        Map<String, String> attributes = new HashMap<String,
>>>> String>();
>>>> +        attributes.put("aaa", "value1");
>>>> +        attributes.put("bbb", "value2");
>>>> +        XMLBlock block = new XMLBlock("element", attributes);
>>>> +
>>>> +        Iterator<String> it = attributes.keySet().iterator();
>>>> +        Iterator<String> newIt =
>>>> block.getAttributes().keySet().iterator();
>>>> +        while (it.hasNext()) {
>>>> +            assertEquals(newIt.next(), it.next());
>>>> +        }
>>>> +    }
>>>
>>> I'm not sure this test is enough,
>>
>> it's definitely not enough.
>>
>>> since the order for two attributes
>>> could happen to be the same. Why not add 10 attributes (aN = vN,
>>> where N
>>> goes from 0 to 9)?
>>
>> I've just tried this:
>>
>>    public void testAttributeOrder()
>>    {
>>        Map<String, String> attributes = new HashMap<String,  
>> String>();
>>        for (int i = 0; i < 10; i++) {
>>            attributes.put("key" + i, "value" + i);
>>        }
>>        XMLBlock block = new XMLBlock("element", attributes);
>>
>>        Iterator<String> it = attributes.keySet().iterator();
>>        Iterator<String> newIt =
>> block.getAttributes().keySet().iterator();
>>        while (it.hasNext()) {
>>            assertEquals(newIt.next(), it.next());
>>        }
>>    }
>>
>> And the tests till passes even when I revert the implementation for
>> XMLBlock (i.e. no usage of LinkedHashMap).
>>
>> Any more idea? Could it be that the test is wrong or the
>> implementation not correct? (I don't se anything wrong).
>
> It's the implementation :
> change
>> this.attributes = attributes;
> by
>> this.attributes = new LinkedHashMap<String, String>(attributes);
>
> does not change anything, the most important is what is the initial
> Map implementation of provided "attributes":
>  - if it's HashMap then there is nothing you can do here to have the
> same order user set in the wiki syntax
>  - if it's already LinkedHashMap then you have nothing to do

I'm not sure. I thought about this too. Here's my understanding: we  
should return the map keyset in the same order as provided by the  
user, i.e. if the user uses a HashMap then we return it in the same  
order as the HashMap. If the user uses a LinkedHashMap then we return  
it in that order too. I also think we should create a new map and not  
use the one provided by the user. I was also hesitating about adding a  
addAttribute() method to the class.

Note that I was not talking about end users but about users of XMLBlock.

Last, I've also fixed XHTMLMacro locally so that it uses a  
LinkedHashMap when creating XMLBlock elements.

Thanks
-Vincent
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to