AbstractQueryParamMapper.java
package io.github.evisentin.wordpress.rest.client.adapter.apache.query.mappers;
import io.github.evisentin.wordpress.rest.client.domain.model.enums.WpHasValueEnum;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.apache.hc.core5.net.URIBuilder;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.Set;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.joining;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.StringUtils.trimToNull;
/**
* Base class for mapping query objects to HTTP query parameters.
*
* <p>Provides a set of helper methods to safely add query parameters to an
* {@link URIBuilder}. All methods are null-safe and only add parameters when values are present and valid.
*
* <p>This class is intended for internal use and is extended by concrete
* query mapper implementations.
*/
@NoArgsConstructor(access = AccessLevel.PACKAGE)
public abstract class AbstractQueryParamMapper {
protected static void addBoolean(final URIBuilder builder,
final String paramName, final Boolean value) {
ofNullable(value)
.map(Object::toString)
.ifPresent(val -> builder.addParameter(paramName, val));
}
protected static void addEnum(final URIBuilder builder,
final String paramName, final WpHasValueEnum value) {
ofNullable(value)
.map(WpHasValueEnum::getValue)
.ifPresent(val -> builder.addParameter(paramName, val));
}
protected static void addInteger(final URIBuilder builder,
final String paramName, final Integer value) {
ofNullable(value)
.ifPresent(val -> builder.addParameter(paramName, val.toString()));
}
protected static void addLocalDate(final URIBuilder builder,
final String paramName, final LocalDate value) {
ofNullable(value)
.ifPresent(val -> builder.addParameter(paramName, val.format(DateTimeFormatter.ISO_LOCAL_DATE)));
}
protected static void addLong(final URIBuilder builder,
final String paramName, final Long value) {
ofNullable(value)
.ifPresent(val -> builder.addParameter(paramName, val.toString()));
}
protected static void addSetOfEnums(final URIBuilder builder,
final String paramName, final Set<? extends WpHasValueEnum> values) {
final String paramValue = emptyIfNull(values).stream()
.map(WpHasValueEnum::getValue)
.sorted()
.collect(joining(","));
if (isNotBlank(paramValue))
builder.addParameter(paramName, paramValue);
}
protected static void addSetOfLong(final URIBuilder builder,
final String paramName, final Set<Long> values) {
final String paramValue = emptyIfNull(values).stream()
.sorted()
.map(Object::toString)
.collect(joining(","));
if (isNotBlank(paramValue))
builder.addParameter(paramName, paramValue);
}
protected static void addSetOfStrings(final URIBuilder builder,
final String paramName, final Set<String> values) {
final String paramValue = emptyIfNull(values).stream()
.map(StringUtils::trimToEmpty)
.filter(StringUtils::isNotBlank)
.sorted()
.distinct()
.collect(joining(","));
if (isNotBlank(paramValue))
builder.addParameter(paramName, paramValue);
}
protected static void addString(final URIBuilder builder,
final String paramName, final String value) {
ofNullable(trimToNull(value))
.ifPresent(val -> builder.addParameter(paramName, val));
}
private static <T> Set<T> emptyIfNull(final Set<T> set) {
return ofNullable(set).orElseGet(Collections::emptySet);
}
}