On Jun 29, 2010, at 1:29 PM, Caleb James DeLisle wrote: > > > Thomas Mortagne wrote: >> On Tue, Jun 29, 2010 at 12:32, Caleb James DeLisle >> <[email protected]> wrote: >>> >>> Thomas Mortagne wrote: >>>> On Tue, Jun 29, 2010 at 11:42, Caleb James DeLisle >>>> <[email protected]> wrote: >>>>> I believe that in order for a new api to be accepted by the community, it >>>>> must be more useful and/or easier to use >>>>> than the api which it replaces. >>>>> >>>>> The old way of getting a document was this: >>>>> $xwiki.getDocument("xwiki:Main.WebHome") >>>>> >>>>> The current way to get a document is this: >>>>> $xwiki.getDocument($services.model.createDocumentReference($context.wiki, >>>>> $space, "WebHome")) >>>>> >>>>> I am quite sure that the user community will choose the former even if it >>>>> has escaping issues. >>>>> >>>>> Lest one think we can bully the community into choosing the latter by >>>>> deprecation or removal of methods, recall >>>>> the dismal sales of Windows Vista even with the control afforded by the >>>>> proprietary license and the awesome power >>>>> Microsoft wields over the market. The user is the boss, their word is law. >>>>> >>>>> My first proposal is that we move to an easier way to handle document >>>>> names. >>>>> >>>>> >>>>> >>>>> My second proposal is a possible way to do it. >>>>> I would like velocity and groovy script authors to be able to give a >>>>> command like this: >>>>> xwiki.getDocument(["Main", "WebHome"]); >>>>> or in velocity >>>>> $xwiki.getDocument(["Main", "WebHome"]) >>>>> >>>>> To make that possible I am proposing we change the reference model as >>>>> follows: >>>>> EntityReference extends List<String> >>>>> Each reference has a name which is expressed as a string, it also has a >>>>> reference to the next node and the last >>>>> node. This is a classic example of a LinkedList. The point is that any >>>>> List<String> is a valid (although reletive) >>>>> reference. When a relative reference is passed, it is replaced with a >>>>> complete reference which is completed using >>>>> the document in the context. >>>>> >>>>> As you prepare your -1's please recognize that the community will never >>>>> go for the current model and almost >>>>> anything is better than a rift between the community and the development >>>>> team. If there are any other ideas of >>>>> how to make it that easy, I would be glad to hear them. >>>> I don't see why making public script API to get a document easier >>>> imply to change EntityReferences. You can always have this >>>> xwiki.getDocument(["Main", "WebHome"]); without touching >>>> EntityReferences design, you just create a reference from this list in >>>> the getDocument implementation. >>> Then we will have >>> getDocument(Reference) >>> getDocument(String) >>> getDocument(List) >>> not to mention rename, copyDocument etc. >>> >>> If we must add new methods because we can't make references easy to create >>> then I think sooner or later we are >>> going to have to change direction. >> >> Note that you forget one feature of Velocity: we can implements an >> uberspector that automatically convert give list to the corresponding >> EntityReference. >> >> So you would only have >> >> getDocument(DocumentReference) in the api >> >> but if someone calls getDocument(["Main", "WebHome"]); the uberspector >> will see that there is not direct match but there is a EntityReference >> based one so it will convert the List and calls >> getDocument(DocumentReference) > > So you advocate for adding API which is not explicit in the code, not listed > in javadoc, and might create a > collision that is undetected on compile? That sounds to me like a hack. > >> >> Groovy does not needs a service to create a document reference so it's >> not an issue for it IMO > > So in groovy/python/ruby/etc. users will not be able to get documents or will > they be given the choice > of the buggy method and the one nobody is likely to adopt?
We *already* have a Java API. This discussion should be only for Velocity not other languages. For the record I agree word for word with Thomas' comments so far :) Thanks -Vincent >>>> Problem with your proposal is that it will introduce several >>>> limitations since you have only strings: You have no idea what is >>>> what in this String list you can only rely on the index of the string >>>> in the list. >>>> - the current EntityReferences is that way because we wanted to make >>>> possible to have a reference with just the wiki and the page and give >>>> it to a resolver to get a full reference >>>> - how do you support multiple spaces since you can't know which of >>>> theses strings are spaces ? >>> The algorithm would work like this. If the current document is: >>> xwiki:one.two.three.space.doc >>> and you reference ["xwiki", "Main", "WebHome"] >>> it would count back 3 from the current document location and you would get >>> xwiki:one.two.xwiki.Main.WebHome >>> To make an explicit reference you could pass an entity which is illegal >>> such as: >>> [0, "xwiki", "Main", "WebHome"] >>> or >>> [$xwiki, "xwiki", "Main", "WebHome"] >>> Since nested spaces are not implemented I don't see why we need to worry >>> too much about >>> how easy it is to work around them as long as we know it won't be >>> impossible to implement >>> when the time comes. >> >> Except that, as I said, it is impossible with the design you are proposing... > > Please explain why that is, I see no problem with taking a List as a relative > Reference and completing it using > the document in the context. The biggest challenge I see is signaling what > the "current node" is since each > reference is a node as well as a list containing that node and I'm sure there > is a way to sneak that information > out through a method in the list interface. A hack it would be but I don't > see that it would have any major user > affecting consequences as would some other ideas. > >> >>> >>>>> Caleb _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

