Hi Duy, +1 for using resource providers. It is also the recommended approach for integrating third-party data sources - if you intend to leverage Sling's resource resolution and -rendering for the views. If that is not the case, I would say it does not make much sense to use Sling - after all, you would bypass almost all of its core features and merely use it as a middleware platform.
Another option is to use NEBA (http://neba.io), in which case you can use Spring MVC (http://neba.io/userguide.html#springmvc), which would make the path-based parameter extraction significantly easier. I don't what you external data sources are, but in case it's relational, you could then also use Spring's JDBC templating or ORM abstraction to access that data. Kind regards, Olaf -----Original Message----- From: Julian Sedding [mailto:[email protected]] Sent: Montag, 9. März 2015 12:09 To: [email protected] Subject: Re: Route mapping for dynamic resources in Sling Hi Duy You may want to implement a ResourceProvider. It allows you to hook an arbitrary resource subtree into Sling's resource tree backed by your won logic. For the read-only case that's not even very complicated. Bertrand created a PlanetResourceProvider example some time ago[0]. That may be helpful. Regards Julian [0] http://svn.apache.org/repos/asf/sling/trunk/launchpad/test-services/src/main/java/org/apache/sling/launchpad/testservices/resourceprovider/ On Mon, Mar 9, 2015 at 9:42 AM, Duy Nguyen <[email protected]> wrote: > For some reasons (large data set, continuous changes in the original > data, etc.), I'm not motivated to import the whole external data into > the node tree structure. > > You're right that the universal servlet solution seems to be the very > last choice, but I couldn't find any other way without importing the > data. > > Any other advices are very welcomed! > > Thanks, > Duy > > On Sun, Mar 8, 2015 at 1:22 PM, <[email protected]> wrote: >> >> >> >> So in my naïve response to your situation. I don’t see the problem with >> mapping directly to the resource model, the first thing I would do is to >> import the information into the node tree structure. The exact structure >> isn’t really important as long as it mirrors the intent of the request. >> >> >> >> >> /content/document1 >> >> /content/document2 >> >> /content/document2/true/version1 >> >> /content/document2/true/version2 >> >> >> >> >> Then for each level where a file should be returned uses a sling >> sling:resourceType that returns the file. >> >> >> >> >> If you have restrictions, like you know the name of the file but the >> versions of the file are maintained separately and you don't have an ability >> to import. >> >> >> >> >> You can have a node structure like >> >> >> >> >> /content/{document}/true >> >> >> >> >> With the sling:resourceType for the document retrieving the document in >> question and the resourceType for true locating the version that's being >> requested. >> >> >> >> >> If you don't know the document ahead of time, then you're back to a very >> generic servlet interacting with another system. I would still avoid the >> universal solution and look to implement something very specific for these >> types of requests, based an identifier for the service. >> >> >> -Jason >> >> >> >> >> >> >> >> >> >> >> >> >> From: Duy Nguyen >> Sent: Friday, March 6, 2015 12:14 PM >> To: [email protected] >> >> >> >> >> >> Hi, >> >> Sorry for the formatting error, as there were 3 different urls actually: >> >> /myhost/{documentName} >> >> /myhost//{hasRevision}/{revisionID} >> >> /myhost/-/users/{userName} >> >> * So in your example, it is like: >> >> /host/whitepaper >> >> /host/whitepaper/true/version-1 >> >> /host/-/users/john123 >> >> (I avoid .pdf as it can be misleading to a selector which is not the >> idea of my question) >> >> --- >> Duy >> >> >> On Fri, Mar 6, 2015, at 15:15, Jason E Bailey wrote: >> >> So I can get a clear picture of the request, a typical request would >> be for? >> >> /host/whitepaper.pdf/host/true/version-1/host/-/users/john123 >> >> >> --=20 >> Jason >> >> On Fri, Mar 6, 2015, at 09:50 AM, Duy Nguyen wrote: >>> Hello, >>>=20 >>> I'm bringing here a use case in Sling and look forward to receiving >>>some opinions from the community. >>>=20 >>> I need to write a server-side app that serves customized RESTful >>>APIs for a client app (which is stable and the set of APIs is >>>fixed). The problem comes from "ugly" API urls that can hardly be >>>mapped into the resource model of Sling, for example: >>>=20 >>> */myhost/{documentName}/myhost/{**documentName* >>> *}/{hasRevision}/{revisionID}/myhost/-/users/{userName}* >>>=20 >>> Especially properties like =E2=80=9CdocumentName", >>>=E2=80=9CrevisionID" a= >> nd "userName" >>> are >>> not necessarily stored in jcr resources, but can also be from >>> external sources. The flag =E2=80=9ChasRevision=E2=80=9D is either >>> true or false v= >> alue, to check >>> if >>> the document has revision to be returned. So there must be some >>>middleware that handles the requests coming to each of those paths >>>(to determine if the needed resource can be retrieved from jcr or >>>external sources, and revision to be taken into account). >>>=20 >>> Thinking in the implementation of some regular web frameworks >>>(Django, Sinatra, etc.), it can be done by route mapping, such as: >>> *get("/myhost/:**documentName* >>> */:hasRevision?/:revisionID?") function() >>> {=E2=80=A6}get("/myhost/-/users/:userName") function() {=E2=80=A6}* >>>=20 >>> Initially I have come up with two solutions in Sling: >>>=20 >>> 1- Write a "global SlingServlet" for "/myhost/", and then the rest >>>of the url are params that will be analyzed in the servlet to handle >>>different request patterns. However I don't think this is a very >>>elegant solution, because this only one servlet is responsible for >>>all requests following the path. >>>=20 >>> 2- Use Sling Resource Mappings >>> >>><http://sling.apache.org/documentation/the-sling-engine/mappings-for- >>>reso= >> urce-resolution.html> >>> to >>> redirect the requests (categorized by reg-ex) to different >>>resources, and then write separate SlingServlet for each of those >>>resources. I still have some doubt if this is feasible. >>>=20 >>> Do you have some suggestions? >>>=20 >>> Thanks, >>> Duy
