On Mon, Jan 4, 2010 at 09:31, Vincent Massol <[email protected]> wrote: > > On Jan 4, 2010, at 9:26 AM, Vincent Massol wrote: > >> Actually I'm no longer sure the cons of having relative reference overcomes >> the pros of having only absolute references. >> >> Re the rename use case I had defined, it's probably not that bad to use the >> compact entity reference serializer (which I have already written) to use >> the minimal syntax for referencing the parent or a link. It would mean that >> a link as [[CurrentSpace.Page]] would get transformed to [[NewPage]] if the >> Page document is renamed to NewPage in the *same* space. It's not bad and >> could actually be considered a feature to rewrite the link to the smallest >> possible representation that works.
+1 >> >> I don't see any other important use case and there are lots of pros of >> having only absolute references internally. >> >> Thus I'd like to withdraw this idea of adding support for relative >> references. >> >> I'll go on without relative references for now. Let me know if you see a >> real need that overcomes the cons it brings. > > Note that I'll keep the normalizer as a helper component if you want to > normalize an EntityReference without going through a string representation. +1 > > Thanks > -Vincent > >> >> Thanks >> -Vincent >> >> On Jan 3, 2010, at 2:43 PM, Vincent Massol wrote: >> >>> >>> On Jan 3, 2010, at 1:49 PM, Thomas Mortagne wrote: >>> >>>> On Sun, Jan 3, 2010 at 13:22, Vincent Massol <[email protected]> wrote: >>>>> Note that using relative references means that all code that accepts >>>>> an EntityReference must check that it's valid and throw some exception >>>>> if not, whereas before there was no need for any check and no >>>>> exception throwing.... >>>>> >>>>> In most cases it's not possible for the code to run the normalizer >>>>> since it wouldn't know which normalizer to use (the default one, the >>>>> current one, etc?). It's the calling code that would know which >>>>> normalizer to use... >>>> >>>> We could decide of an arbitrary normalizer like saying when we don't >>>> know we use "current" normalizer same way it's done for a File for >>>> example. We could have a EntityReference#getAbsoluteReference() that >>>> make sure to get a valid full reference (and return this if it's >>>> already a full reference). IMO the code should not throw an exception >>>> but instead document what normalizer it's using when the reference is >>>> not absolute exactly like file system APIs in general. >>> >>> I don't think we can compare with the filesystem. There's only one >>> normalizing reference for the file system. This is not our case. >>> >>> Also I don't agree that API code should default to the current normalizer. >>> This would mean the code will only work when there's a context doc and this >>> puts some unnecessary restriction on the code. It's really the calling code >>> that should pass the correct reference. >>> >>> I think (haven't thought enough about it though) I'd prefer to separate >>> absolute reference from relative references so that apis that need an >>> absolute ref can specify it in their signature. That would remove the need >>> for checking + the need to throw an exception or use an arbitrary >>> normalizer. >>> >>> We could also have a reference factory that takes an absolute ref and >>> generate a relative reference (w/ default + current impl) for the user >>> cases when you have an abs ref and need a relative one. Since our ref >>> factory are typed we wouldn't even need a new interface. >>> >>> I need to think more about it but my feeling is that the absolute ref stuff >>> we had before wasn't so bad after all. Maybe we just need to add a new >>> notion of relative ref somehow for those few use cases requiring it but >>> keep using absolute ref in most places. >>> >>> Thanks >>> -Vincent >>> >>>>> My status: >>>>> * I have implemented the normalizer code (both Default normalizer and >>>>> current normalizer) >>>>> * I'm now going to start re-implementing the entity reference >>>>> factories and serializers >>>>> * I'm looking at existing code to see how the code would need to be >>>>> adapted and I'm finding that in several cases it's going to be hard. >>>>> Just to illustrate this take this code: >>>>> >>>>> public String getAttachmentURL(AttachmentReference >>>>> attachmentReference, boolean isFullURL) >>>>> { >>>>> String url; >>>>> if (isFullURL) { >>>>> XWikiContext xcontext = getContext(); >>>>> url = >>>>> xcontext >>>>> .getURLFactory().createAttachmentURL(attachmentReference.getName(), >>>>> >>>>> attachmentReference >>>>> .getDocumentReference().getLastSpaceReference().getName(), >>>>> attachmentReference.getDocumentReference().getName(), >>>>> "download", null, >>>>> attachmentReference.getDocumentReference().getWikiReference().getName(), >>>>> xcontext).toString(); >>>>> } else { >>>>> url = >>>>> getAttachmentURL >>>>> (this >>>>> .entityReferenceSerializer >>>>> .serialize(attachmentReference.getDocumentReference()), >>>>> attachmentReference.getName()); >>>>> } >>>>> return url; >>>>> } >>>>> >>>>> There's now no guarantee that the passed reference has a non null >>>>> attachment name, space name or wiki name. The code would need to >>>>> verify this (or createAttachmentURL() would need to check it but >>>>> that's the same). What should it do if it finds a null name? It cannot >>>>> guess if it should use the current normalizer or the default normalizer. >>>>> >>>>> The only solution I can see would be to check if the passed reference >>>>> is absolute (using AttachmentReference.isAbsolute() for ex) and throw >>>>> an InvalidEntityReference exception if it's not absolute. >>>>> >>>>> But that's going to be a pain probably... >>>>> >>>>> I'm still hesitating... >>>>> >>>>> WDYT? >>>>> >>>>> Thanks >>>>> -Vincent >>>>> >>>>> On Dec 31, 2009, at 12:39 PM, Vincent Massol wrote: >>>>> >>>>>> Hi devs, >>>>>> >>>>>> I'm almost done with my entity reference refactoring and I've just >>>>>> realized I have missed something I think. So far the implementation >>>>>> only supports Absolute references (i.e the entity reference factory >>>>>> always return a reference with all parts filled - you choose to use >>>>>> a default factory or a current entity depending on how you wish to >>>>>> resolve the names when they have not been provided in the passed >>>>>> reference string). >>>>>> >>>>>> I now think we must also support relative references (i.e. when some >>>>>> parts can be null) and that it's up to the user of the api to decide >>>>>> if they want to convert a relative reference to an absolute one or >>>>>> not. >>>>>> >>>>>> Here's a use case: renaming of documents. For exemple documents have >>>>>> links specified as a string representing the target doc name. If we >>>>>> don't have relative references then we need to decide if we want to >>>>>> use the default serializer (all parts printed including wiki name) >>>>>> or the compact serializer (only parts different from context >>>>>> reference printed). This doesn't support printing only what the user >>>>>> had decided to fill. For ex a user might have specified voluntarily >>>>>> the space and page name and right now with my implementation he'll >>>>>> get only the page name specified if the new space is the same as the >>>>>> space for the current doc. >>>>>> >>>>>> So here's my proposal: >>>>>> >>>>>> * Entity Reference Factory leaves parts to null when not specified >>>>>> in the string representation. >>>>>> * We add a EntityReference.getAbsoluteReference(EntityReference >>>>>> base) method to return an absolute reference. It's resolved against >>>>>> the passed base reference (i.e. parts not specified are taken from it) >>>>>> >>>>>> WDYT? >>>>>> >>>>>> I'm going to start refactoring my code to do this later today so >>>>>> please let me know if you see any pb with it. >>>>>> >>>>>> Thanks >>>>>> -Vincent >> > > _______________________________________________ > 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

