in mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/entity/EntityHelperGetMethodGenerator.java [257:337]
private void convertUdtsIntoEntities(
String rawObjectName,
String mappedObjectName,
PropertyType type,
MethodSpec.Builder getBuilder) {
if (type instanceof PropertyType.SingleEntity) {
ClassName entityClass = ((PropertyType.SingleEntity) type).entityName;
String entityHelperName = enclosingClass.addEntityHelperField(entityClass);
getBuilder.addStatement(
"$L = $L.get($L, lenient)", mappedObjectName, entityHelperName, rawObjectName);
} else if (type instanceof PropertyType.EntityList) {
getBuilder.addStatement(
"$L = $T.newArrayListWithExpectedSize($L.size())",
mappedObjectName,
Lists.class,
rawObjectName);
PropertyType mappedElementType = ((PropertyType.EntityList) type).elementType;
TypeName rawElementType = mappedElementType.asRawTypeName();
String rawElementName = enclosingClass.getNameIndex().uniqueField("rawElement");
getBuilder.beginControlFlow("for ($T $L: $L)", rawElementType, rawElementName, rawObjectName);
String mappedElementName = enclosingClass.getNameIndex().uniqueField("mappedElement");
getBuilder.addStatement("$T $L", mappedElementType.asTypeName(), mappedElementName);
convertUdtsIntoEntities(rawElementName, mappedElementName, mappedElementType, getBuilder);
getBuilder.addStatement("$L.add($L)", mappedObjectName, mappedElementName).endControlFlow();
} else if (type instanceof PropertyType.EntitySet) {
getBuilder.addStatement(
"$L = $T.newLinkedHashSetWithExpectedSize($L.size())",
mappedObjectName,
Sets.class,
rawObjectName);
PropertyType mappedElementType = ((PropertyType.EntitySet) type).elementType;
TypeName rawElementType = mappedElementType.asRawTypeName();
String rawElementName = enclosingClass.getNameIndex().uniqueField("rawElement");
getBuilder.beginControlFlow("for ($T $L: $L)", rawElementType, rawElementName, rawObjectName);
String mappedElementName = enclosingClass.getNameIndex().uniqueField("mappedElement");
getBuilder.addStatement("$T $L", mappedElementType.asTypeName(), mappedElementName);
convertUdtsIntoEntities(rawElementName, mappedElementName, mappedElementType, getBuilder);
getBuilder.addStatement("$L.add($L)", mappedObjectName, mappedElementName).endControlFlow();
} else if (type instanceof PropertyType.EntityMap) {
getBuilder.addStatement(
"$L = $T.newLinkedHashMapWithExpectedSize($L.size())",
mappedObjectName,
Maps.class,
rawObjectName);
PropertyType mappedKeyType = ((PropertyType.EntityMap) type).keyType;
PropertyType mappedValueType = ((PropertyType.EntityMap) type).valueType;
String rawEntryName = enclosingClass.getNameIndex().uniqueField("rawEntry");
getBuilder.beginControlFlow(
"for ($T $L: $L.entrySet())",
ParameterizedTypeName.get(
ClassName.get(Map.Entry.class),
mappedKeyType.asRawTypeName(),
mappedValueType.asRawTypeName()),
rawEntryName,
rawObjectName);
String rawKeyName = CodeBlock.of("$L.getKey()", rawEntryName).toString();
String mappedKeyName;
if (mappedKeyType instanceof PropertyType.Simple) {
mappedKeyName = rawKeyName; // no conversion, use the instance as-is
} else {
mappedKeyName = enclosingClass.getNameIndex().uniqueField("mappedKey");
getBuilder.addStatement("$T $L", mappedKeyType.asTypeName(), mappedKeyName);
convertUdtsIntoEntities(rawKeyName, mappedKeyName, mappedKeyType, getBuilder);
}
String rawValueName = CodeBlock.of("$L.getValue()", rawEntryName).toString();
String mappedValueName;
if (mappedValueType instanceof PropertyType.Simple) {
mappedValueName = rawValueName;
} else {
mappedValueName = enclosingClass.getNameIndex().uniqueField("mappedValue");
getBuilder.addStatement("$T $L", mappedValueType.asTypeName(), mappedValueName);
convertUdtsIntoEntities(rawValueName, mappedValueName, mappedValueType, getBuilder);
}
getBuilder
.addStatement("$L.put($L, $L)", mappedObjectName, mappedKeyName, mappedValueName)
.endControlFlow();
} else {
throw new AssertionError("Unsupported type " + type.asTypeName());
}
}