/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.module.extension.internal.loader.java.type.runtime; import static java.util.Optional.ofNullable; import static org.springframework.core.ResolvableType.forMethodReturnType; import org.mule.runtime.extension.api.annotation.param.ParameterGroup; import org.mule.runtime.module.extension.internal.loader.java.type.ExtensionParameter; import org.mule.runtime.module.extension.internal.loader.java.type.MethodElement; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.LinkedList; import java.util.List; import java.util.Optional; /** * Wrapper for {@link Method} that provide utility methods to facilitate the introspection of a {@link Method} * * @since 4.0 */ public final class MethodWrapper implements MethodElement { private final Method method; public MethodWrapper(Method method) { this.method = method; } /** * @return The wrapped method */ @Override public Method getMethod() { return method; } /** * {@inheritDoc} */ @Override public Class getDeclaringClass() { return method.getDeclaringClass(); } /** * {@inheritDoc} */ @Override public List<ExtensionParameter> getParameters() { List<ExtensionParameter> extensionParameters = new LinkedList<>(); final Parameter[] parameters = method.getParameters(); for (int i = 0; i < parameters.length; i++) { extensionParameters.add(new ParameterWrapper(method, i)); } return extensionParameters; } /** * {@inheritDoc} */ @Override public List<ExtensionParameter> getParameterGroups() { return getParametersAnnotatedWith(ParameterGroup.class); } /** * {@inheritDoc} */ @Override public List<ExtensionParameter> getParametersAnnotatedWith(Class<? extends Annotation> annotationClass) { List<ExtensionParameter> extensionParameters = new LinkedList<>(); final Parameter[] parameters = method.getParameters(); for (int i = 0; i < parameters.length; i++) { if (parameters[i].getAnnotation(annotationClass) != null) { extensionParameters.add(new ParameterWrapper(method, i)); } } return extensionParameters; } /** * {@inheritDoc} */ @Override public String getName() { return method.getName(); } /** * {@inheritDoc} */ @Override public Annotation[] getAnnotations() { return method.getAnnotations(); } /** * {@inheritDoc} */ @Override public <A extends Annotation> Optional<A> getAnnotation(Class<A> annotationClass) { return ofNullable(method.getAnnotation(annotationClass)); } /** * {@inheritDoc} */ @Override public Class<?> getReturnType() { return forMethodReturnType(method).getRawClass(); } @Override public boolean equals(Object obj) { return obj instanceof MethodElement && method.equals(((MethodElement) obj).getMethod()); } @Override public int hashCode() { return method.hashCode(); } }