You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wink.apache.org by Darin Amos <da...@gmail.com> on 2014/02/06 20:09:40 UTC
Intercept and change implementation method
Hello,
I have an Apache Wink customization that I would like to implement for my client that I wanted to check for approval within the Apache Wink community. My worry is I am touching objects I should not be touching. I have a need (that is fairly difficult to explain) to execute a method within my resource handler before the method that serves the request. Below I have shown a very simple sample. I have created a RequestHandler that modifies the reflectionMethod of the SearchResult and sets it back at the end of the request.
I would greatly appreciate if anyone had a thought about the customization and would advice me do something else. The code I want to execute must be within my resource handler as I have below because all my resource handlers must extend an abstract class, and the code I need to execute is a method within that abstract class. The Resource Handler must also be fully instantiated because the code in my clients method uses the objects populated by the MessageContext.
****
I just realized as I was typing this email that I don’t believe I can do this because I am going to have concurrency issues when another identical request comes in before this request finishes…...
***
Thanks in advance!
My Resource Handler and my Request Handler code below:
public abstract class MyAbstractResourceHandler extends MyClientsAbstractResourceHandler{
@Context
protected InterceptingContext interceptingContext = null;
public Object doInterception(){
super.doSomething();
return interceptingContext.getMethod().invoke(interceptingContext.getInvocationParams());
}
}
@Override
public void handleRequest(MessageContext messageContext, HandlersChain handlersChain) throws Throwable {
SearchResult searchResult = messageContext.getAttribute(SearchResult.class);
MethodMetadata methodMetaData = searchResult.getMethod().getMetadata();
Method javaMethod = methodMetaData.getReflectionMethod();
try{
Object[] parameters = searchResult.getInvocationParameters();
InterceptingContext interceptingContext = new InterceptingContextImpl(javaMethod, parameters);
messageContext.setAttribute(InterceptingContext, interceptingContext);
Method interceptingMethod = MyAbstractResourceHandler.class.getMethod(“doInterception”);
searchResult.getMethod().getMetadata().setReflectionMethod(interceptingMethod);
searchResult.setInvocationParameters(new Object[]{});
handlersChain.doChain(messageContext);
}
finally{
methodMetaData.setReflectionMethod(javaMethod);
}
}
Thanks!!!!