package org.jboss.seam.wicket.ioc;
import static org.jboss.seam.util.Reflections.invokeAndWrap;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import org.jboss.seam.util.Reflections;
/**
* Implementation of BijectedAttribute for a method
* @author Pete Muir
*
*/
public abstract class BijectedMethod<T extends Annotation> implements BijectedAttribute<T>
{
private Method method;
private T annotation;
private String contextVariableName;
public BijectedMethod(Method method, T annotation)
{
this.method = method;
this.annotation = annotation;
contextVariableName = getSpecifiedContextVariableName();
if (contextVariableName == null || "".equals(contextVariableName))
{
if ( method.getName().matches("^(get|set).*") && method.getParameterTypes().length==0 )
{
contextVariableName = method.getName().substring(3);
}
else if ( method.getName().matches("^(is).*") && method.getParameterTypes().length==0 )
{
contextVariableName = method.getName().substring(2);
}
}
}
public Method getMember()
{
return method;
}
public T getAnnotation()
{
return annotation;
}
public void set(Object bean, Object value)
{
method.setAccessible(true);
invokeAndWrap( method, bean, value );
}
public Object get(Object bean)
{
method.setAccessible(true);
return invokeAndWrap(method, bean);
}
public Class getType()
{
return method.getParameterTypes()[0];
}
@Override
public String toString()
{
return "BijectedMethod(" + Reflections.toString(method) + ')';
}
protected abstract String getSpecifiedContextVariableName();
public String getContextVariableName()
{
return contextVariableName;
}
}