package com.googlecode.tawus.internal.transform;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.plastic.MethodAdvice;
import org.apache.tapestry5.plastic.MethodDescription;
import org.apache.tapestry5.plastic.MethodInvocation;
import org.apache.tapestry5.plastic.PlasticClass;
import org.apache.tapestry5.plastic.PlasticMethod;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.apache.tapestry5.services.transform.TransformationSupport;
import com.googlecode.tawus.annotations.XHR;
public class XHRWorker implements ComponentClassTransformWorker2
{
private Request request;
public XHRWorker(Request request)
{
this.request = request;
}
public void transform(PlasticClass plasticClass, TransformationSupport support, MutableComponentModel model)
{
for(final PlasticMethod method : plasticClass.getMethodsWithAnnotation(XHR.class))
{
MethodDescription description = method.getDescription();
if(!"void".equals(description.returnType))
{
method.addAdvice(new MethodAdvice()
{
public void advise(MethodInvocation invocation)
{
invocation.proceed();
Object result = invocation.getReturnValue();
if(!request.isXHR())
{
if(result != null)
{
result = defaultForReturnType(result.getClass());
}
}
invocation.setReturnValue(result);
}
});
}
else
{
throw new RuntimeException("XHR can be applied to non-void event handlers only");
}
}
}
private Object defaultForReturnType(Class<?> returnType)
{
if(!returnType.isPrimitive())
return null;
if(returnType.equals(boolean.class))
return false;
return 0;
}
}