Marking which methods to intercept
Problem:
You want to intercept some methods, and not others, but there is no obvious way to for the code to determine which methods need interception.
Solution 1
Mark the methods to be intercepted with an annotation of your choosing, then use the InterceptionBuilder to apply an AnnotationPresentRule to your stack.
For example:
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure { }
public interface HttpHandler
{
public void service(HttpServletRequest request, HttpServletResponse response);
}
public class MySecureService implements HttpHandler
{
@Secure
public void service(HttpServletRequest request, HttpServletResponse response) { /* ... */ }
}
public class SecureHandlerInterceptor implements MethodInterceptor
{
public Object invoke(MethodInvocation invocation) throws Throwable
{
HttpServletRequest request = (HttpServletRequest) invocation.getArguments()[0] ;
if(!request.isSecure())
{
throw new SecurityException();
}
return invocation.proceed();
}
}
public InterceptionInjector createInjector()
{
InterceptionBuilder builder = new InterceptionBuilder();
builder.whenPresent(Secure.class, new SecureHandlerInterceptor());
MethodInterceptorStack stack = builder.done();
return new ProxyInjector(stack);
}
Solution 2
Use the MethodNameRule or the MethodPatternRule to match based on the names of the methods. The InterceptionBuilder can be used to apply these inteceptors to your stack.