From 34137b599dbea13c94224dff2955376b1394dbc9 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 3 Aug 2013 12:33:39 +0200 Subject: wip --- .../trygvis/container/compiler/EntityHandler.java | 89 ++++++++++++++++------ 1 file changed, 66 insertions(+), 23 deletions(-) (limited to 'container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java') diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java index df7a673..f9247e0 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java @@ -1,43 +1,90 @@ package io.trygvis.container.compiler; -import io.trygvis.container.compiler.entity.EntityMirror; import io.trygvis.container.compiler.model.ClassG; import io.trygvis.container.compiler.model.Parameters; +import io.trygvis.persistence.EntityMirror; +import io.trygvis.persistence.FieldMirror; +import io.trygvis.persistence.GeneratorSupport; +import io.trygvis.persistence.SqlEntity; +import io.trygvis.persistence.TypeHandler; import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; import javax.tools.JavaFileObject; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Set; -import static io.trygvis.container.compiler.entity.EntityMirror.FieldMirror; +import static io.trygvis.persistence.FieldMirror.PrimitiveFieldMirror; import static java.lang.Character.isUpperCase; import static javax.lang.model.util.ElementFilter.fieldsIn; -import static org.springframework.util.StringUtils.collectionToDelimitedString; public class EntityHandler extends AbstractHandler { + GeneratorSupport generatorSupport = new GeneratorSupport(); + public EntityHandler(ProcessingEnvironment processingEnv) { super(processingEnv); } + public void phase1(Set sqlEntities) throws Exception { + System.out.println("io.trygvis.container.compiler.EntityHandler.phase1"); + for (Element entity : sqlEntities) { +// SqlEntity sqlEntity = entity.getAnnotation(SqlEntity.class); +// Class typeHandlerClass = sqlEntity.value(); + + AnnotationMirror sqlEntity = findAnnotation(SqlEntity.class, entity.getAnnotationMirrors()); + for (Map.Entry v : sqlEntity.getElementValues().entrySet()) { + switch (v.getKey().getSimpleName().toString()) { + case "value": + Class typeHandlerClass = getClass().getClassLoader().loadClass(v.getValue().getValue().toString()); + + TypeHandler typeHandler = (TypeHandler) typeHandlerClass.newInstance(); + String type = entity.asType().toString(); + generatorSupport.addTypeHandler(type, typeHandler); + System.out.println("Loaded TypeHandler for " + type + " through " + typeHandlerClass.getCanonicalName()); + break; + } + } + System.out.println("sqlEntity.getElementValues() = " + sqlEntity.getElementValues()); + } + } + + private AnnotationMirror findAnnotation(Class c, List annotations) { + TypeElement t = elements.getTypeElement(c.getCanonicalName()); + for (AnnotationMirror a : annotations) { + if (types.isSameType(a.getAnnotationType(), t.asType())) { + return a; + } + } + + throw new RuntimeException("Could not find annotation " + c.getSimpleName()); + } + public void processEntity(TypeElement element) throws Exception { - EntityMirror entityMirror = new EntityMirror(sqlName(element.getSimpleName().toString())); + EntityMirror entityMirror = new EntityMirror(generatorSupport, element.asType(), sqlName(element.getSimpleName().toString())); for (VariableElement f : fieldsIn(elements.getAllMembers(element))) { - entityMirror.add(fromElement(f)); + entityMirror.add(fromElement(generatorSupport, f)); } String p = elements.getPackageOf(element).getQualifiedName().toString(); String className = element.getSimpleName() + "_Sql"; ClassG g = new ClassG(p, className, null); - g.addPublicFinalField(String.class, "insertInto"); - String insertInto = insertInto(entityMirror); + g.addPublicFinalField(String.class, "insertIntoSql"); + String insertInto = entityMirror.insertIntoSql(); List body = new ArrayList<>(); - body.add("this.insertInto = \"" + insertInto + "\";"); + body.add("this.insertIntoSql = \"" + insertInto + "\";"); g.addConstructor(new Parameters(), body); + entityMirror.insertInto(g); String fileName = (p.length() == 0 ? "" : p + ".") + className; JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(fileName, element); @@ -46,25 +93,21 @@ public class EntityHandler extends AbstractHandler { } } - public static String insertInto(EntityMirror entityMirror) { - List names = new ArrayList<>(); - List placeholders = new ArrayList<>(); - for (FieldMirror field : entityMirror.fields) { - names.add(field.sqlName); - placeholders.add("?"); - } - return "INSERT INTO " + entityMirror.tableName + "(" + collectionToDelimitedString(names, ", ") + ") " + - "VALUES(" + collectionToDelimitedString(placeholders, ", ") + ");"; - } - - public FieldMirror fromElement(VariableElement var) { - System.out.println("io.trygvis.container.compiler.entity.EntityMirror.FieldMirror.fromElement"); + public FieldMirror fromElement(GeneratorSupport generatorSupport, VariableElement var) { System.out.print("element = "); + TypeMirror type = var.asType(); elements.printElements(new PrintWriter(System.out), var); String javaName = var.getSimpleName().toString(); String sqlName = sqlName(javaName); boolean notNull = false; - FieldMirror field = new FieldMirror(javaName, sqlName, notNull); + FieldMirror field; + if (generatorSupport.isPrimitive(type)) { + field = new PrimitiveFieldMirror(var, javaName, sqlName, notNull); + } else if (generatorSupport.hasTypeHandler(type)) { + field = new FieldMirror.ReferenceFieldMirror(var, javaName, sqlName, notNull); + } else { + throw new RuntimeException("Missing type handler for type: " + type); + } System.out.println("field = " + field); return field; } @@ -73,7 +116,7 @@ public class EntityHandler extends AbstractHandler { StringBuilder builder = new StringBuilder(); for (char c : javaName.toCharArray()) { char lower = Character.toLowerCase(c); - if(isUpperCase(c) && builder.length() > 0) { + if (isUpperCase(c) && builder.length() > 0) { builder.append("_"); } builder.append(lower); -- cgit v1.2.3