From c90b96a22a1ffb87d81931106ac81d250bb7a90b Mon Sep 17 00:00:00 2001 From: Collin Smith Date: Tue, 15 Dec 2020 17:32:45 -0800 Subject: [PATCH] Added type and constructor checking for Schema --- .../table/annotation/SchemaElement.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SchemaElement.java b/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SchemaElement.java index 2832138a..523954de 100644 --- a/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SchemaElement.java +++ b/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SchemaElement.java @@ -4,7 +4,10 @@ import com.squareup.javapoet.ClassName; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import java.util.Set; import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeMirror; @@ -16,6 +19,24 @@ import org.apache.commons.lang3.builder.ToStringBuilder; final class SchemaElement { static SchemaElement get(final Context context, Element element) { TypeElement typeElement = (TypeElement) element; + Set modifiers = typeElement.getModifiers(); + if (!modifiers.contains(Modifier.PUBLIC)) { + context.error(typeElement, "{element} must be declared {}", Modifier.PUBLIC); + return null; + } else if (modifiers.contains(Modifier.ABSTRACT)) { + context.error(typeElement, "{element} must be a concrete type"); + return null; + } + + ExecutableElement defaultConstructor = defaultConstructor(context, typeElement); + if (defaultConstructor == null) { + context.error(typeElement, "{element} must contain a default constructor"); + return null; + } else if (!defaultConstructor.getModifiers().contains(Modifier.PUBLIC)) { + context.error(defaultConstructor, "{element} must be declared {}", Modifier.PUBLIC); + return null; + } + Collection fields = collectFieldElements(context, typeElement); final FieldElement primaryKeyFieldElement; @@ -51,6 +72,24 @@ final class SchemaElement { return new SchemaElement(typeElement, tableElement, serializerElement, primaryKeyFieldElement); } + static ExecutableElement defaultConstructor( + Context context, + TypeElement typeElement + ) { + for (Element e : typeElement.getEnclosedElements()) { + switch (e.getKind()) { + case CONSTRUCTOR: + ExecutableElement constructor = (ExecutableElement) e; + if (constructor.getParameters().isEmpty()) { + return constructor; + } + break; + } + } + + return null; + } + static Collection collectFieldElements(Context context, TypeElement typeElement) { Collection fields = new ArrayList<>(); TypeElement superclassElement = typeElement;