AnnotationFinder.java
package org.jbehave.core.configuration;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
/**
* Helper class to find and retrieve annotated values
*
* @author Cristiano GaviĆ£o
* @author Brian Repko
* @author Mauro Talevi
*/
public class AnnotationFinder {
private final Class<?> annotatedClass;
public AnnotationFinder(Class<?> annotatedClass) {
this.annotatedClass = annotatedClass;
}
public <A extends Annotation> boolean isAnnotationPresent(Class<A> annotationClass) {
return getAnnotation(annotationClass) != null;
}
public <A extends Annotation> boolean isAnnotationValuePresent(Class<A> annotationClass, String memberName) {
Annotation annotation = getAnnotation(annotationClass);
return annotation != null && getAnnotationValue(annotation, memberName) != null;
}
@SuppressWarnings("unchecked")
public <T, A extends Annotation> T getAnnotatedValue(Class<A> annotationClass, Class<T> memberType,
String memberName) {
Annotation annotation = getAnnotation(annotationClass);
if (annotation != null) {
return (T) getAnnotationValue(annotation, memberName);
}
throw new AnnotationRequired(annotatedClass, annotationClass);
}
@SuppressWarnings("unchecked")
public <T, A extends Annotation> List<T> getAnnotatedValues(Class<A> annotationClass, Class<T> type,
String memberName) {
Set<T> set = new LinkedHashSet<>();
if (!isAnnotationPresent(annotationClass)) {
return new ArrayList<>(set);
}
Object[] values = getAnnotatedValue(annotationClass, Object[].class, memberName);
for (Object value : values) {
set.add((T) value);
}
boolean inheritValues = true;
String inheritMemberName = createInheritMemberName(memberName);
if (isAnnotationValuePresent(annotationClass, inheritMemberName)) {
inheritValues = getAnnotatedValue(annotationClass, boolean.class, inheritMemberName);
}
if (inheritValues) {
Class<?> superClass = annotatedClass.getSuperclass();
if (superClass != null && superClass != Object.class) {
set.addAll(new AnnotationFinder(superClass).getAnnotatedValues(annotationClass, type, memberName));
}
}
return new ArrayList<>(set);
}
/**
* Creates the inherit member name by prefixing "inherit" to the capitalized member name.
*
* @param memberName the initial member name
* @return The inherit member name
*/
protected String createInheritMemberName(String memberName) {
return "inherit" + StringUtils.capitalize(memberName);
}
@SuppressWarnings("unchecked")
public <T, A extends Annotation> List<Class<T>> getAnnotatedClasses(Class<A> annotationClass, Class<T> type,
String memberName) {
return (List<Class<T>>) getAnnotatedValues(annotationClass, type.getClass(), memberName);
}
protected <A extends Annotation> Annotation getAnnotation(Class<A> annotationClass) {
return annotatedClass.getAnnotation(annotationClass);
}
protected Object getAnnotationValue(Annotation annotation, String attributeName) {
try {
Method method = annotation.annotationType().getDeclaredMethod(attributeName);
return method.invoke(annotation);
} catch (Exception e) {
return null;
}
}
}