You can't share filter instances between different target resources; you
have to create a new instance for each target.

If you're just looking to reduce clutter, try this:

SessionFactory sf = ...; // field of Application

public Restlet withReadFiltered(Class<? extends ServerResource>
resourceType) {
    Restlet result = new HibernateReadFilter(sf);
    result.setNext(resourceType);
    return result;
}
// similarly for withUpdatedFiltered

// Then, in createInboundRoot(), use these methods to wrap resource classes:
    Router router = new Router();
    router.attach("/account/read", withReadFiltered(AccountRead.class));
    router.attach("/something/read", withReadFiltered(SomethingRead.class));
    router.attach("/account/update",
withUpdateFiltered(AccountUpdate.class));

You could get cleverer by subclassing Router to do the work for you.

public abstract class FilteringRouter extends Router {

    protected FilteringRouter(Context context) {
        super(context);
    }

    public void addFilter(String pattern", Class<? extends Filter>
filterType) {
        // Add to map from pattern to filter type.
        // Implement patterns however you want, but probably simplest to
use java.util.regex.
    }

    @Override public TemplateRoute attach(String path, Class<? extends
ServerResource> resourceType) {
        Class<? extends Filter> filterType = lookupFilterFromPath(path);
        if (filterType == null) {
            return super.attach(path, resourceType);
        }
        Filter filter = createFilter(filterType);
        filter.setNext(resourceType);             // Wish we could chain
these!
        return attach(path, filter);
    }

    /** Override to produce your application-specific filters (e.g.,
SessionFactory-based). */
    protected abstract Filter createFilter(Class<? extends Filter>
filterType);

    private Class<? extends Filter> lookupFilterFromPath(String path) {
        // Return filter type corresponding to first pattern matching path.
    }

}

If you do this, you'll have to make the addFilter calls *before* doing the
attaching. Note that you have to pass the Filter *type* to addFilter, not
an instance.

--tim

On Mon, Mar 5, 2012 at 10:49 AM, Dencel <[email protected]> wrote:

> Is it possible to do transparent filtering based on a pattern?
>
> So instead of something like;
> ==========================================
> Router router = new Router();
> SessionFactory sf = ...;
> HibernateReadFilter hrf = new HibernateReadFilter(sf);
> hrf.setNext(AccountRead.class);
> router.attach("/account/read",hrf);
>
> HbUpdateFilter huf = new HbUpdateFilter(sf);
> huf.setNext(AccountUpdate.class);
> router.attach("/account/update",huf);
> ==========
>
> I can use something like:
> ===========================================
> Router router = new Router();
> router.attach("/account/read",AccountRead.class);
> router.attach("/something/read",SomethingRead.class);
> router.attach("/account/update",AccountUpdate.class);
> router.addFilter("*/read",hrf);
> router.addFilter("*/update",huf);
>
> ------------------------------------------------------
>
> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2931170
>

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2931185

Reply via email to