package org.ohdsi.webapi.report.mapper; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.commons.lang.WordUtils; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.JdbcUtils; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Date; /** * Created by mark on 10/29/16. */ public class GenericRowMapper implements RowMapper<JsonNode> { private final ObjectMapper mapper; public GenericRowMapper(ObjectMapper mapper) { this.mapper = mapper; } @Override public JsonNode mapRow(ResultSet rs, int rowNum) throws SQLException { ObjectNode objectNode = mapper.createObjectNode(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); for (int index = 1; index <= columnCount; index++) { String column = JdbcUtils.lookupColumnName(rsmd, index); Object value = rs.getObject(column); if (value == null) { objectNode.putNull(column); } else if (value instanceof Integer) { objectNode.put(column, (Integer) value); } else if (value instanceof String) { objectNode.put(column, (String) value); } else if (value instanceof Boolean) { objectNode.put(column, (Boolean) value); } else if (value instanceof Date) { objectNode.put(column, ((Date) value).getTime()); } else if (value instanceof Long) { objectNode.put(column, (Long) value); } else if (value instanceof Double) { objectNode.put(column, (Double) value); } else if (value instanceof Float) { objectNode.put(column, (Float) value); } else if (value instanceof BigDecimal) { objectNode.put(column, (BigDecimal) value); } else if (value instanceof Byte) { objectNode.put(column, (Byte) value); } else if (value instanceof byte[]) { objectNode.put(column, (byte[]) value); } else { throw new IllegalArgumentException("Unmappable object type: " + value.getClass()); } } return objectNode; } }