Hi,

I've started with a new approach to implement the feature flags - the focus
is on the API, which means what features do our feature flags have and how
can they report it. (The implementation should be functional but I haven't
checked it yet).
I went back and forth with different approaches based on Bertrands
prototype and all the discussions and I think this approach is the most
promising one:

The central service for client code is the Features service:
public interface Features {

    String[] getFeatureNames();

    boolean isAvailable(String featureName);

    ClientContext createClientContext(ResourceResolver resolver);
    ClientContext createClientContext(SlingHttpServletRequest request);

    ClientContext getCurrentClientContext();

}

This can be used to find out which features are available and to create a
client context - the context is either based on a request or on a resource
resolver.
The client context in turn can be used to find out whether a feature is
enabled:
public interface ClientContext {

    boolean isEnabled(String featureName);

    Collection<String> getEnabledFeatures();
}

So a script can use this, to do things differently etc.
In addition the Features services provides the "current client context"
which is automatically available for a request.

Now, somehow we need an API to define which feature is available and what
it does - I came up with an extended version of the FeatureProvider (and
I'm not so sure about this one):
public interface FeatureProvider {

    String [] getFeatureNames();

   boolean isEnabled(String featureName, ProviderContext context);

    Map<String, String> getResourceTypeMapping(String featureName);

    boolean hideResource(String featureName, Resource resource);
}
It's similar to the Bertrand's version, except that it takes a
ProviderContext (which allows access to the request and resource resolver)
and has two additional methods control the two most wanted features: hiding
resources and changing of resource types.

We could then implement this provider reading OSGi configurations or
whatever to define features.

All constructive feedback welcome - and as I said, let's first define the
API

Everything can be found at:
http://svn.apache.org/repos/asf/sling/whiteboard/feature-flags/

Regards
Carsten
-- 
Carsten Ziegeler
[email protected]

Reply via email to