Created Table#newSerializer

Created Table#newSerializer
Added default impl for MonStatsTableImpl#newSerializer
Created SchemaElement#serializerClassName
Refactored CodeGenerator#formatName to return a fq ClassName
Added null check for generated SchemaElement
Renamed CodeGenerator#generate variable to typeSpecBuilder
This commit is contained in:
Collin Smith 2020-12-16 01:12:21 -08:00
parent f9fe8d0c63
commit 160109fdc9
7 changed files with 50 additions and 13 deletions

View File

@ -1,6 +1,7 @@
package com.riiablo.table.annotation;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.TypeSpec;
import java.util.Date;
@ -17,16 +18,16 @@ abstract class CodeGenerator {
this.packageName = packageName;
}
abstract String formatName(SchemaElement schemaElement);
abstract ClassName formatName(String packageName, SchemaElement schemaElement);
JavaFile generate(SchemaElement schemaElement) {
TypeSpec.Builder serializerTypeSpec
TypeSpec.Builder typeSpecBuilder
=newTypeSpec(schemaElement)
.addAnnotation(newGenerated(schemaElement.element.getQualifiedName().toString()))
;
return JavaFile
.builder(packageName, serializerTypeSpec.build())
.builder(packageName, typeSpecBuilder.build())
.skipJavaLangImports(true)
.addFileComment(
"automatically generated by $L, do not modify",
@ -35,7 +36,7 @@ abstract class CodeGenerator {
}
TypeSpec.Builder newTypeSpec(SchemaElement schemaElement) {
return TypeSpec.classBuilder(formatName(schemaElement));
return TypeSpec.classBuilder(formatName(packageName, schemaElement));
}
AnnotationSpec newGenerated(String comments) {

View File

@ -127,6 +127,8 @@ final class SchemaElement {
final FieldElement primaryKeyFieldElement;
final Collection<FieldElement> fields;
ClassName serializerClassName;
SchemaElement(
Schema annotation,
TypeElement element,
@ -140,6 +142,9 @@ final class SchemaElement {
this.serializerElement = serializerElement;
this.primaryKeyFieldElement = primaryKeyFieldElement;
this.fields = fields;
if (serializerElement.serializerImplElement != null) {
serializerClassName = ClassName.get(serializerElement.serializerImplElement);
}
}
@Override
@ -148,6 +153,7 @@ final class SchemaElement {
.append("element", element)
.append("tableElement", tableElement)
.append("serializerElement", serializerElement)
.append("serializerClassName", serializerClassName)
.append("primaryKeyFieldElement", primaryKeyFieldElement)
.toString();
}

View File

@ -56,21 +56,23 @@ public class SchemaProcessor extends AbstractProcessor {
}
SchemaElement schemaElement = SchemaElement.get(context, element);
if (schemaElement.tableElement.declaredType != null) {
if (schemaElement == null) continue;
if (schemaElement.serializerElement.declaredType != null) {
try {
tableCodeGenerator.generate(schemaElement)
serializerCodeGenerator.generate(schemaElement)
.writeTo(processingEnv.getFiler());
// .writeTo(System.out);
} catch (Throwable t) {
context.error(ExceptionUtils.getRootCauseMessage(t));
t.printStackTrace(System.err);
}
}
if (schemaElement.serializerElement.declaredType != null) {
// Depends on serializerElement to generate Serializer impl
if (schemaElement.tableElement.declaredType != null) {
try {
serializerCodeGenerator.generate(schemaElement)
tableCodeGenerator.generate(schemaElement)
.writeTo(processingEnv.getFiler());
// .writeTo(System.out);
} catch (Throwable t) {
context.error(ExceptionUtils.getRootCauseMessage(t));
t.printStackTrace(System.err);

View File

@ -14,6 +14,7 @@ import java.util.Arrays;
import java.util.Objects;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.Name;
import org.apache.commons.lang3.Validate;
import static com.riiablo.table.annotation.Constants.STRING;
@ -23,8 +24,13 @@ class SerializerCodeGenerator extends CodeGenerator {
}
@Override
String formatName(SchemaElement schemaElement) {
return ClassName.get(schemaElement.element).simpleName() + Serializer.class.getSimpleName();
ClassName formatName(String packageName, SchemaElement schemaElement) {
Validate.validState(schemaElement.serializerClassName == null,
"schemaElement.serializerClassName already set to " + schemaElement.serializerClassName);
return schemaElement.serializerClassName
= ClassName.get(
packageName,
schemaElement.element.getSimpleName() + Serializer.class.getSimpleName());
}
@Override

View File

@ -12,8 +12,10 @@ class TableCodeGenerator extends CodeGenerator {
}
@Override
String formatName(SchemaElement schemaElement) {
return ClassName.get(schemaElement.element).simpleName() + Table.class.getSimpleName();
ClassName formatName(String packageName, SchemaElement schemaElement) {
return ClassName.get(
packageName,
schemaElement.element.getSimpleName() + Table.class.getSimpleName());
}
@Override
@ -23,6 +25,7 @@ class TableCodeGenerator extends CodeGenerator {
.superclass(schemaElement.tableElement.declaredType)
.addMethod(constructor(schemaElement))
.addMethod(newRecord(schemaElement))
.addMethod(newSerializer(schemaElement))
.addMethod(offset(schemaElement))
.addMethod(indexed(schemaElement))
.addMethod(primaryKey(schemaElement))
@ -49,6 +52,18 @@ class TableCodeGenerator extends CodeGenerator {
.build();
}
MethodSpec newSerializer(SchemaElement schemaElement) {
TableElement tableElement = schemaElement.tableElement;
SerializerElement serializerElement = schemaElement.serializerElement;
return MethodSpec
.overriding(
tableElement.getMethod("newSerializer"),
tableElement.declaredType,
context.typeUtils)
.addStatement("return new $T()", schemaElement.serializerClassName)
.build();
}
MethodSpec offset(SchemaElement schemaElement) {
Schema config = schemaElement.annotation;
TableElement tableElement = schemaElement.tableElement;

View File

@ -36,6 +36,7 @@ public abstract class Table<R> implements Iterable<R> {
}
protected abstract R newRecord();
protected abstract Serializer<R> newSerializer();
public Class<R> recordClass() {
throw new UnsupportedOperationException();

View File

@ -1,5 +1,6 @@
package com.riiablo.table.schema;
import com.riiablo.table.Serializer;
import com.riiablo.table.Table;
public abstract class MonStatsTableImpl extends Table<MonStats> {
@ -11,4 +12,9 @@ public abstract class MonStatsTableImpl extends Table<MonStats> {
protected MonStats newRecord() {
return new MonStats();
}
@Override
protected Serializer<MonStats> newSerializer() {
return new MonStatsSerializerImpl();
}
}