On Jan 10, 2010, at 4:23 PM, Sergiu Dumitriu wrote:

> On 01/10/2010 03:12 PM, Vincent Massol wrote:
>> 
>> On Jan 9, 2010, at 1:25 PM, Pascal Voitot wrote:
>> 
>>> does it mean all scripts using the older functions will need to be updated?
>> 
>> There's only one gotcha right now with what I have on my machine (not 
>> committed) and I'm still hesitating. Internally I've modified the field 
>> containing the objects from
>> 
>>     private Map<String, Vector<BaseObject>>  objects
>> 
>> to
>> 
>>     private Map<DocumentReference, List<BaseObject>>  objects
>> 
>> This means that the old (deprecated APIs) have to wrap the internal map. For 
>> example when XWikiDocument.getxWikiObjects() is called it returns a new Map, 
>> copying the internal map to a map of type Map<String, Vector<BaseObject>>. 
>> The problem is that if you have code like the following it'll now fail:
>> 
>> getxWikiObjects().put(something)
>> 
>> Then calling getxWikiObjects() again will not contain the "something" object.
>> 
>> IMO it's a bad usage of the API. Instead if you wish to add something you 
>> should call addObject (now addXObject) for example. However it was allowed 
>> and will break old code which would need to be modified to work.
>> 
>> WDYT? I don't see any solution to preserve the old behavior and at the same 
>> time move to Map<DocumentReference, List<BaseObject>>  objects
> 
> I think it's safe to make this change, since the behavior was not 
> documented, and at least in the official code it wasn't used.

Actually it's used in a lot of places in the old code... I've fixed the ones 
I've found and I keep finding new ones. The latest example:

    public XWikiDocument copyDocument(String newDocumentName, XWikiContext 
context) throws XWikiException
    {
        loadAttachments(context);
        loadArchive(context);

        XWikiDocument newdoc = (XWikiDocument) clone();
        newdoc.setOriginalDocument(null);
        newdoc.setFullName(newDocumentName, context);
        newdoc.setContentDirty(true);
        newdoc.getxWikiClass().setName(newDocumentName);
        Map<String, Vector<BaseObject>> objectclasses = 
newdoc.getxWikiObjects();
        if (objectclasses != null) {
            for (Vector<BaseObject> objects : objectclasses.values()) {
                if (objects != null) {
                    for (BaseObject object : objects) {
                        if (object != null) {
                            object.setName(newDocumentName);
                            // Since GUIDs are supposed to be Unique, although 
this object holds the same data, it is
                            // not
                            // exactly the same object, so it should have a 
different identifier.
                            object.setGuid(UUID.randomUUID().toString());
                        }
                    }
                }
            }
        }

        XWikiDocumentArchive archive = newdoc.getDocumentArchive();
        if (archive != null) {
            newdoc.setDocumentArchive(archive.clone(newdoc.getId(), context));
        }

        return newdoc;
    }

As you can see object.setName() and object.setGuid() are used.

Thanks
-Vincent

> However, 
> I'd like it to work the same way with the new API, so the new 
> getXObjects should return a Collections.unmodifiableMap(this.objects) 
> instead of this.objects, and the read-only result well specified in the 
> javadoc.
> 
>> Thanks
>> -Vincent
>> 
>>> Pascal
>>> 
>>> On Sat, Jan 9, 2010 at 12:43 PM, Vincent Massol<[email protected]>  wrote:
>>> 
>>>> Hi devs,
>>>> 
>>>> As I mentioned already I'm modifying all APIs in XWikiDocument to use
>>>> References (I'm adding new APIs and deprecating old ones).
>>>> 
>>>> While doing this I'm also fixing names for new APIs. So far I'm modifying 3
>>>> things:
>>>> - replace Vector by List
>>>> - replace Object by XObject in API. For example: getxWikiObjects() -->
>>>> getXObjects(), getObjects(String classname) -->
>>>> getXObjects(DocumentReference classnameReference)
>>>> - replace Class by XClass in API. For example: getxWikiClasses -->
>>>> getXClasses()
>>>> 
>>>> Note1: I wanted to use getObject and getClass but getClass is reserved
>>>> already.
>>>> Note2: in the new model we won't have this problem since we'll
>>>> intelligently use another name for object definitions, something like
>>>> ObjectDefinition :). We could also change Object but it's less problematic
>>>> and it's probably ok to keep it.
>>>> 
>>>> Here's my +1
>>>> 
>>>> Thanks
>>>> -Vincent

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

Reply via email to