package org.springframework.roo.classpath.customdata.taggers; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.apache.commons.lang3.Validate; import org.springframework.roo.classpath.details.ConstructorMetadata; import org.springframework.roo.classpath.details.MemberHoldingTypeDetails; import org.springframework.roo.classpath.details.annotations.AnnotatedJavaType; import org.springframework.roo.model.CustomDataKey; import org.springframework.roo.model.JavaType; /** * {@link ConstructorMetadata}-specific implementation of {@link Matcher}. * Currently ConstructorMetadata instances are only matched based on parameter * types. * * @author James Tyrrell * @since 1.1.3 */ public class ConstructorMatcher implements Matcher<ConstructorMetadata> { private final CustomDataKey<ConstructorMetadata> customDataKey; private final List<JavaType> parameterTypes; /** * Constructor * * @param customDataKey (required) * @param parameterTypes can be <code>null</code> for none */ public ConstructorMatcher(final CustomDataKey<ConstructorMetadata> customDataKey, final Collection<? extends JavaType> parameterTypes) { Validate.notNull(customDataKey, "Custom data key is required, e.g. a ConstructorMetadataCustomDataKey"); this.customDataKey = customDataKey; this.parameterTypes = new ArrayList<JavaType>(); if (parameterTypes != null) { this.parameterTypes.addAll(parameterTypes); } } /** * Constructor * * @param <T> {@link JavaType} or any subclass * @param customDataKey (required) * @param parameterTypes * @since 1.2.0 */ public <T extends JavaType> ConstructorMatcher( final CustomDataKey<ConstructorMetadata> customDataKey, final T... parameterTypes) { this(customDataKey, Arrays.asList(parameterTypes)); } public CustomDataKey<ConstructorMetadata> getCustomDataKey() { return customDataKey; } public Object getTagValue(final ConstructorMetadata key) { return null; } public List<ConstructorMetadata> matches( final List<MemberHoldingTypeDetails> memberHoldingTypeDetailsList) { final List<ConstructorMetadata> constructors = new ArrayList<ConstructorMetadata>(); for (final MemberHoldingTypeDetails memberHoldingTypeDetails : memberHoldingTypeDetailsList) { for (final ConstructorMetadata constructor : memberHoldingTypeDetails .getDeclaredConstructors()) { if (parameterTypes.equals(AnnotatedJavaType.convertFromAnnotatedJavaTypes(constructor .getParameterTypes()))) { constructors.add(constructor); } } } return constructors; } }