in rest/src/main/java/com/epam/eco/schemacatalog/rest/utils/SchemaProfileCreator.java [114:171]
private SchemaFieldType constructSchemaFieldType(Schema parentSchema, Schema fieldSchema) {
Schema.Type type = fieldSchema.getType();
String logicalType =
fieldSchema.getLogicalType() != null ?
fieldSchema.getLogicalType().getName() :
null;
if (AvroUtils.isPrimitive(type)) {
return PrimitiveSchemaFieldType.builder()
.type(type)
.logicalType(logicalType)
.build();
}
if (AvroUtils.isNamed(type)) {
return NamedSchemaFieldType.builder()
.type(type)
.logicalType(logicalType)
.namespace(Objects.equals(
fieldSchema.getNamespace(),
parentSchema.getNamespace()) ? null : fieldSchema.getNamespace())
.name(fieldSchema.getName())
.build();
}
if (AvroUtils.isParametrized(type)) {
if (type == Schema.Type.ARRAY) {
return ParameterizedSchemaFieldType.builder()
.type(type)
.logicalType(logicalType)
.parameters(
Collections.singletonList(
constructSchemaFieldType(parentSchema, fieldSchema.getElementType())))
.build();
}
if (type == Schema.Type.MAP) {
List<SchemaFieldType> parameters = new ArrayList<>();
parameters.add(STRING_FIELD_TYPE);
parameters.add(constructSchemaFieldType(parentSchema, fieldSchema.getValueType()));
return ParameterizedSchemaFieldType.builder()
.type(type)
.logicalType(logicalType)
.parameters(parameters)
.build();
}
if (type == Schema.Type.UNION) {
List<Schema> types = fieldSchema.getTypes();
List<SchemaFieldType> parameters = new ArrayList<>(types.size());
for (Schema unionSchema : types) {
parameters.add(constructSchemaFieldType(parentSchema, unionSchema));
}
return ParameterizedSchemaFieldType.builder()
.type(type)
.logicalType(logicalType)
.parameters(parameters)
.build();
}
}
throw new IllegalArgumentException("Schema type is unknown");
}