Hi

Am 16.11.2013 um 00:11 schrieb Amit.. Gupta. <amitg...@adobe.com>:

>> So, finally, I agree that baking the feature flag support directly into the 
>> ResourceResolver implementation is suboptimal, it is probably still the most 
>> comprehensive and complete solution to the requirements. And I cannot 
>> conceive plugin hooks (at this point) to define such that we can do feature 
>> flag plugins.
> 
> I think that we should not put it directly into ResourceResolver, because if 
> resourceResolver does not give me a resource if feature is disabled, Resource 
> will stop existing for me. There will be no way to access that resource using 
> ResourceResolver api i.e. let's say I want to remove sling:feature attribute 
> from that resource, I can't do that. 

Ah ! Excellent point. Thanks.

OTOH, a feature flag is there for a reason — hiding the resource if desired so. 
If your resource resolver happens to be affected, so be it.. I think that is a 
consequence. If you know, though, that the resource exists and is guarded by a 
feature flag, you can still make sure to temporarily enable the feature in your 
current context to remove the flag.

Hmm, maybe a Feature.runWith(String feature, Callable<T>) to call a Callable 
with the named feature enabled would help ;-)


> ResourceResolverDecorator should be the way to go (implementation could be 
> restricted i.e. queryResources not supported), additionally providing a 
> servlet filter as Alex suggested.

I am not in favor of having restricted implementations because this tends to 
result in inconsistent behaviour.

Regards
Felix

> 
> Thanks,
> Amit
> 
> -----Original Message-----
> From: Felix Meschberger [mailto:fmesc...@adobe.com] 
> Sent: 15 November 2013 13:11
> To: dev@sling.apache.org
> Subject: [OT] Feature flag influence on Resource access (Was: FYI: feature 
> flags prototype)
> 
> Hi
> 
> TL;DR: Long discussion on why I think Feature flag support should currently 
> be baked into the ResourceResolver implementation.
> 
> I am forking of this discussion now to step back a bit and really look into 
> what we expect from Feature flag support in the ResourceResolver. I go by the 
> main resource access or methods there, so:
> 
> * resolve() -> Resource
> Calculates a virtual list of resource candidates and returns the first one. 
> Applying feature flags, it might not return the first one.
> Another level of features could be applied to supporting feature flags in the 
> /etc/map mappings leading to the list of candidate resources.
> 
> * map -> String
> The input path is first converted into a resource, which may have a feature 
> flag applied.
> In addition to applying a feature flag to the resource which is finally 
> mapped the /etc/map mappings can also be "filtered" with feature flags.
> 
> * getResource() -> Resource
> For absolute path its a single yes/no question: Is the resource visible or 
> not according to the feature flag.
> For relative paths its not as simple since the ResourceResolver iterates the 
> search path looking for a resource. So each canidate is looked at and has to 
> have its feature flag inspected. (feature flags of ancestors are ignored; 
> only feature flags in the candidate resource itself are considered; so no 
> feature flag inheritance down the tree)
> 
> * getParentResource() -> Resource
> This is not an interesting case because it accesses the parent resource using 
> the absolute path and we would not expect to get null here (except if the 
> argument resource is the root resource).
> 
> * listChildren -> Iterator<Resource>
> * getChildren -> Iterable<Resource>
> * queryResources -> Iterator<Map<String,Object>>
> * findResources -> Iterator<Resource>
> Simple case here: We just exclude child resources whose feature flag refers 
> to a disabled feature.
> 
> What options do we have ?
> 
> * ResourceResolverDecorator (to be specced/implemented): Will have to do 
> extra work getResource to iterate the search path for relative resources to 
> consider the feature flag - might optimize by only iterating if the actual 
> getResource method returns a resource with a disabled feature flag. 
> Iterator<Resource> can simply be decorated, too. queryResources is harder 
> again because this might contain results from queries which should not be 
> included according to the feature flag (so each entry would have to be 
> inspected, if at all possible). Also: A ResourceDecorator cannot properly 
> handle feature flags in /etc/map mappings at all and also support feature 
> flags on resolveResource is probably hard to implement because the list of 
> canidate resources is influence by /etc/map mappings so a decorator would 
> have to replicate that work.
> 
> * ResourceAccessGate: This is not leveraged by all ResourceProviders and we 
> expressely leave it to these services to indicate the use of a gate. Defining 
> Feature flag support to have all ResourceProviders require to leverage 
> ResourceAccessGate sounds contradictionary. Also, while a case can be made 
> for the Feature flag to be some kind of an access gate, the actual idea of 
> the ResourceAccessGate is actual access control as in secure access. Also we 
> just want to apply the feature flag "gate" to all Resourceproviders not a 
> generic ACL gate which may also be defined.
> 
> * Bake Feature support into the ResourceResolver implementation: This solves 
> the ResourceResolverDecorator problems by being able to handle Feature flags 
> early. But is bears the problem of overloading the implementation with the 
> feature flag support.
> 
> So, finally, I agree that baking the feature flag support directly into the 
> ResourceResolver implementation is suboptimal, it is probably still the most 
> comprehensive and complete solution to the requirements. And I cannot 
> conceive plugin hooks (at this point) to define such that we can do feature 
> flag plugins.
> 
> Is the ServletResolver also affected by feature flags ? Probably not: The 
> ResourceResolver does filter on resource feature flags and the 
> SlingScriptAdapterFactory may apply feature flags for scripting languages and 
> Servlet services may implement OptingServlet and query feature flags in the 
> accepts method.
> 
> Regards
> Felix

Reply via email to