On Thu, Mar 29, 2012 at 2:44 PM, Vincent Massol <[email protected]> wrote: > Hi Denis, > > ok I've discussed with Thomas and here's my current position: > > * +1 to add a warning log in BaseObject to find out all the places in code > that use an absolute ref instead of a relative ref > * +1 to remove this warning in 4.0 final > * +1 to throw an exception in the store implementation if it finds an > absolute ref > * However I'd like that we keep removing the wiki part in > setXClassReference() *forever* i.e. decide that we don't want to support this > *ever* in the current old Model. We could add this feature but *only* in the > new Model which will have completely new code and will not use the old APIs > anyway so this won't cause any API breakage for anyone.
I insist again on the fact that *forever* allows to optimize all class reference related code accordingly and stop contently resolve those references as absolute references. It also mean that BaseCollection#getRelativeXClassReference() will be made public (and probably deprecated getXClassReference()) > > Denis, does that some acceptable to you (I know Thomas is ok with this since > it's what he'd like to do too)? > > Thanks > -Vincent > > On Mar 29, 2012, at 12:51 PM, Vincent Massol wrote: > >> >> 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 -- Thomas Mortagne _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

