public String generate()

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();
    }