diff --git a/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SchemaProcessor.java b/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SchemaProcessor.java index 0e4a8a5c..1736c954 100644 --- a/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SchemaProcessor.java +++ b/table/annotation-processor/src/main/java/com/riiablo/table/annotation/SchemaProcessor.java @@ -1,42 +1,54 @@ package com.riiablo.table.annotation; import com.google.auto.service.AutoService; +import com.squareup.javapoet.ArrayTypeName; +import com.squareup.javapoet.CodeBlock; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.TypeSpec; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; -import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; +import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import org.apache.commons.collections4.SetUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; @AutoService(Processor.class) -@SupportedSourceVersion(SourceVersion.RELEASE_7) public class SchemaProcessor extends AbstractProcessor { - static final Set SUPPORTED_ANNOTATIONS; - static { - Set set = new LinkedHashSet<>(); - set.add(Schema.class.getCanonicalName()); - set.add(PrimaryKey.class.getCanonicalName()); - SUPPORTED_ANNOTATIONS = set; - } + private final Set schemas = new HashSet<>(); + private Context context; @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); + context = new Context(processingEnv); } @Override - public boolean process( + public boolean process(Set annotations, RoundEnvironment roundEnv) { + if (roundEnv.processingOver()) { + generateManifest(); + } else { + processAnnotations(annotations, roundEnv); + } + + return true; + } + + private void processAnnotations( Set annotations, - RoundEnvironment roundEnv - ) { - final Context context = new Context(processingEnv); + RoundEnvironment roundEnv) { + for (Element element : roundEnv.getElementsAnnotatedWith(PrimaryKey.class)) { VariableElement variableElement = (VariableElement) element; if (!Constants.isPrimaryKey(variableElement)) { @@ -46,11 +58,11 @@ public class SchemaProcessor extends AbstractProcessor { } TableCodeGenerator tableCodeGenerator = new TableCodeGenerator( - context, "com.riiablo.excel.table"); + context, "com.riiablo.table.table"); SerializerCodeGenerator serializerCodeGenerator = new SerializerCodeGenerator( - context, "com.riiablo.excel.serializer"); + context, "com.riiablo.table.serializer"); ParserCodeGenerator parserCodeGenerator = new ParserCodeGenerator( - context, "com.riiablo.excel.parser"); + context, "com.riiablo.table.parser"); for (Element element : roundEnv.getElementsAnnotatedWith(Schema.class)) { if (element.getKind() != ElementKind.CLASS) { context.error(element, "{} can only be applied to classes", Schema.class); @@ -68,7 +80,7 @@ public class SchemaProcessor extends AbstractProcessor { t.printStackTrace(System.err); } } - + if (schemaElement.parserElement.declaredType != null) { try { parserCodeGenerator.generate(schemaElement) @@ -92,13 +104,47 @@ public class SchemaProcessor extends AbstractProcessor { t.printStackTrace(System.err); } } - } - return true; + schemas.add(CodeBlock.of("$S", schemaElement.element).toString()); + } + } + + private void generateManifest() { + try { + JavaFile.builder("com.riiablo.table", + TypeSpec + .classBuilder("TableManifest") + .addModifiers(Modifier.PUBLIC, Modifier.FINAL) + .addMethod(MethodSpec + .constructorBuilder() + .addModifiers(Modifier.PRIVATE) + .build()) + .addMethod(MethodSpec + .methodBuilder("tables") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .returns(ArrayTypeName.of(String.class)) + .addStatement("return new String[] {\n$L\n}", StringUtils + .join(schemas, ",\n")) + .build()) + .build()) + .build() + .writeTo(processingEnv.getFiler()); + } catch (Throwable t) { + context.error(ExceptionUtils.getRootCauseMessage(t)); + t.printStackTrace(System.err); + } } @Override public Set getSupportedAnnotationTypes() { - return SUPPORTED_ANNOTATIONS; + Set set = new LinkedHashSet<>(); + set.add(Schema.class.getCanonicalName()); + set.add(PrimaryKey.class.getCanonicalName()); + return SetUtils.unmodifiableSet(set); + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latestSupported(); } }