SpatialDataParamParser.java

package de.dlr.shepard.data.spatialdata.endpoints;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.dlr.shepard.data.spatialdata.io.FilterCondition;
import de.dlr.shepard.data.spatialdata.model.geometryFilter.AbstractGeometryFilter;
import jakarta.ws.rs.BadRequestException;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public final class SpatialDataParamParser {

  private static final ObjectMapper objectMapper = new ObjectMapper();

  public static Optional<AbstractGeometryFilter> parseGeometryFilter(String paramString) {
    if (paramString == null) return Optional.empty();
    try {
      AbstractGeometryFilter geometryFilter = objectMapper.readValue(paramString, AbstractGeometryFilter.class);
      if (!geometryFilter.isValid()) throw new BadRequestException("Invalid geometryFilter param");
      return Optional.of(geometryFilter);
    } catch (JsonProcessingException e) {
      throw new BadRequestException("Invalid geometryFilter param");
    }
  }

  public static Optional<Map<String, Object>> parseMetadata(String metadataParam) {
    if (metadataParam == null) return Optional.empty();
    try {
      return Optional.of(objectMapper.readValue(metadataParam, new TypeReference<Map<String, Object>>() {}));
    } catch (JsonProcessingException e) {
      throw new BadRequestException("Invalid metadata filter param", e);
    }
  }

  public static Optional<List<FilterCondition>> parseMeasurementsFilter(String measurementsParam) {
    if (measurementsParam == null) return Optional.empty();
    try {
      return Optional.of(objectMapper.readValue(measurementsParam, new TypeReference<List<FilterCondition>>() {}));
    } catch (JsonProcessingException e) {
      throw new BadRequestException("Invalid measurements filter param", e);
    }
  }
}