Created CodeGenerator

Refactored some code generator responsibilities from SerializerCodeGenerator to CodeGenerator
This commit is contained in:
Collin Smith
2020-12-15 23:50:19 -08:00
parent be46bab71e
commit 44282ad9ba
2 changed files with 63 additions and 42 deletions

View File

@ -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;
}
}

View File

@ -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))