package org.jboss.resteasy.plugins.validation;
import java.lang.reflect.Method;
import java.util.Iterator;
import javax.validation.ConstraintViolation;
import javax.validation.ElementKind;
import javax.validation.Path.Node;
import org.jboss.resteasy.api.validation.ConstraintType;
import org.jboss.resteasy.plugins.providers.validation.ConstraintTypeUtil;
import org.jboss.resteasy.plugins.validation.i18n.Messages;
/**
* @author <a href="ron.sigal@jboss.com">Ron Sigal</a>
* @version $Revision: 1.1 $
*
* Copyright Mar 6, 2012
*/
public class ConstraintTypeUtil11 implements ConstraintTypeUtil
{
public ConstraintType.Type getConstraintType(Object o)
{
if (!(o instanceof ConstraintViolation))
{
throw new RuntimeException(Messages.MESSAGES.unknownObjectPassedAsConstraintViolation(o));
}
ConstraintViolation<?> v = ConstraintViolation.class.cast(o);
Iterator<Node> nodes = v.getPropertyPath().iterator();
Node firstNode = nodes.next();
if (firstNode.getKind() == ElementKind.METHOD)
{
Node secondNode = nodes.next();
if (secondNode.getKind() == ElementKind.PARAMETER ||
secondNode.getKind() == ElementKind.CROSS_PARAMETER)
{
return ConstraintType.Type.PARAMETER;
}
else if (secondNode.getKind() == ElementKind.RETURN_VALUE)
{
return ConstraintType.Type.RETURN_VALUE;
}
else
{
throw new RuntimeException(Messages.MESSAGES.unexpectedPathNodeViolation(secondNode.getKind()));
}
}
if (firstNode.getKind() == ElementKind.BEAN)
{
return ConstraintType.Type.CLASS;
}
if (firstNode.getKind() == ElementKind.PROPERTY)
{
String fieldName = firstNode.getName();
try
{
String getterName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
getMethod(v.getRootBeanClass(), getterName);
return ConstraintType.Type.PROPERTY;
}
catch (NoSuchMethodException e)
{
try
{
String getterName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method m = getMethod(v.getLeafBean().getClass(), getterName);
if (m.getReturnType().equals(boolean.class))
{
return ConstraintType.Type.PROPERTY;
}
else
{
return ConstraintType.Type.FIELD;
}
}
catch (NoSuchMethodException e1)
{
return ConstraintType.Type.FIELD;
}
}
}
throw new RuntimeException(Messages.MESSAGES.unexpectedPathNode(firstNode.getKind()));
}
private static Method getMethod(Class<?> clazz, String methodName) throws NoSuchMethodException
{
Method method = null;
try
{
method = clazz.getDeclaredMethod(methodName);
}
catch (NoSuchMethodException e)
{
// Ignore.
}
while (method == null)
{
clazz = clazz.getSuperclass();
if (clazz == null)
{
break;
}
try
{
method = clazz.getDeclaredMethod(methodName);
}
catch (NoSuchMethodException e)
{
// Ignore.
}
}
if (method == null)
{
throw new NoSuchMethodException(methodName);
}
return method;
}
}