argos/dmp-backend/core/src/main/java/eu/eudat/utilities/webclient/WebClientUtils.java

53 lines
2.0 KiB
Java

package eu.eudat.utilities.webclient;
import org.springframework.web.util.UriBuilder;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.List;
import java.util.Locale;
import java.util.stream.Stream;
public class WebClientUtils {
public static URI buildParameters(UriBuilder builder, Object data) {
List<Field> fields = List.of(data.getClass().getDeclaredFields());
List<Method> getters = Stream.of(data.getClass().getDeclaredMethods()).filter(method -> method.getName().startsWith("get")).toList();
fields.forEach(field -> {
Method getter = getters.stream().filter(method -> method.getName().equals(makeGetterMethodName(field.getName()))).findFirst().orElse(null);
if (getter != null && getter.canAccess(data)) {
try {
registerParameter(builder, getter.invoke(data), field);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
} else if (field.canAccess(data)) {
try {
registerParameter(builder, field.get(data), field);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
} else {
throw new RuntimeException("Field " + field.getName() + " is not public and has no public getter Method");
}
});
return builder.build();
}
private static void registerParameter(UriBuilder builder, Object value, Field field) {
if (value != null) {
builder.queryParam(getParameterName(field), value);
}
}
private static String makeGetterMethodName(String fieldName) {
return "get" + fieldName.substring(0, 1).toUpperCase(Locale.ROOT) + fieldName.substring(1);
}
private static String getParameterName(Field field) {
return field.getName();
}
}