package org.springframework.roo.classpath.customdata.taggers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.Validate;
import org.springframework.roo.classpath.details.MemberHoldingTypeDetails;
import org.springframework.roo.classpath.details.annotations.AnnotationMetadata;
import org.springframework.roo.model.CustomDataKey;
import org.springframework.roo.model.JavaType;
/**
* A {@link TypeMatcher} that looks for any of a given set of annotations.
*
* @author James Tyrrell
*/
public class AnnotatedTypeMatcher extends TypeMatcher {
private final List<JavaType> annotationTypesToMatchOn;
private final CustomDataKey<MemberHoldingTypeDetails> customDataKey;
/**
* Constructor
*
* @param customDataKey the {@link CustomDataKey} to apply (required)
* @param annotationTypesToMatchOn
*/
public AnnotatedTypeMatcher(final CustomDataKey<MemberHoldingTypeDetails> customDataKey,
final JavaType... annotationTypesToMatchOn) {
Validate.notNull(customDataKey, "Custom data key required");
this.annotationTypesToMatchOn = Arrays.asList(annotationTypesToMatchOn);
this.customDataKey = customDataKey;
}
public CustomDataKey<MemberHoldingTypeDetails> getCustomDataKey() {
return customDataKey;
}
public Object getTagValue(final MemberHoldingTypeDetails key) {
return null;
}
public List<MemberHoldingTypeDetails> matches(
final List<MemberHoldingTypeDetails> memberHoldingTypeDetailsList) {
final Map<String, MemberHoldingTypeDetails> matched =
new HashMap<String, MemberHoldingTypeDetails>();
for (final MemberHoldingTypeDetails memberHoldingTypeDetails : memberHoldingTypeDetailsList) {
for (final AnnotationMetadata annotationMetadata : memberHoldingTypeDetails.getAnnotations()) {
for (final JavaType annotationTypeToMatchOn : annotationTypesToMatchOn) {
if (annotationMetadata.getAnnotationType().equals(annotationTypeToMatchOn)) {
matched.put(memberHoldingTypeDetails.getDeclaredByMetadataId(),
memberHoldingTypeDetails);
}
}
}
}
return new ArrayList<MemberHoldingTypeDetails>(matched.values());
}
}