Right, 2) and also 3) are good reasons to keep it separate. I think it
makes sense to link the search path extension somehow to the tenant.
In the old proposal (
https://cwiki.apache.org/confluence/display/SLING/Multitenancy+Support) we
suggested to have a special method on the resource resolver factory to get
a tenant aware resource resolver - while this sounds nice, it bloads the
resource resolver api and directly couples it.
I still like my TenantAware approach :) as by this you explicitely mark
your component to handle things Tenant specific.

Regards
Carsten


2014-02-25 2:41 GMT+01:00 Andreas Schaefer Sr. <schaef...@me.com>:

> If we have the search path extension separate and it is settable we do the
> following with it:
>
> 1) We can set it with a Servlet Filter instead of having it to hook into
> the Engine
>
> 2) In the Servlet Resolver the Search Path that did deliver the Servlet
> can be used in order to manage the cache. For example if a Servlet it found
> in the tenant's own folder then it will be added to the cache of this
> folder, if it is found in a shared path then it is placed in the shared
> cache and the rest will be still cache system wide. When looking for a
> cached entry we just to through the Search Path Extension entries, look for
> a cache and if the servlet is found ok otherwise we need to load it. This
> way the cache is only cache a Servlet once and not multiple times if the
> cache would be per tenant.
>
> 3) The adjustment of the Search Path for the Administrative Resource
> Resolver can be done without having to blindly replacing the Search Path.
>
> That said it might a good idea to add the getSearchPathExtension() to the
> Tenant because it has such a central role but I would keep the Tenant out
> of the Engine or the Servlet Resolver if possible.
>
> - Andy
>
> On Feb 24, 2014, at 1:09 PM, Carsten Ziegeler <cziege...@apache.org>
> wrote:
>
> > If you want the method to get the search paths extensions to be on the
> > resource resolver and make it independent of a tenant, then why do we
> need
> > this method at all?
> > In the case of a tenant getSearchPath would return the normal search path
> > with the tenant specific one prepended.
> >
> > Carsten
> >
> >
> > 2014-02-24 18:43 GMT+01:00 Andreas Schaefer Sr. <schaef...@me.com>:
> >
> >> Hi Carsten
> >>
> >> Even if a Search Path Extension is not used outside of the Tenants I
> still
> >> think it would be great to keep things separate. Based on my tests if
> the
> >> Search Path Extension is set when the Resource Resolver of a request is
> >> created and the Servlet resolver's own Resource Resolver is temporary
> >> extended with the same Search Path Extension we can provide a tenant
> >> specific view with multiple tenants.
> >>
> >> Even though I like the idea of a Tenant Adapter Factory I don't think
> this
> >> works out. Tenants are not only used for logged in users but also for
> the
> >> public view and the resource path is limited as well because what if the
> >> tenant viewer is requesting a common page (landing page etc) but the
> tenant
> >> provided some customization on the imported sub pages (ESPs, JSPs and
> >> Servlets) through overlays.
> >>
> >> If a Thread Local is ok and we could make the Search Path Extension on
> the
> >> Resource Resolver settable then we could use a Request Servlet Filter to
> >> extract the Tenant from the Request using a Service which the host can
> >> override to resolve the Tenant and then set the Search Path Extension.
> From
> >> there on the Servlet Resolver does not need to know if this is a Tenant
> >> because the Search Path Extension of the Request or Resource is enough
> to
> >> provide tenant specific view.
> >>
> >> Cheers - Andy
> >>
> >> On Feb 21, 2014, at 10:06 AM, Carsten Ziegeler <cziege...@apache.org>
> >> wrote:
> >>
> >>> Hi Andy,
> >>>
> >>> I'm not sure if we need search path extensions which are not related to
> >>> tenants.
> >>> The adaption to a tenant does not tie it to the resource resolver
> module,
> >>> the adapter factory can live in the tenant module and therefore the
> >>> resource resolver module is totally unaware of tenant handling. The
> >>> adaption can internally use a thread local which holds the tenant from
> >> the
> >>> request, so even for administrative resource resolvers, an adaptTo
> would
> >>> work within the context of a request.
> >>>
> >>> But these are just rough ideas anyway :)
> >>>
> >>> Regards
> >>> Carsten
> >>>
> >>>
> >>> 2014-02-21 17:16 GMT+01:00 Andreas Schaefer Sr. <schaef...@me.com>:
> >>>
> >>>> Hi Carsten
> >>>>
> >>>> First I want to clarify that the Search Path Extension has nothing to
> do
> >>>> with Tenants per se but is a "per-call" extension of the search path
> >> which
> >>>> could be used without tenants.In order to make the overlays work the
> >> Search
> >>>> Path Extension must be set early on. For this part the client could
> >>>> implement a Service or configure a Service to obtain the Search Path
> >>>> Extension.
> >>>>
> >>>> Currently I have a working POC for a client using CQ 5.6.1 which uses
> >> this
> >>>> concept to having Servlets/JSP overlays but also tenant specific
> >>>> translation (I18n) both working through the Search Path Extension.
> >>>>
> >>>> The TenantResolver is an good idea but the
> >>>> ResourceResolver.adaptTo(Tenant.class) might be a problem due to the
> >>>> Administrative Resource Resolver (Servlet Resolver) and also ties
> >> Tenants
> >>>> into the Resource Resolver module.
> >>>>
> >>>> - Andy
> >>>>
> >>>> On Feb 20, 2014, at 11:32 PM, Carsten Ziegeler <cziege...@apache.org>
> >>>> wrote:
> >>>>
> >>>>> Hi Andy,
> >>>>>
> >>>>> this sounds interesting - and I guess a patch would be great. Now I
> >> just
> >>>>> would like to present my idea again - just for the sake of discussion
> >> :)
> >>>>>
> >>>>> I think over time there will be more components than just the servlet
> >>>>> resolver which make use of the tenant and the extended search path,
> so
> >> I
> >>>>> think it would be great to have some generic mechanism to get the
> >>>> "current"
> >>>>> tenant.
> >>>>> My first idea was to have a TenantAware interface which passes in a
> >>>>> TenantResolver (bad name) instance. And whenever the tenant aware
> >>>> component
> >>>>> needs the current tenant it asks the resolver, maybe a method like
> >>>>> Tenant getTenant(ResourceResolver resolver)
> >>>>> We could then extend the Tenant interface to provide the extended
> >> search
> >>>>> path.
> >>>>>
> >>>>> This would keep all the tenant extension stuff out of the resource
> >>>> resolver
> >>>>> - and would just be an extension.
> >>>>>
> >>>>> Instead of using a TenantResolver we could go with
> >>>>> ResourceResolver.adaptTo(Tenant.class)
> >>>>>
> >>>>> WDYT?
> >>>>>
> >>>>> Carsten
> >>>>>
> >>>>>
> >>>>> 2014-02-21 7:53 GMT+01:00 Andreas Schaefer Sr. <schaef...@me.com>:
> >>>>>
> >>>>>> Sorry, I forgot to mention that the Search Path Extension is
> prepended
> >>>> to
> >>>>>> the Search Path when it is requested (in the Resource Resolver).
> >>>>>>
> >>>>>> - Andy
> >>>>>>
> >>>>>> On Feb 20, 2014, at 10:20 PM, Andreas Schaefer Sr. <
> schaef...@me.com>
> >>>>>> wrote:
> >>>>>>
> >>>>>>> Hi
> >>>>>>>
> >>>>>>> I started to look into how to add tenant support to Sling.
> >>>>>>>
> >>>>>>> This is my test scenario:
> >>>>>>>
> >>>>>>> I have an /apps/foo/bar/html.esp and a
> /apps/tenant1/foo/bar/html.esp
> >>>>>> and a /content/mynode entry. The title of the second html.esp is
> >>>> different
> >>>>>> so that I know which one is loaded.
> >>>>>>>
> >>>>>>> Changes to the code:
> >>>>>>>
> >>>>>>> 1) Added get/setSearchPathExtension() to the Resource Resolver and
> >> its
> >>>>>> implementation.
> >>>>>>>
> >>>>>>> 2) In the SlingRequestProcessorImpl I extract the tenant from the
> >> first
> >>>>>> sub domain (no OSGi Service yet) and prepend it with /apps/ to the
> >>>> Search
> >>>>>> Path Extension
> >>>>>>>
> >>>>>>> 3) In the Servlet Resolver added the code to set the Search Path
> >>>>>> Extension from the Resource's Resource Resolver onto the Script
> >> Resource
> >>>>>> Resolver.
> >>>>>>>
> >>>>>>> Ran it and it showed the Tenant Specific ESP when the host name
> has a
> >>>>>> tenant it as sub domain and the original ESP when used with
> localhost.
> >>>>>>>
> >>>>>>> This shows that is it basically possible to thread through the
> tenant
> >>>>>> Search Path on a per-call basis to the Servlet Resolver. There is
> >> still
> >>>>>> much to do like the Cache handling in the Servlet Resolver and a
> OSGi
> >>>>>> service that provides the tenant from a request.
> >>>>>>>
> >>>>>>> I can create an Issue and add a patch of my changes to it if anyone
> >> is
> >>>>>> interested.
> >>>>>>>
> >>>>>>> Cheers - Andy
> >>>>>>>
> >>>>>>> On Feb 17, 2014, at 6:58 PM, Andreas Schaefer Sr. <
> schaef...@me.com>
> >>>>>> wrote:
> >>>>>>>
> >>>>>>>> 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
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>> --
> >>>>> Carsten Ziegeler
> >>>>> cziege...@apache.org
> >>>>
> >>>>
> >>>
> >>>
> >>> --
> >>> Carsten Ziegeler
> >>> cziege...@apache.org
> >>
> >>
> >
> >
> > --
> > Carsten Ziegeler
> > cziege...@apache.org
>
>


-- 
Carsten Ziegeler
cziege...@apache.org

Reply via email to