public void generateFiles(File directory) throws IOException { Path destinationPath = directory.toPath(); Path packagePath = Paths.get(packageName.replace(".", File.separator)); if (!destinationPath.toAbsolutePath().endsWith(packagePath)) { destinationPath = destinationPath.resolve(packagePath); } directory = destinationPath.toFile(); if (!directory.exists()) directory.mkdirs(); for (HollowSchema schema : dataset.getSchemas()) { if (schema instanceof HollowObjectSchema && !isPrimitiveType(schema.getName())) { HollowPOJOClassGenerator generator = new HollowPOJOClassGenerator(dataset, (HollowObjectSchema) schema, packageName, pojoClassNameSuffix); FileWriter writer = new FileWriter(new File(directory, generator.getClassName() + ".java")); writer.write(generator.generate()); writer.close(); } } } }
public HollowPOJOClassGenerator(HollowDataset dataset, HollowObjectSchema schema, String packageName, String classNameSuffix, boolean memoizeOrdinal) { this.dataset = dataset; this.schema = schema; this.packageName = packageName; this.classNameSuffix = classNameSuffix; this.className = buildClassName(schema.getName(), classNameSuffix); this.importClasses = new HashSet<Class<?>>(); this.memoizeOrdinal = memoizeOrdinal; }
private void generateInstanceVariables(StringBuilder classBodyBuilder) { for (int i = 0;i < schema.numFields();i++) { if (fieldNeedsTypeNameAnnotation(i)) { classBodyBuilder.append(" @HollowTypeName(name=\"").append(schema.getReferencedType(i)).append("\")\n"); } if (fieldNeedsInlineAnnotation(i)) { importClasses.add(HollowInline.class); classBodyBuilder.append(" @HollowInline\n"); } classBodyBuilder.append(" public "); classBodyBuilder.append(fieldType(i)); classBodyBuilder.append(" ").append(getFieldName(i)).append(" = ").append(defaultValue(i)).append(";\n"); } }
private void generateChainableSetters(StringBuilder classBodyBuilder) { for (int i = 0; i < schema.numFields(); i++) { classBodyBuilder.append(" public ").append(getClassName()).append(" set") .append(uppercase(getFieldName(i))).append("(") .append(fieldType(i)).append(" ").append(getFieldName(i)).append(") {\n"); classBodyBuilder.append(" this.").append(getFieldName(i)).append(" = ") .append(getFieldName(i)).append(";\n"); classBodyBuilder.append(" return this;\n"); classBodyBuilder.append(" }\n"); } }
private void generateConstructorForPrimaryKey(StringBuilder classBodyBuilder) { PrimaryKey primaryKey = schema.getPrimaryKey(); if (primaryKey == null) { return; } // don't allow no-arg constructors if we have a primary key classBodyBuilder.append(" private ").append(getClassName()).append("() {}\n\n"); classBodyBuilder.append(" public ").append(getClassName()).append("("); // classBodyBuilder.append(" this.").append(.fieldType for (int i = 0; i < primaryKey.numFields(); i++) { if (i > 0) { classBodyBuilder.append(", "); } int fieldIndex = getIndexFromFieldName(primaryKey.getFieldPath(i)); classBodyBuilder.append(fieldType(fieldIndex)).append(" ").append(getFieldName(fieldIndex)); } classBodyBuilder.append(") {\n"); for (int i = 0; i < primaryKey.numFields(); i++) { int fieldIndex = getIndexFromFieldName(primaryKey.getFieldPath(i)); classBodyBuilder.append(" this.").append(getFieldName(fieldIndex)).append(" = ") .append(getFieldName(fieldIndex)).append(";\n"); } classBodyBuilder.append(" }\n\n"); }
classBodyBuilder.append("@SuppressWarnings(\"all\")\n"); classBodyBuilder.append("@HollowTypeName(name=\"").append(schema.getName()).append("\")\n"); generateHollowPrimaryKeyAnnotation(classBodyBuilder); classBodyBuilder.append("public class ").append(getClassName()).append(" implements Cloneable {\n"); generateInstanceVariables(classBodyBuilder); classBodyBuilder.append("\n"); generateConstructorForPrimaryKey(classBodyBuilder); generateChainableSetters(classBodyBuilder); generateChainableAddForSetAndList(classBodyBuilder); generateEqualsMethod(classBodyBuilder); generateHashCodeMethod(classBodyBuilder); generateToStringMethod(classBodyBuilder); generateCloneMethod(classBodyBuilder); classBodyBuilder.append(" }\n\n");
private void generateChainableAddForSetAndList(StringBuilder classBodyBuilder) { for (int i = 0; i < schema.numFields(); i++) { if (schema.getFieldType(i) != FieldType.REFERENCE) { continue; } HollowSchema referencedSchema = dataset.getSchema(schema.getReferencedType(i)); if (referencedSchema instanceof HollowListSchema || referencedSchema instanceof HollowSetSchema) { HollowSchema elementSchema = dataset.getSchema(referencedSchema instanceof HollowListSchema ? ((HollowListSchema) referencedSchema).getElementType() : ((HollowSetSchema) referencedSchema).getElementType()); String elementType = buildFieldType(elementSchema); Class fieldImplementationType = referencedSchema instanceof HollowListSchema ? ArrayList.class : HashSet.class; importClasses.add(fieldImplementationType); classBodyBuilder.append(" public ").append(getClassName()).append(" addTo") .append(uppercase(getFieldName(i))).append("(") .append(elementType).append(" ").append(lowercase(elementType)).append(") {\n"); classBodyBuilder.append(" if (this.").append(getFieldName(i)).append(" == null) {\n"); classBodyBuilder.append(" this.").append(getFieldName(i)).append(" = new ") .append(fieldImplementationType.getSimpleName()).append("<").append(elementType).append(">();\n"); classBodyBuilder.append(" }\n"); classBodyBuilder.append(" this.").append(getFieldName(i)).append(".add(") .append(lowercase(elementType)).append(");\n"); classBodyBuilder.append(" return this;\n"); classBodyBuilder.append(" }\n"); } } }
private String buildFieldType(HollowSchema referencedSchema) { if (referencedSchema instanceof HollowObjectSchema) { return buildClassName(referencedSchema.getName(), classNameSuffix); } else if (referencedSchema instanceof HollowListSchema) { importClasses.add(List.class); HollowSchema elementSchema = dataset.getSchema(((HollowListSchema)referencedSchema).getElementType()); return "List<" + buildFieldType(elementSchema) + ">"; } else if (referencedSchema instanceof HollowSetSchema) { importClasses.add(Set.class); HollowSchema elementSchema = dataset.getSchema(((HollowSetSchema)referencedSchema).getElementType()); return "Set<" + buildFieldType(elementSchema) + ">"; } else if (referencedSchema instanceof HollowMapSchema) { importClasses.add(Map.class); HollowSchema keySchema = dataset.getSchema(((HollowMapSchema)referencedSchema).getKeyType()); HollowSchema valueSchema = dataset.getSchema(((HollowMapSchema)referencedSchema).getValueType()); return "Map<" + buildFieldType(keySchema) + ", " + buildFieldType(valueSchema) + ">"; } throw new IllegalArgumentException("Schema is unrecognized type " + referencedSchema.getClass().getSimpleName()); }
private String expectedCollectionClassName(HollowSchema referencedSchema) { if (referencedSchema instanceof HollowObjectSchema) { return referencedSchema.getName(); } else if (referencedSchema instanceof HollowListSchema) { importClasses.add(List.class); HollowSchema elementSchema = dataset.getSchema(((HollowListSchema)referencedSchema).getElementType()); return "ListOf" + expectedCollectionClassName(elementSchema); } else if (referencedSchema instanceof HollowSetSchema) { importClasses.add(Set.class); HollowSchema elementSchema = dataset.getSchema(((HollowSetSchema)referencedSchema).getElementType()); return "SetOf" + expectedCollectionClassName(elementSchema); } else if (referencedSchema instanceof HollowMapSchema) { importClasses.add(Map.class); HollowSchema keySchema = dataset.getSchema(((HollowMapSchema)referencedSchema).getKeyType()); HollowSchema valueSchema = dataset.getSchema(((HollowMapSchema)referencedSchema).getValueType()); return "MapOf" + expectedCollectionClassName(keySchema) + "To" + expectedCollectionClassName(valueSchema); } throw new IllegalArgumentException("Expected HollowCollectionSchema or HollowMapSchema but got " + referencedSchema.getClass().getSimpleName()); }
private String fieldType(int i) { switch (schema.getFieldType(i)) { case BOOLEAN: case BYTES: case DOUBLE: case FLOAT: case INT: case LONG: case STRING: return getJavaScalarType(schema.getFieldType(i)); case REFERENCE: return buildFieldType(dataset.getSchema(schema.getReferencedType(i))); default: throw new IllegalArgumentException("Field type is unrecognized: " + schema.getFieldType(i)); } }
private boolean fieldNeedsTypeNameAnnotation(int i) { if (schema.getFieldType(i) == FieldType.REFERENCE) { HollowSchema referencedSchema = dataset.getSchema(schema.getReferencedType(i)); return !referencedSchema.getName().equals(expectedCollectionClassName(referencedSchema)); } return false; }