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

