Hi

I am working for a client which needs support for tenants and because the 
current implementation of the Tenants in Sling is just that but no integration 
I started to code a workaround. For now I have a patch that does the trick but 
it is not clean because I use a Servlet Filter to place the tenant id on a 
thread local instance. Afterwards I started to look into how to implemented 
this cleanly into the current version of Sling.

There are a few areas that need to be changed in order to implement tenant 
support. For now I am only looking into how to implement a “per-call overlays 
of servlets / JSPs” in order to give tenants the chance to change aspects of 
their presentation.

1) Tenant Identification: Sling must be able to identify a tenant. This can be 
a sub domain, path, cookies or even parameters. This means the client needs to 
provide a service which is then used by Sling in order to retrieve the tenant 
and provide it to whomever wants to use it.

2) Servlet Resolver needs to be changed twofolds
        a) Being able to extend the search path for Servlets / JSPs based on 
the tenant’s data
        b) Caching the Servlets / JPSs separated for different tenants

3) Change the Felix OSGi Web Plugin to allow the clients to add properties 
(single and multi values)


For 1) I would suggest just to define an interface the client can implement as 
an OSGi service which is used to identify a tenant. Then somewhere in the 
SlingMainServlet or the Request Data the Tenant is retrieved set on the Sling 
Http Servlet Request and if applicable the Search Path of the Resource Resolver 
is “enhanced/extended”.

For 2) I would suggest to add a new property to the Resource Resolver which 
contains the Search Path Extension. Because the Servlet Resolver uses the 
Administrative Resource Resolver we need a way to “Enhance the Search Path” for 
that particular call. This could be done with a one-off wrapper. Based on the 
Extended Search Path we can determine which Servlet is an overlay and cache the 
overlays separately.

3) should be straight forward.

Carsten was suggesting something like a TenantProvider like the ServletProvider 
but in the current code the ServletProvider is called with either the Sling 
Servlet Request, the Resource or a Resource Resolver and path. This means the 
tenant id must be available to any of these calls which would require to put 
the tenant id inside the Resource Resolver.

Let me know what you think.

- Andy Schaefer

Reply via email to