diff --git a/table/annotation-processor/src/main/java/com/riiablo/table/annotation/CodeGenerator.java b/table/annotation-processor/src/main/java/com/riiablo/table/annotation/CodeGenerator.java new file mode 100644 index 00000000..91432d64 --- /dev/null +++ b/table/annotation-processor/src/main/java/com/riiablo/table/annotation/CodeGenerator.java @@ -0,0 +1,53 @@ +package com.riiablo.table.annotation; + +import com.squareup.javapoet.AnnotationSpec; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.TypeSpec; +import java.util.Date; +import javax.annotation.Generated; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.commons.lang3.time.FastDateFormat; + +abstract class CodeGenerator { + final Context context; + final String packageName; + + CodeGenerator(Context context, String packageName) { + this.context = context; + this.packageName = packageName; + } + + abstract String formatName(SchemaElement schemaElement); + + JavaFile generate(SchemaElement schemaElement) { + TypeSpec.Builder serializerTypeSpec + =newTypeSpec(schemaElement) + .addAnnotation(newGenerated(schemaElement.element.getQualifiedName().toString())) + ; + + return JavaFile + .builder(packageName, serializerTypeSpec.build()) + .skipJavaLangImports(true) + .addFileComment( + "automatically generated by $L, do not modify", + getClass().getCanonicalName()) + .build(); + } + + TypeSpec.Builder newTypeSpec(SchemaElement schemaElement) { + return TypeSpec.classBuilder(formatName(schemaElement)); + } + + AnnotationSpec newGenerated(String comments) { + return AnnotationSpec + .builder(Generated.class) + .addMember("value", "$S", getClass().getCanonicalName()) + .addMember("date", "$S", dateFormat().format(new Date())) + .addMember("comments", "$S", comments) + .build(); + } + + FastDateFormat dateFormat() { + return DateFormatUtils.ISO_8601_EXTENDED_DATETIME_TIME_ZONE_FORMAT; + } +} diff --git a/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SerializerCodeGenerator.java b/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SerializerCodeGenerator.java index e5d2de21..6ae5ddae 100644 --- a/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SerializerCodeGenerator.java +++ b/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SerializerCodeGenerator.java @@ -1,10 +1,8 @@ package com.riiablo.table.annotation; -import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.CodeBlock; import com.squareup.javapoet.FieldSpec; -import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.ParameterSpec; import com.squareup.javapoet.ParameterizedTypeName; @@ -13,55 +11,25 @@ import com.squareup.javapoet.TypeSpec; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.Objects; -import javax.annotation.Generated; import javax.lang.model.element.Modifier; import javax.lang.model.element.Name; -import org.apache.commons.lang3.time.DateFormatUtils; import static com.riiablo.table.annotation.Constants.STRING; -class SerializerCodeGenerator { - static String serializerName(SchemaElement schemaElement) { +class SerializerCodeGenerator extends CodeGenerator { + SerializerCodeGenerator(Context context, String serializerPackage) { + super(context, serializerPackage); + } + + @Override + String formatName(SchemaElement schemaElement) { return ClassName.get(schemaElement.element).simpleName() + Serializer.class.getSimpleName(); } - final Context context; - final String serializerPackage; - - SerializerCodeGenerator(Context context, String serializerPackage) { - this.context = context; - this.serializerPackage = serializerPackage; - } - - JavaFile generate(SchemaElement schemaElement) { - TypeSpec.Builder serializerTypeSpec - =newSerializer(schemaElement) - .addAnnotation(newGenerated(schemaElement.element.getQualifiedName().toString())) - ; - - return JavaFile - .builder(serializerPackage, serializerTypeSpec.build()) - .skipJavaLangImports(true) - .addFileComment( - "automatically generated by $L, do not modify", - SerializerCodeGenerator.class.getCanonicalName()) - .build(); - } - - AnnotationSpec newGenerated(String comments) { - return AnnotationSpec - .builder(Generated.class) - .addMember("value", "$S", SerializerCodeGenerator.class.getCanonicalName()) - .addMember("date", "$S", DateFormatUtils.ISO_8601_EXTENDED_DATETIME_TIME_ZONE_FORMAT.format(new Date())) - .addMember("comments", "$S", comments) - .build(); - } - - TypeSpec.Builder newSerializer(SchemaElement schemaElement) { - return TypeSpec - .classBuilder(serializerName(schemaElement)) + @Override + TypeSpec.Builder newTypeSpec(SchemaElement schemaElement) { + return super.newTypeSpec(schemaElement) .addModifiers(Modifier.PUBLIC, Modifier.FINAL) .addSuperinterface(schemaElement.serializerElement.declaredType) .addMethod(readRecord(schemaElement))