package org.springframework.roo.classpath.details; import java.lang.reflect.Modifier; import java.util.List; import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.builder.ToStringBuilder; import org.springframework.roo.classpath.details.annotations.AnnotatedJavaType; import org.springframework.roo.classpath.details.annotations.AnnotationMetadata; import org.springframework.roo.model.CustomData; import org.springframework.roo.model.JavaSymbolName; import org.springframework.roo.model.JavaType; /** * Default implementation of {@link MethodMetadata}. * * @author Ben Alex * @author Juan Carlos GarcĂ­a * @since 1.0 */ public class DefaultMethodMetadata extends AbstractInvocableMemberMetadata implements MethodMetadata, Comparable<DefaultMethodMetadata> { private final JavaSymbolName methodName; private final JavaType returnType; // Package protected to mandate the use of MethodMetadataBuilder DefaultMethodMetadata(final CustomData customData, final String declaredByMetadataId, final int modifier, final List<AnnotationMetadata> annotations, final JavaSymbolName methodName, final JavaType returnType, final List<AnnotatedJavaType> parameterTypes, final List<JavaSymbolName> parameterNames, final List<JavaType> throwsTypes, final String body) { super(customData, declaredByMetadataId, modifier, annotations, parameterTypes, parameterNames, throwsTypes, body); Validate.notNull(methodName, "Method name required"); Validate.notNull(returnType, "Return type required"); this.methodName = methodName; this.returnType = returnType; } public JavaSymbolName getMethodName() { return methodName; } public final JavaType getReturnType() { return returnType; } public boolean hasSameName(final MethodMetadata... otherMethods) { for (final MethodMetadata otherMethod : otherMethods) { if (otherMethod != null && methodName.equals(otherMethod.getMethodName())) { return true; } } return false; } public boolean isStatic() { return Modifier.isStatic(getModifier()); } @Override public boolean matchSignature(MethodMetadata otherMethod) { if (methodName.getSymbolName().equals(otherMethod.getMethodName().getSymbolName())) { if (otherMethod.getParameterTypes().size() == getParameterTypes().size()) { List<JavaType> params = AnnotatedJavaType.convertFromAnnotatedJavaTypes(this.getParameterTypes()); List<JavaType> paramsOther = AnnotatedJavaType.convertFromAnnotatedJavaTypes(otherMethod.getParameterTypes()); boolean parametersEquals = true; for (int i = 0; i < params.size(); i++) { if (!params.get(i).equals(paramsOther.get(i))) { parametersEquals = false; } } if (parametersEquals) { return true; } } } return false; } @Override public String toString() { final ToStringBuilder builder = new ToStringBuilder(this); builder.append("declaredByMetadataId", getDeclaredByMetadataId()); builder.append("modifier", Modifier.toString(getModifier())); builder.append("methodName", methodName); builder.append("parameterTypes", getParameterTypes()); builder.append("parameterNames", getParameterNames()); builder.append("returnType", returnType); builder.append("annotations", getAnnotations()); builder.append("throwsTypes", getThrowsTypes()); builder.append("customData", getCustomData()); builder.append("body", getBody()); return builder.toString(); } @Override public int compareTo(DefaultMethodMetadata method) { return this.getMethodName().getSymbolName().compareTo(method.getMethodName().getSymbolName()); } }