All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hubspot.rosetta.jdbi3.RosettaRowMapperFactory Maven / Gradle / Ivy

The newest version!
package com.hubspot.rosetta.jdbi3;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hubspot.rosetta.RosettaMapper;
import com.hubspot.rosetta.util.SqlTableNameExtractor;
import java.lang.reflect.Type;
import java.util.Map;
import java.util.Optional;
import org.jdbi.v3.core.config.ConfigRegistry;
import org.jdbi.v3.core.generic.GenericTypes;
import org.jdbi.v3.core.mapper.ColumnMappers;
import org.jdbi.v3.core.mapper.RowMapper;
import org.jdbi.v3.core.mapper.RowMapperFactory;

public class RosettaRowMapperFactory implements RowMapperFactory {

  @Override
  public Optional> build(Type type, ConfigRegistry config) {
    if (accepts(type, config)) {
      return Optional.of((rs, ctx) -> {
        ObjectMapper objectMapper = ctx
          .getConfig(RosettaObjectMapper.class)
          .getObjectMapper();
        String tableName = SqlTableNameExtractor.extractTableName(
          ctx.getParsedSql().getSql()
        );
        final RosettaMapper mapper = new RosettaMapper(type, objectMapper, tableName);

        return mapper.mapRow(rs);
      });
    } else {
      return Optional.empty();
    }
  }

  private static boolean accepts(Type type, ConfigRegistry config) {
    Class rawType = GenericTypes.getErasedType(type);

    if (
      rawType.isPrimitive() ||
      rawType.isArray() ||
      rawType.isAnnotation() ||
      rawType.equals(Map.Entry.class)
    ) {
      return false;
    } else if (rawType == Optional.class) {
      Optional optionalType = GenericTypes.findGenericParameter(
        type,
        Optional.class
      );
      // TODO we currently return false if we can't infer the type of the Optional, should we reverse that?
      return optionalType.isPresent() && accepts(optionalType.get(), config);
    } else {
      return !hasBuiltInMapper(type, config);
    }
  }

  private static boolean hasBuiltInMapper(Type type, ConfigRegistry config) {
    return config.get(ColumnMappers.class).findFor(type).isPresent();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy