private static Function<UriComponentsBuilder, UriComponentsBuilder> getUriAugmenter(Object request, Function<UriComponentsBuilder, UriComponentsBuilder> uriTransformer) { return builder -> { FilterBuilder.augment(builder, request); QueryBuilder.augment(builder, request); return uriTransformer.apply(builder); }; }
/** * Augments a {@link UriComponentsBuilder} with queries based on the methods annotated with {@link FilterParameter} * * @param builder the builder to augment * @param instance the instance to inspect and invoke */ public static void augment(UriComponentsBuilder builder, Object instance) { Method[] methods = ReflectionUtils.getAllDeclaredMethods(instance.getClass()); Arrays.sort(methods, MethodNameComparator.INSTANCE); for (Method method : methods) { for (Annotation annotation : AnnotationUtils.getAnnotations(method)) { if (AnnotationUtils.isAnnotationMetaPresent(annotation.getClass(), FilterParameter.class)) { Object value = getValue(method, instance); if (value != null) { FilterParameter filterParameter = AnnotationUtils.getAnnotation(annotation, FilterParameter.class); Object name = AnnotationUtils.getValue(annotation); String operation = filterParameter.operator(); builder.queryParam("q", String.format("%s%s%s", name, operation, value)); } break; } } } }