in avro-kafkaconnect-converter/src/main/java/com/amazonaws/services/schemaregistry/kafkaconnect/avrodata/AvroData.java [1082:1158]
private static JsonNode defaultValueFromConnect(Schema schema, Object value) {
try {
// If this is a logical type, convert it from the convenient Java type to the underlying
// serializable format
Object defaultVal = toAvroLogical(schema, value);
switch (schema.type()) {
case INT8:
return JsonNodeFactory.instance.numberNode(((Byte) defaultVal).intValue());
case INT16:
return JsonNodeFactory.instance.numberNode(((Short) defaultVal).intValue());
case INT32:
return JsonNodeFactory.instance.numberNode((Integer) defaultVal);
case INT64:
return JsonNodeFactory.instance.numberNode((Long) defaultVal);
case FLOAT32:
return JsonNodeFactory.instance.numberNode((Float) defaultVal);
case FLOAT64:
return JsonNodeFactory.instance.numberNode((Double) defaultVal);
case BOOLEAN:
return JsonNodeFactory.instance.booleanNode((Boolean) defaultVal);
case STRING:
return JsonNodeFactory.instance.textNode((String) defaultVal);
case BYTES:
if (defaultVal instanceof byte[]) {
return JsonNodeFactory.instance.textNode(new String((byte[]) defaultVal,
StandardCharsets.ISO_8859_1));
} else {
return JsonNodeFactory.instance.textNode(new String(((ByteBuffer) defaultVal).array(),
StandardCharsets.ISO_8859_1));
}
case ARRAY: {
ArrayNode array = JsonNodeFactory.instance.arrayNode();
for (Object elem : (Collection<Object>) defaultVal) {
array.add(defaultValueFromConnect(schema.valueSchema(), elem));
}
return array;
}
case MAP:
if (schema.keySchema().type() == Schema.Type.STRING && !schema.keySchema().isOptional()) {
ObjectNode node = JsonNodeFactory.instance.objectNode();
for (Map.Entry<String, Object> entry : ((Map<String, Object>) defaultVal).entrySet()) {
JsonNode entryDef = defaultValueFromConnect(schema.valueSchema(), entry.getValue());
node.put(entry.getKey(), entryDef);
}
return node;
} else {
ArrayNode array = JsonNodeFactory.instance.arrayNode();
for (Map.Entry<Object, Object> entry : ((Map<Object, Object>) defaultVal).entrySet()) {
JsonNode keyDefault = defaultValueFromConnect(schema.keySchema(), entry.getKey());
JsonNode valDefault = defaultValueFromConnect(schema.valueSchema(), entry.getValue());
ArrayNode jsonEntry = JsonNodeFactory.instance.arrayNode();
jsonEntry.add(keyDefault);
jsonEntry.add(valDefault);
array.add(jsonEntry);
}
return array;
}
case STRUCT: {
ObjectNode node = JsonNodeFactory.instance.objectNode();
Struct struct = ((Struct) defaultVal);
for (Field field : (schema.fields())) {
JsonNode fieldDef = defaultValueFromConnect(field.schema(), struct.get(field));
node.put(field.name(), fieldDef);
}
return node;
}
default:
throw new DataException("Unknown schema type:" + schema.type());
}
} catch (ClassCastException e) {
throw new DataException("Invalid type used for default value of "
+ schema.type()
+ " field: "
+ schema.defaultValue().getClass());
}
}