package etm.contrib.integration.cdi.common.spi;
import javax.enterprise.inject.spi.AnnotatedCallable;
import javax.enterprise.inject.spi.AnnotatedParameter;
import javax.enterprise.inject.spi.AnnotatedType;
import java.lang.annotation.Annotation;
import java.lang.reflect.Member;
import java.util.ArrayList;
import java.util.List;
/**
* This implementation can be used to modify the scanned annotations of a CDI bean during annotation-processing
* in a CDI extension (i.e. add annotations). See {@link DelegatingAnnotatedType} for a detailed example.
* <p/>
* If you want to modify annotations of parameters of this {@link AnnotatedCallable}
* you may implement your own {@link AnnotatedCallable}, inherit from {@link DelegatingAnnotatedCallable}
* and override {@link DelegatingAnnotatedCallable#processAnnotatedParameter(AnnotatedParameter)}
* to return an instance of {@link DelegatingAnnotatedCallable}.
* Example:
* <pre>
* public class MyAnnotatedCallable<T> extends DelegatingAnnotatedCallable<T, Method> implements AnnotatedMethod<T> {
*
* private Annotation[] additionalAnnotations;
*
* public MyAnnotatedCallable(AnnotatedType<T> delegate, Annotation... additionalAnnotations) {
* super(delegate, additionalAnnotations);
* this.additionalAnnotations = additionalAnnotations;
* }
*
* protected AnnotatedParameter<T> processAnnotatedParameter(AnnotatedParameter<T> parameter) {
* return new DelegatingAnnotatedParameter<T>(this, parameter, this.additionalAnnotations);
* }
* }
* </pre>
*
* @author Arne Limburg - open knowledge GmbH
*/
public class DelegatingAnnotatedCallable<T, M extends Member> extends DelegatingAnnotatedMember<T, M>
implements AnnotatedCallable<T> {
private final List<AnnotatedParameter<T>> parameters;
public DelegatingAnnotatedCallable(AnnotatedType<T> declaringType,
AnnotatedCallable<T> delegateCallable,
Annotation... additionalAnnotations) {
super(declaringType, delegateCallable, additionalAnnotations);
parameters = new ArrayList<AnnotatedParameter<T>>();
for (AnnotatedParameter<T> annotatedParameter : delegateCallable.getParameters()) {
parameters.add(processAnnotatedParameter(annotatedParameter));
}
}
public List<AnnotatedParameter<T>> getParameters() {
return parameters;
}
protected AnnotatedParameter<T> processAnnotatedParameter(AnnotatedParameter<T> annotatedParameter) {
return annotatedParameter;
}
}