package org.testng.internal.reflect;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* This class can be replaceable by java.lang.reflect.Parameter if using jdk 1.8.
*
* @author <a href="mailto:nitin.matrix@gmail.com">Nitin Verma</a>
*/
public class Parameter implements AnnotatedElement {
private final int index;
private final Class<?> type;
/**
* preserving the order of annotations.
*/
private final Annotation[] declaredAnnotations;
/**
* For efficient back to back searches.
*/
private final Map<Class<? extends Annotation>, Annotation> declaredAnnotationsMap;
public Parameter(final int index, final Class<?> type, final Annotation[] declaredAnnotations) {
this.index = index;
this.type = type;
this.declaredAnnotations = declaredAnnotations;
this.declaredAnnotationsMap = declaredAnnotations(declaredAnnotations);
}
private static Map<Class<? extends Annotation>, Annotation> declaredAnnotations(final Annotation[] ann) {
final Map<Class<? extends Annotation>, Annotation> map =
new HashMap<>();
if (ann != null) {
for (int i = 0; i < ann.length; i++) {
map.put(ann[i].annotationType(), ann[i]);
}
}
return map;
}
@Override
public String toString() {
return "Parameter{" +
"index=" + index +
", type=" + (type != null ? type.getName() : null) +
", declaredAnnotations=" + Arrays.toString(declaredAnnotations) +
'}';
}
/**
* Returns a {@code Class} object that identifies the
* declared type for the parameter represented by this
* {@code Parameter} object.
*
* @return a {@code Class} object identifying the declared
* type of the parameter represented by this object
*/
public Class<?> getType() {
return type;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
return getAnnotation(annotationClass) != null;
}
/**
* {@inheritDoc}
*/
@Override
public <T extends Annotation> T getAnnotation(final Class<T> annotationClass) {
return annotationClass.cast(declaredAnnotationsMap.get(annotationClass));
}
/**
* {@inheritDoc}
*/
@Override
public Annotation[] getAnnotations() {
// For parameter all annotations are declared.
return getDeclaredAnnotations();
}
/**
* {@inheritDoc}
*/
@Override
public Annotation[] getDeclaredAnnotations() {
return declaredAnnotations;
}
}