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