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!!!!