Hi,

On Sun, Apr 5, 2015 at 10:52 AM, [email protected] <[email protected]>
wrote:

> Hi Edy,
>
> On 4 Apr 2015 at 07:47:04, Eduard Moraru ([email protected](mailto:
> [email protected])) wrote:
>
> > Hi Vincent,
> >
> > On Fri, Apr 3, 2015 at 11:18 PM, [email protected]
> > wrote:
> >
> > > Hi Edy,
> > >
> > > I don’t enough about requirejs to make an educated answer on this part
> so
> > > my answer is only about the new proposed format.
> > >
> > > PROs:
> > > * possibly a bit better for end users
> > >
> > > CONs:
> > > * not restful (I think)
> > >
> >
> > But isn't it much more restful than the current
> > http://localhost:8080/xwiki/bin/webjars/resources/path?value=%2F%2F
> > ?
>
> Yes it’s very possible, I honestly don’t know if having some data
> separated by the URL path separator is RESTful or not. I mean something
> like /key/value1/value2/value3.
>
> In which case it goes in the PROs list if it is RESTful.
>
> > > * we mix the resource name with the rest of the URL (semantic mixing)
> > >
> >
> > IMO, the ID (if this is what you refer to as resource name) should always
> > be between 2 "/"es. If the resource name contains a "/" itself, then it
> > should be URL escaped by the caller.
> >
> > If by resource name you mean the entire
> > "value=%2F%2F" part, see below.
>
> What I call resource name is for example: "angularjs/1.1.5/angular.js”
>
> > > * by mixing the resource name with the rest of the URL we need to
> reparse
> > > the URL to reconstruct the resource name
> > >
> > > Let me give more information by what I mean on these last 2 points.
> Right
> > > now when we have a URL our ExtendedURL class parses the URL by parsing
> the
> > > path portions and storing them into a List.
> > > So if we have http:////path1/path2/path3, we get [“path1”, “path2”,
> > > “path3]. If we wish to get the resource name we need to [“path1”,
> “path2”,
> > > “path3].join(“/“).
> > >
> > > In addition I also find it more logical that the resourcename be a BLOB
> > > for which we don’t know the structure (whether it’s separated by “/“
> or “.”
> > > or anything else, we shouldn’t care about). The way we load the
> resource is
> > > by doing a ClassLoader.getResourceAsStream(resourceName). Said
> differently
> > > it’s by pure chance that we have both “/“ for loading a classloader
> > > resource and as a separator for a URL!
> > >
> > > So I don’t want to block your proposal but it’s seems we’re mixing
> apples
> > > and oranges and I’m not sure it’s a good thing.
> > >
> >
> > I am having a hard time understanding if you are talking about URL
> > management in XWiki in general (i.e. determining what is the action that
> > the current URL is trying to reach; is it webjars, is it view, is it bin,
> > is it rest, etc...), or if you are talking about the actual webjar
> resource
> > that the client is trying to reach (i.e. files inside the webjar).
> >
> > If you are talking about webjars in specific, don`t forget that they are
> > basically zipped directories and that will not really change AFAIK. Any
> > resource inside a webjar is basically a file in a directory. Webaps will
> > still want to handle them as files inside directories inside the web
> > application, not as parameters inside a URL request to some service that
> > returns files. This is actually where the problem comes when a library
> such
> > as requirejs uses and enforces this assumption.
>
> Yes this was exactly my issue: webjars resource names are directories.
> When you have "angularjs/1.1.5/angular.js” the “/“ represent a directory
> separator.
>
> Whereas the “/“ in URLs don’t represent directory separators. They just
> happen to be the same.
>
> Now I’ve thought more about it and it’s not a showstopper at all since I
> believe the correct algorithm is actually:
>
> 1) Parse the URL and extract all path segments. For example when you have
> "angularjs/1.1.5/angular.js” you extract segments = [“angularjs”, “1.1.5”,
> “angular.js”]
> 2) To construct the resource name you simply do:
> segments.join(PATHSEPARATORCHAR) and if PATHSEPARATORCHAR  is “/“ you‘ll
> get "angularjs/1.1.5/angular.js”
>
> As I mentioned in my previous mail, we do 1) anyway in the XWiki URL
> management so it’s fine.
>
> So, after more thinking I’m +0 about using the following WebJar URL format:
>
> http://
> <server>/xwiki/webjars/angularjs/1.1.5/angular.js?evaluate=true|false
>
> It still feels a bit magical and as a user you need to infer that the
> resource you’re accessing is the one after the “webjars” segment (you must
> have this knowledge), whereas when you have the following you make it
> explicit and remove the magic (anyone can understand it without having to
> read any documentation): http://
> <server>/xwiki/webjars?resource=angularjs/1.1.5/angular.js&evaluate=true|false
>

I guess the same can be said about
"http://<server>/xwiki/rest/<resourceURIPart>".
You have to know the *endpoint* of the API you are accessing, whether it's
a REST resource, a webjar resource or anything else, depending on the
resource type, there is a particular endpoint associated with it that you
need to know. I find that perfectly acceptable :)

The same mention about "/" path separator probably applies for the REST API
again.

Thanks,
Eduard


> However, since I understand the need I’m +0.
>
> Thanks
> -Vincent
>
> > Thanks,
> > Eduard
> >
> >
> > > I’m curious to know what others think.
> > >
> > > Thanks
> > > -Vincent
> > >
> > >
> > > On 3 Apr 2015 at 18:39:09, Eduard Moraru ([email protected](mailto:
> > > [email protected])) wrote:
> > >
> > > > Hi,
> > > >
> > > > Currently, the webjars URL mapping is the following:
> > > >
> > > > http://localhost:8080/xwiki/bin/webjars/resources/path?value=
> > > > %2F%2F
> > > >
> > > > Example:
> > > > $services.webjars.url('codemirror', 'lib/codemirror.js')
> > > > returns
> > > >
> > >
> http://localhost:8080/xwiki/bin/webjars/resources/path?value=codemirror%2F5.1/lib/codemirror.js
> > > >
> > > > The problem with this is that require modules that use relative
> paths for
> > > > their dependencies are broken because of the URL mapping we use, more
> > > > specifically by the "?" character inside the URL we use.
> > > >
> > > > A concrete example is the CodeMirror webjar that defines its own
> modules
> > > > which express their dependencies relatively: "../../lib/codemirror"
> > > >
> > > > Here we have a problem, since if we directly depend on
> > > > "$services.webjars.url('codemirror', 'mode/css/css.js')", the module
> will
> > > > fail to find its relatively defined dependency.
> > > >
> > > > One approach would be to define paths, so that requirejs can work its
> > > magic:
> > > >
> > > > require.config({
> > > > paths: {
> > > > cm : "
> > > >
> > >
> http://localhost:8080/xwiki/bin/webjars/resources/path?value=codemirror%2F5.1
> > > > "
> > > > }
> > > > });
> > > >
> > > > require(["cm/lib/codemirror", "cm/mode/css/css"], function
> (CodeMirror) {
> > > > console.log(CodeMirror);
> > > > });
> > > >
> > > > This properly finds "/lib/codemirror.js" and "mode/css/css.js" that
> we
> > > > explicitly request, however, the internal dependency of css.js fails
> to
> > > be
> > > > found at the resolved URL "
> > > >
> > >
> http://localhost:8080/xwiki/bin/webjars/resources/path?value=codemirror%2F5.1/lib/codemirror
> > > > ".
> > > >
> > > > Requirejs does not add the ".js" extension to the resolved path
> because
> > > the
> > > > resolved path contains a "?" character so it is considered an
> absolute
> > > URL,
> > > > not a relative path.
> > > >
> > > > The proposal is to stop using this URL mapping, since it is awkward
> to
> > > have
> > > > paths in parameters and, instead, use a more intuitive one that is
> both
> > > > good for clients and for requirejs.
> > > >
> > > > The proposed mapping/scheme is:
> > > >
> > > > http://localhost:8080/xwiki/bin/webjars///
> > > >
> > > > Any additional parameters that we might need for the webjars action
> would
> > > > be appended at the end. There is currently 1 case that I know of,
> which
> > > is
> > > > "evaluate=true|false".
> > > >
> > > > Without this change, I can not find any solution to using a webjar
> such
> > > as
> > > > CodeMirror that uses relative defined modules.
> > > >
> > > > Thanks,
> > > > Eduard
> > > >
> > > > P.S.: Any additional advice on using requirejs to circumvent this
> > > > limitation is most than welcomed.
>
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to