in hollow/src/main/java/com/netflix/hollow/api/codegen/delegate/HollowObjectDelegateCachedImplGenerator.java [53:176]
public String generate() {
StringBuilder builder = new StringBuilder();
appendPackageAndCommonImports(builder);
builder.append("import ").append(HollowObjectAbstractDelegate.class.getName()).append(";\n");
builder.append("import ").append(HollowObjectTypeDataAccess.class.getName()).append(";\n");
builder.append("import ").append(HollowObjectSchema.class.getName()).append(";\n");
builder.append("import ").append(HollowTypeAPI.class.getName()).append(";\n");
builder.append("import ").append(HollowCachedDelegate.class.getName()).append(";\n");
appendGeneratedAnnotation(builder);
builder.append("\n@SuppressWarnings(\"all\")\n");
builder.append("public class ").append(className).append(" extends HollowObjectAbstractDelegate implements HollowCachedDelegate, ").append(delegateInterfaceName(schema.getName())).append(" {\n\n");
for(int i=0;i<schema.numFields();i++) {
switch(schema.getFieldType(i)) {
case BOOLEAN:
builder.append(" private final Boolean ").append(substituteInvalidChars(schema.getFieldName(i))).append(";\n");
break;
case BYTES:
builder.append(" private final byte[] ").append(substituteInvalidChars(schema.getFieldName(i))).append(";\n");
break;
case DOUBLE:
builder.append(" private final Double ").append(substituteInvalidChars(schema.getFieldName(i))).append(";\n");
break;
case FLOAT:
builder.append(" private final Float ").append(substituteInvalidChars(schema.getFieldName(i))).append(";\n");
break;
case INT:
builder.append(" private final Integer ").append(substituteInvalidChars(schema.getFieldName(i))).append(";\n");
break;
case LONG:
builder.append(" private final Long ").append(substituteInvalidChars(schema.getFieldName(i))).append(";\n");
break;
case REFERENCE:
Shortcut shortcut = ergonomicShortcuts.getShortcut(schema.getName() + "." + schema.getFieldName(i));
if(shortcut != null)
builder.append(" private final ").append(HollowCodeGenerationUtils.getJavaBoxedType(shortcut.getType())).append(" ").append(substituteInvalidChars(schema.getFieldName(i))).append(";\n");
builder.append(" private final int ").append(substituteInvalidChars(schema.getFieldName(i))).append("Ordinal;\n");
break;
case STRING:
builder.append(" private final String ").append(substituteInvalidChars(schema.getFieldName(i))).append(";\n");
break;
}
}
builder.append(" private ").append(typeAPIClassname(schema.getName())).append(" typeAPI;\n\n");
builder.append(" public ").append(className).append("(").append(typeAPIClassname(schema.getName())).append(" typeAPI, int ordinal) {\n");
for(int i=0;i<schema.numFields();i++) {
String fieldName = substituteInvalidChars(schema.getFieldName(i));
switch(schema.getFieldType(i)) {
case STRING:
case BYTES:
builder.append(" this.").append(fieldName).append(" = typeAPI.get").append(uppercase(fieldName)).append("(ordinal);\n");
break;
case BOOLEAN:
case DOUBLE:
case FLOAT:
case INT:
case LONG:
builder.append(" this.").append(fieldName).append(" = typeAPI.get").append(uppercase(fieldName)).append("Boxed(ordinal);\n");
break;
case REFERENCE:
builder.append(" this.").append(fieldName).append("Ordinal = typeAPI.get").append(uppercase(fieldName)).append("Ordinal(ordinal);\n");
Shortcut shortcut = ergonomicShortcuts.getShortcut(schema.getName() + "." + schema.getFieldName(i));
if(shortcut != null) {
String ordinalVariableName = fieldName + "TempOrdinal";
builder.append(" int ").append(ordinalVariableName).append(" = ").append(fieldName).append("Ordinal;\n");
for(int j=0;j<shortcut.getPath().length-1;j++) {
String typeAPIName = HollowCodeGenerationUtils.typeAPIClassname(shortcut.getPathTypes()[j]);
builder.append(" " + ordinalVariableName + " = " + ordinalVariableName + " == -1 ? -1 : typeAPI.getAPI().get").append(typeAPIName).append("().get").append(uppercase(shortcut.getPath()[j])).append("Ordinal(").append(ordinalVariableName).append(");\n");
}
String typeAPIName = HollowCodeGenerationUtils.typeAPIClassname(shortcut.getPathTypes()[shortcut.getPathTypes().length-1]);
builder.append(" this.").append(fieldName).append(" = ").append(ordinalVariableName).append(" == -1 ? null : ").append("typeAPI.getAPI().get").append(typeAPIName).append("().get").append(uppercase(shortcut.getPath()[shortcut.getPath().length-1])).append("(").append(ordinalVariableName).append(");\n");
}
}
}
builder.append(" this.typeAPI = typeAPI;\n");
builder.append(" }\n\n");
for(int i=0;i<schema.numFields();i++) {
FieldType fieldType = schema.getFieldType(i);
String fieldName = substituteInvalidChars(schema.getFieldName(i));
if(schema.getFieldType(i) == FieldType.REFERENCE) {
Shortcut shortcut = ergonomicShortcuts.getShortcut(schema.getName() + "." + schema.getFieldName(i));
if(shortcut != null)
addAccessor(builder, shortcut.getType(), fieldName);
builder.append(" public int get").append(uppercase(fieldName)).append("Ordinal(int ordinal) {\n");
builder.append(" return ").append(fieldName).append("Ordinal;\n");
builder.append(" }\n\n");
} else {
addAccessor(builder, fieldType, fieldName);
}
}
builder.append(" @Override\n");
builder.append(" public HollowObjectSchema getSchema() {\n");
builder.append(" return typeAPI.getTypeDataAccess().getSchema();\n");
builder.append(" }\n\n");
builder.append(" @Override\n");
builder.append(" public HollowObjectTypeDataAccess getTypeDataAccess() {\n");
builder.append(" return typeAPI.getTypeDataAccess();\n");
builder.append(" }\n\n");
builder.append(" public ").append(typeAPIClassname(schema.getName())).append(" getTypeAPI() {\n");
builder.append(" return typeAPI;\n");
builder.append(" }\n\n");
builder.append(" public void updateTypeAPI(HollowTypeAPI typeAPI) {\n");
builder.append(" this.typeAPI = (").append(typeAPIClassname(schema.getName())).append(") typeAPI;\n");
builder.append(" }\n\n");
builder.append("}");
return builder.toString();
}