On Mar 29, 2012, at 12:07 PM, Denis Gervalle wrote:

> On Wed, Mar 28, 2012 at 11:00, Vincent Massol <[email protected]> wrote:
> 
>> 
>> On Mar 28, 2012, at 10:49 AM, Denis Gervalle wrote:
>> 
>>> On Wed, Mar 28, 2012 at 09:42, Vincent Massol <[email protected]>
>> wrote:
>>> 
>>>> Thanks to Thomas and Denis for the explanations. I understand now, it's
>>>> very clear :)
>>>> 
>>>> However I'd like to suggest a different solution.
>>>> 
>>>> Premises:
>>>> * 99% of the use cases are for relative references
>>>> 
>>> 
>>> Right, since nothing else would work today.
>>> 
>>> 
>>>> * We need to make sure devs don't use the API wrongly and thus the API
>> has
>>>> to be easy to use right
>>>> 
>>> 
>>> This is true for most API, maybe we could add more helpers, but this is
>> not
>>> the subject of this vote.
>> 
>> It is!  This is even the reason of the vote: because some places of the
>> code use wrongly an absolute ref instead of a relative ref...
>> 
> 
> Not the code of the API, but recent code using the API like the sheet
> binding mechanism. There was a bug in the store, but this is really not the
> story.
> 
> 
>> 
>>>> * We have never supported absolute references to XClasses (since we've
>>>> never supported this in the DB)
>>>> 
>>> 
>>> The database have never support it, but the whole API have been written
>> to
>>> support it. This has been the result of a previous vote on this subject.
>> 
>> I don't recall this. Can you give me the link?
>> 
> 
>  http://markmail.org/message/yggcayev5hvgv342

Two points about this:
1) This was not a vote
2) I wrote this proposal and I remember it very well and I've never proposed to 
allow having an XClass in one wiki and an XObject in another wiki.

>> Also if it his is true I'm suggesting to vote again on this.
>> 
> 
> Going back after a vote, is really not good IMO, unless we are really sure,
> so not in hurry.

It's never been voted nor even proposed so no issue at all… :)

>>> This is why we have not proposed to change the behavior of the API, but a
>>> temporary solution to help those that have use it badly and was never
>> able
>>> to notice it due to some bug at store level, that this usage is currently
>>> wrong, and fix it on the fly for now (quick fix), since there is no other
>>> valid usage for our current storage.
>>> 
>>> 
>>>> 
>>>> Based on these premises I'd like to suggest that:
>>>> * We automatically remove the wiki part when adding an XObject
>>>> (specifically in resolveClassReference())
>>>> 
>>> 
>>> We effectively propose to do so with a stack trace warning if the wiki is
>>> ok, and with a stack trace error if you try to really link to an external
>>> class. This would not break abruptly existing wrong usage, and allow us
>> to
>>> extends later.
>>> 
>>> 
>>>> * Later on when we implement a new storage that supports multiwiki for
>>>> xclasses then we add another method so that users who want to use an
>>>> absolute reference do it voluntarily and not by mistake. It could be:
>>>> newAbsoluteXObject(…) for example. Alternatively we could add:
>>>> newXObject(EntityReference ref, boolean isAbsolute).
>>>> 
>>> 
>>> This is not that simple. We take care of relativizing the reference in
>> most
>>> places already, before calling object creation.
>>> But, for sure this would simplify a lot. This means removing what we have
>>> done up to now. However, we support external classes in all places from
>> the
>>> action, and only the storage does not really allow them. Should we revert
>>> that ?
>> 
>> Nothing should be reverted IMO, it's ok to pass a full reference even if
>> only the relative part will be saved in the wiki. In the future, **if** we
>> ever want to add support for absolute xclass ref in the DB then we'll have
>> another api and we will then be able to modify the places that want to
>> support absolute refs to use the new api.
>> 
> 
> You are wrong, we take care of passing relative reference in many places,
> and later we need to go back to an absolute one, since relative reference
> are not workable with. So leaving all this code if we are sure it is
> useless is not appropriate. But what I means mainly, is that we have
> written these line of codes (and test) just because of the vote above, and
> now you just propose to throw it away.

I 've never written any line of code because I wanted to support having an 
XClass in one wiki and an XObject in another one. That's not true.

It would have been stupid to propose something that cannot be implemented. I 
would not have done this. My strategy is to not propose something for the 
future because of YAGNI unless in some special case where I'm 100% sure it'll 
be needed and not implementing it would cause issues in the future.

Now it's possible that this proposal had a side effect that lead to allowing 
this but it doesn't mean we wanted to support it (and we were not supporting it 
since we cannot support it currently).

>>> On the other hand, this seems to me curious to pass over an absolute
>>> reference to just ignore a part of it. Maybe we are simply missing
>>> something in references to helps these usages ?
>> 
>> It's simple IMO. Most of our APIs return DocumentReference, ie absolute
>> refs. So for example imagine I want to use a XClass defined in a given doc,
>> I'll use: doc.getDocumentReference() as the XClass reference.
>> 
> 
> Yes, but maybe we just need a
> doc.getDocumentReference().toRelative(EntityType.WIKI) for the purpose.

We can already do this so that's not the issue IMO.

My preference still goes to 2) ATM but if the majority prefers 3) I'll vote +0 
for 3) :)

Thanks
-Vincent

>> We don't have a ClassReference object and so far we use DocumentReference
>> == ClassReference.
>> 
>> Thanks
>> -Vincent
>> 
>>>> This will ensure that users of the api can't use it wrongly.
>>>> 
>>>> I really don't see any point in continuing to try to support a feature
>>>> that doesn't exist and that we can't support… It's better to add support
>>>> for it when we implement a storage that supports it.
>>>> 
>>>> Thanks
>>>> -Vincent
>>>> 
>>>> On Mar 26, 2012, at 8:07 PM, Thomas Mortagne wrote:
>>>> 
>>>>> On Mon, Mar 26, 2012 at 6:21 PM, Vincent Massol <[email protected]>
>>>> wrote:
>>>>>> Hi,
>>>>>> 
>>>>>> This looks like a very complex topic. Trying to answer below (or
>> rather
>>>> ask questions)…
>>>>>> 
>>>>>> On Mar 26, 2012, at 3:43 PM, Thomas Mortagne wrote:
>>>>>> 
>>>>>>> Hi devs,
>>>>>>> 
>>>>>>> we have an important inconsistency that we ignored since a long time
>>>>>>> and that is producing http://jira.xwiki.org/browse/XWIKI-7628.
>>>>>>> 
>>>>>>> The main issue is that the storage save document containing object
>>>>>>> linked explicitly to another wiki without complaining which mean that
>>>>>>> user continue using API wrongly without really knowing it's wrong.
>> And
>>>>>>> now we have lots of code badly using object class related API and
>>>>>>> contently creating object with absolute class references.
>>>>>> 
>>>>>> I don't see anything wrong with adding an XObject to a Document using
>>>> an absolute XClass reference. This is actually the API we've added and
>>>> we've only added relative XObject API more recently which IMO is the
>> wrong
>>>> one since we always said we wanted to use absolute references
>> everywhere in
>>>> all APIs and it's up to the storage to remove/add the wiki part.
>>>>>> 
>>>>>> Are we talking about the same thing?
>>>>> 
>>>>> It's not that simple, xclass reference in xobject are working like
>>>>> parents reference in document: they are relative to keep what the user
>>>>> explicitly asked even when the document is copied in another context.
>>>>> So which reference is set to the object is very important because the
>>>>> reference will be copied as it is when copying a document.
>>>>> 
>>>>> Here is the javadoc you wrote in BaseCollection:
>>>>> 
>>>>>  /**
>>>>>   * The meaning of this reference fields depends on the element
>>>>> represented. Examples:
>>>>>   * <ul>
>>>>>   * <li>If this BaseCollection instance represents an XObject then
>>>>> refers to the document where the XObject's XClass
>>>>>   * is defined.</li>
>>>>>   * <li>If this BaseCollection instance represents an XClass then
>>>>> it's not used.</li>
>>>>>   * </ul>
>>>>>   * Note that we're saving the XClass reference as a relative
>>>>> reference instead of an absolute one. This is because
>>>>>   * We want the ability (for example) to create an XObject relative
>>>>> to the current space or wiki so that a copy of
>>>>>   * that XObject would retain that relativity. This is for example
>>>>> useful when copying a Wiki into another Wiki so
>>>>>   * that the copied XObject have a XClassReference pointing in the new
>>>> wiki.
>>>>>   */
>>>>>  private EntityReference xClassReference;
>>>>> 
>>>>> It's not only a storage issue, if you have an document object with
>>>>> reference wiki1:Space:MyClass and copy that document to wiki2 then you
>>>>> will have an object in wiki2 with class wiki1:Space:MyClass. The
>>>>> storage does not have a word to said in this process it just get the
>>>>> resulting new XWikiDocument to save and in this case we are asking the
>>>>> store to store an object defined by a class which is in another wiki,
>>>>> something that it does not support and more importantly something that
>>>>> was not intended.
>>>>> 
>>>>> So we have several choices here:
>>>>> 1) continue hiding under the carpet that we are asking to the store
>>>>> something that it can't do and have inconsistency between object and
>>>>> storage and crappy hack here and there in the storage (in the case of
>>>>> XWIKI-7628 it means not trusting what's returned by
>>>>> BaseObject#getReference)
>>>>> 2) totally forget about relative xclass reference chosen outside of
>>>>> BaseObject and always remove the wiki from the reference stored in
>>>>> BaseCollection#xClassReference which mean that this API will
>>>>> officially never support having an object with a class from another
>>>>> wiki
>>>>> 3) keep the current API as it has been defined and voted and try to
>>>>> make a bit more sure people are using it the way it's supposed to be
>>>>> used
>>>>> 
>>>>> Here we are talking proposing 3)
>>>> 
>>>> Got it!
>>>> 
>>>>>>> Until now it was OK even if a mess and it's still not visible. But
>>>>>>> that's mostly luck... until we start copying documents from one wiki
>>>>>>> to another starting with 4.0 branch. What changed is that the
>>>> uniquetemporary
>>>>>>> identifier of the object in the database is "properly" generated by
>>>>>>> using it's reference and since a class reference in a BaseObject
>>>>>>> contain a wiki it's now taken into account. The old id generator used
>>>>>>> to use the deprecated BaseCollection#getClassName which is forced
>>>>>>> absolute for retro-compatibility reason even if it was actually
>>>>>>> possible before to put absolutely anything as class reference.
>>>>>>> 
>>>>>>> So right now we have two issues:
>>>>>>> * store save invalid document without complaining
>>>>>>> * many code is wrongly using BaseObject and XWikiDocument API
>>>>>>> regarding class references mostly because you don't really see it
>>>>>>> right away when you don't use it properly. Even ObjectAddAction is
>>>>>>> wrong, a lot of code that was using setClassName has been badly
>>>>>>> converted to fix deprecated method code by resolving what was passed
>>>>>>> to setClassName into an absolute reference which is very wrong and
>> not
>>>>>>> the behavior of setClassName.
>>>>>>> 
>>>>>>> Here is what we propose with Denis:
>>>>>>> * 4.x (or until class coming from another wiki is supported but I
>>>>>>> doubt this is going to happen anytime soon with this storage):
>>>>>>> ** throw an exception in the storage when saving a document
>> containing
>>>>>>> objects coming from another wiki
>>>>>> 
>>>>>> I don't like this. If the problem is that we don't want to allow an
>>>> XObject to be added when the XClass is coming from another wiki then
>> this
>>>> should be checked at the level of the AddXObject APIs and throw an
>>>> exception there.
>>>>> 
>>>>> This has nothing to do with what we propose, the goal here is to find
>>>>> code which is setting absolute reference for the class to that it's
>>>>> fixed to not have issue when copying. If we do what you say then the
>>>>> document copy will fail like it does now but simply for another reason
>>>>> and it's not going to help fixing anything because the issue is not at
>>>>> this level but in the code that put an absolute reference in the
>>>>> original document.
>>>>> 
>>>>>> 
>>>>>> Thanks
>>>>>> -Vincent
>>>>>> 
>>>>>>> ** to temporary limit breakage while we fix wrong code and help us
>>>>>>> find this wrong code, modify BaseCollection#setXClassReference to
>>>>>>> force it to remove the wiki from the passed reference and log a
>>>>>>> warning about a bad usage
>>>>>>> * 5.0: remove the bandage from BaseCollection#setXClassReference
>>>>>>> 
>>>>>>> WDYT ?
>>>>>>> 
>>>>>>> Here is my +1
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to