package org.jboss.seam.core;
import static org.jboss.seam.ComponentType.ENTITY_BEAN;
import java.lang.reflect.Method;
import org.jboss.seam.Component;
import org.jboss.seam.annotations.intercept.AroundInvoke;
import org.jboss.seam.annotations.intercept.Interceptor;
import org.jboss.seam.contexts.Context;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.contexts.Lifecycle;
import org.jboss.seam.intercept.AbstractInterceptor;
import org.jboss.seam.intercept.InvocationContext;
import org.jboss.seam.security.SecurityInterceptor;
/**
* Sets up the METHOD context and unproxies the SFSB
* for the duration of the call.
*
* @author Gavin King
*
*/
@Interceptor(stateless=true, around={BijectionInterceptor.class, EventInterceptor.class, SecurityInterceptor.class})
public class MethodContextInterceptor extends AbstractInterceptor
{
private static final long serialVersionUID = 6833040683938889232L;
@AroundInvoke
public Object aroundInvoke(InvocationContext ctx) throws Exception
{
Component comp = getComponent();
String name = comp.getName();
Object target = ctx.getTarget();
Method method = ctx.getMethod();
Object[] parameters = ctx.getParameters();
Context outerMethodContext = Lifecycle.beginMethod();
try
{
Contexts.getMethodContext().set(name, target);
Contexts.getMethodContext().set("org.jboss.seam.this", target);
Contexts.getMethodContext().set("org.jboss.seam.method", method);
Contexts.getMethodContext().set("org.jboss.seam.parameters", parameters);
Contexts.getMethodContext().set("org.jboss.seam.component", comp);
return ctx.proceed();
}
finally
{
Lifecycle.endMethod(outerMethodContext);
}
}
public boolean isInterceptorEnabled()
{
return getComponent().getType()!=ENTITY_BEAN;
}
}