package io.muoncore.spring.methodinvocation.parameterhandlers;
import io.muoncore.protocol.requestresponse.server.RequestWrapper;
import java.lang.reflect.Parameter;
import java.lang.reflect.Type;
import java.util.Map;
public class ParameterEventArgumentTransformer implements MethodArgumentTransformer {
private Parameter parameter;
private String parameterName;
public ParameterEventArgumentTransformer(Parameter parameter) {
this.parameter = parameter;
final io.muoncore.spring.annotations.parameterhandlers.Parameter muonParameterAnnotation = parameter.getAnnotation(io.muoncore.spring.annotations.parameterhandlers.Parameter.class);
assert muonParameterAnnotation != null;
parameterName = muonParameterAnnotation.value();
}
@Override
public Type getParameterType() {
return parameter.getParameterizedType();
}
@Override
public Object extractArgument(Object request) {
if (request instanceof RequestWrapper) {
Object decodedContent = ((RequestWrapper) request).getRequest().getPayload(Object.class);
if (decodedContent instanceof Map) {
Object result = ((Map) decodedContent).get(parameterName);
return castNumericTypes(result);
}
}
throw new IllegalStateException("@Parameter(\"<parameter-name>\") annotation should be used only on resource handlers");
}
private Object castNumericTypes(Object result) {
if (!(result instanceof Number)) {
return result;
}
Number number = (Number) result;
if (Long.class.equals(parameter.getType()) || long.class.equals(parameter.getType())) {
return number.longValue();
}
if (Integer.class.equals(parameter.getType()) || int.class.equals(parameter.getType())) {
return number.intValue();
}
if (Byte.class.equals(parameter.getType()) || byte.class.equals(parameter.getType())) {
return number.byteValue();
}
if (Float.class.equals(parameter.getType()) || float.class.equals(parameter.getType())) {
return number.floatValue();
}
if (Short.class.equals(parameter.getType()) || short.class.equals(parameter.getType())) {
return number.shortValue();
}
if (Double.class.equals(parameter.getType()) || double.class.equals(parameter.getType())) {
return number.doubleValue();
}
return number;
}
}