/** * Return a new converter that calls this converter and passes the result to the specified converter. * * @param delegate the converter to call after this converter * @return the new converter, or this converter if {@code delegate} is {@code null} */ default ValueConverter and(ValueConverter delegate) { if (delegate == null) return this; return (data) -> { return delegate.convert(convert(data)); }; }
@Override public ValueConverter create(Column column) { return isTruncationPossible(column) ? converter : ValueConverter.passthrough(); }
return data -> convertDurationToMicroseconds(column, fieldDefn, data); case Types.TIMESTAMP: return ((ValueConverter)(data-> convertTimestampToLocalDateTime(column, fieldDefn, data))).and(super.converter(column, fieldDefn)); default: break;
return data -> convertInterval(column, fieldDefn, data); case PgOid.TIMESTAMP: return ((ValueConverter)(data-> convertTimestampToLocalDateTime(column, fieldDefn, data))).and(super.converter(column, fieldDefn)); case PgOid.TIMESTAMPTZ: return data -> convertTimestampWithZone(column, fieldDefn, data);
/** * Return a new converter that will call this converter only when the input is not {@code null}. * * @return the new converter; never null */ default ValueConverter nullOr() { return (data) -> { if (data == null) return null; return convert(data); }; }
return data -> convertInterval(column, fieldDefn, data); case PgOid.TIMESTAMP: return ((ValueConverter)(data-> convertTimestampToLocalDateTime(column, fieldDefn, data))).and(super.converter(column, fieldDefn)); case PgOid.TIMESTAMPTZ: return data -> convertTimestampWithZone(column, fieldDefn, data);
@Override public ValueConverter create(Column column) { switch (column.jdbcType()) { case Types.CHAR: // variable-length case Types.VARCHAR: // variable-length case Types.LONGVARCHAR: // variable-length case Types.CLOB: // variable-length case Types.NCHAR: // fixed-length case Types.NVARCHAR: // fixed-length case Types.LONGNVARCHAR: // fixed-length case Types.NCLOB: // fixed-length case Types.DATALINK: return converter; default: return ValueConverter.passthrough(); } }
/** * Adapt this converter to call the specified <em>fallback</em> converter when this converter returns {@code null} for * a non-null input. * * @param fallback the converter to fall back to when this converter returns {@code null} for a non-null input * @return the new converter, or this converter if {@code fallback} is {@code null} */ default ValueConverter or(ValueConverter fallback) { if (fallback == null) return this; return (data) -> { Object result = convert(data); return result != null || data == null ? result : fallback.convert(data); }; }
@Override public ValueConverter create(Column column) { return isTruncationPossible(column) ? converter : ValueConverter.passthrough(); }
private ValueConverter wrapInMappingConverterIfNeeded(ColumnMappers mappers, TableId tableId, Column column, ValueConverter converter) { if (mappers == null || converter == null) { return converter; } ValueConverter mappingConverter = mappers.mappingConverterFor(tableId, column); if (mappingConverter == null) { return converter; } return (value) -> { if (value != null) { value = converter.convert(value); } return mappingConverter.convert(value); }; }
@Override public ValueConverter create(Column column) { switch (column.jdbcType()) { case Types.CHAR: // variable-length case Types.VARCHAR: // variable-length case Types.LONGVARCHAR: // variable-length case Types.CLOB: // variable-length case Types.NCHAR: // fixed-length case Types.NVARCHAR: // fixed-length case Types.LONGNVARCHAR: // fixed-length case Types.NCLOB: // fixed-length case Types.DATALINK: return converter; default: return ValueConverter.passthrough(); } }
@Test public void shouldTruncateStrings() { String maskValue = "*****"; converter = new MaskStrings(maskValue).create(column); assertThat(converter.convert("1234567890").toString()).isEqualTo(maskValue); assertThat(converter.convert("123456").toString()).isEqualTo(maskValue); assertThat(converter.convert("12345").toString()).isEqualTo(maskValue); assertThat(converter.convert("1234").toString()).isEqualTo(maskValue); assertThat(converter.convert("123").toString()).isEqualTo(maskValue); assertThat(converter.convert("12").toString()).isEqualTo(maskValue); assertThat(converter.convert("1").toString()).isEqualTo(maskValue); assertThat(converter.convert(null).toString()).isEqualTo(maskValue); }
@Test public void shouldTruncateStrings() { converter = new TruncateStrings(5).create(column); assertThat(converter.convert("1234567890").toString()).isEqualTo("12345"); assertThat(converter.convert("123456").toString()).isEqualTo("12345"); assertThat(converter.convert("12345").toString()).isEqualTo("12345"); assertThat(converter.convert("1234").toString()).isEqualTo("1234"); assertThat(converter.convert("123").toString()).isEqualTo("123"); assertThat(converter.convert("12").toString()).isEqualTo("12"); assertThat(converter.convert("1").toString()).isEqualTo("1"); assertThat(converter.convert(null)).isNull(); }
@Test public void shouldTruncateStrings() { Configuration config = Configuration.create() .with("column.truncate.to.10.chars", fullyQualifiedNames.toUpperCase()) .build(); mappers = ColumnMappers.create(config); converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("12345678901234567890").toString()).isEqualTo("1234567890"); assertThat(converter.convert("12345678901234567890").toString().length()).isEqualTo(10); assertThat(converter.convert("12345678901").toString()).isEqualTo("1234567890"); assertThat(converter.convert("12345678901").toString().length()).isEqualTo(10); assertThat(converter.convert("1234567890").toString()).isEqualTo("1234567890"); assertThat(converter.convert("1234567890").toString().length()).isEqualTo(10); assertThat(converter.convert("123456789").toString()).isEqualTo("123456789"); assertThat(converter.convert("123456789").toString().length()).isEqualTo(9); assertThat(converter.convert(null)).isNull(); // null values are unaltered }
ValueConverter converter = converters[i]; if (converter != null) { value = value == null ? value : converter.convert(value); try { result.put(fields[i], value);
if (converter != null) { try { value = converter.convert(value); result.put(fields[i], value); } catch (DataException|IllegalArgumentException e) {
@Test public void shouldMaskStringsWithSpecificValue() { String maskValue = "*-*-*-*-*"; mappers = ColumnMappers.build().maskStrings(fullyQualifiedNames, maskValue).build(); // exact case converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("12345678901234567890")).isEqualTo(maskValue); assertThat(converter.convert("12345678901")).isEqualTo(maskValue); assertThat(converter.convert("1234567890")).isEqualTo(maskValue); assertThat(converter.convert("123456789")).isEqualTo(maskValue); assertThat(converter.convert(null)).isEqualTo(maskValue); // null values are masked, too }
@Test public void shouldMaskStringsToFixedNumberOfSpecifiedCharacters() { char maskChar = '='; String maskValue = Strings.createString(maskChar, 10); mappers = ColumnMappers.build().maskStrings(fullyQualifiedNames, maskValue.length(), maskChar).build(); converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("12345678901234567890")).isEqualTo(maskValue); assertThat(converter.convert("12345678901")).isEqualTo(maskValue); assertThat(converter.convert("1234567890")).isEqualTo(maskValue); assertThat(converter.convert("123456789")).isEqualTo(maskValue); assertThat(converter.convert(null)).isEqualTo(maskValue); // null values are masked, too }
@Test public void shouldMapValuesUsingFunctionByClassName() { mappers = ColumnMappers.build().map(fullyQualifiedNames, RepeatingColumnMapper.class.getName()).build(); converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("1234")).isEqualTo("12341234"); assertThat(converter.convert("a")).isEqualTo("aa"); assertThat(converter.convert(null)).isNull(); }
@Test public void shouldMaskStringsToFixedLength() { String maskValue = "**********"; Configuration config = Configuration.create() .with("column.mask.with.10.chars", fullyQualifiedNames) .build(); mappers = ColumnMappers.create(config); // exact case converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("12345678901234567890")).isEqualTo(maskValue); assertThat(converter.convert("12345678901")).isEqualTo(maskValue); assertThat(converter.convert("1234567890")).isEqualTo(maskValue); assertThat(converter.convert("123456789")).isEqualTo(maskValue); assertThat(converter.convert(null)).isEqualTo(maskValue); // null values are masked, too }