in core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterExtractor.java [153:243]
private void processParameterValue(
Annotation annotation, Class paramClass, Map<Object, List<Object>> result, Class valueId) throws Exception
{
Object key = null;
List<Object> parameterValues = new ArrayList<Object>();
if(ValidationParameter.class.isAssignableFrom(paramClass))
{
List<Field> processedFields = new ArrayList<Field>();
List<Method> processedMethods = new ArrayList<Method>();
Class currentParamClass = paramClass;
while (currentParamClass != null && !Object.class.getName().equals(currentParamClass.getName()))
{
/*
* process class
*/
//support pure interface approach e.g. ViolationSeverity.Warn.class
for(Field currentField : currentParamClass.getDeclaredFields())
{
if(!processedFields.contains(currentField))
{
key = processFoundField(annotation, currentField, parameterValues, key, valueId);
processedFields.add(currentField);
}
}
//inspect the other methods of the implementing class
for(Method currentMethod : currentParamClass.getDeclaredMethods())
{
if(!processedMethods.contains(currentMethod))
{
key = processFoundMethod(currentParamClass, currentMethod, parameterValues, key, valueId);
processedMethods.add(currentMethod);
}
}
/*
* process interfaces
*/
for(Class currentInterface : currentParamClass.getInterfaces())
{
if(!ValidationParameter.class.isAssignableFrom(currentInterface))
{
continue;
}
//support interface + impl. approach e.g. MyParamImpl.class
//(MyParamImpl implements MyParam
//MyParam extends ValidationParameter
//methods in the interface have to be marked with @ParameterValue and @ParameterKey
for(Method currentMethod : currentInterface.getDeclaredMethods())
{
if(!processedMethods.contains(currentMethod))
{
key = processFoundMethod(currentParamClass, currentMethod, parameterValues, key, valueId);
processedMethods.add(currentMethod);
}
}
for(Field currentField : currentInterface.getDeclaredFields())
{
if(!processedFields.contains(currentField))
{
key = processFoundField(annotation, currentField, parameterValues, key, valueId);
processedFields.add(currentField);
}
}
}
currentParamClass = currentParamClass.getSuperclass();
}
}
key = createDefaultKey(key, paramClass);
if(parameterValues.isEmpty())
{
//@ParameterValue is optional as well
parameterValues.add(key);
}
if(result.containsKey(key))
{
result.get(key).addAll(parameterValues);
}
else
{
result.put(key, parameterValues);
}
}