From b5d6f23d8ac3d4bedb139fdaecc2e9dc621f385a Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 3 Aug 2013 15:06:46 +0200 Subject: wip --- .../trygvis/container/compiler/EntityHandler.java | 111 +++++++++++++++++---- 1 file changed, 90 insertions(+), 21 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 f9247e0..fc7ca4f 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,7 +1,10 @@ package io.trygvis.container.compiler; import io.trygvis.container.compiler.model.ClassG; +import io.trygvis.container.compiler.model.FieldRef; +import io.trygvis.container.compiler.model.ParameterRef; import io.trygvis.container.compiler.model.Parameters; +import io.trygvis.container.compiler.model.TypeRef; import io.trygvis.persistence.EntityMirror; import io.trygvis.persistence.FieldMirror; import io.trygvis.persistence.GeneratorSupport; @@ -11,35 +14,37 @@ 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.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; +import javax.persistence.Id; import javax.tools.JavaFileObject; import java.io.PrintWriter; +import java.sql.Connection; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; +import static io.trygvis.container.compiler.Utils.toFieldName; import static io.trygvis.persistence.FieldMirror.PrimitiveFieldMirror; import static java.lang.Character.isUpperCase; import static javax.lang.model.util.ElementFilter.fieldsIn; public class EntityHandler extends AbstractHandler { - GeneratorSupport generatorSupport = new GeneratorSupport(); + private GeneratorSupport generatorSupport = new GeneratorSupport(); + private List entities = new ArrayList<>(); + private PackageElement packageElement; 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(); - + public void phase1(Set sqlEntities, Set packages) throws Exception { + for (TypeElement entity : sqlEntities) { AnnotationMirror sqlEntity = findAnnotation(SqlEntity.class, entity.getAnnotationMirrors()); for (Map.Entry v : sqlEntity.getElementValues().entrySet()) { switch (v.getKey().getSimpleName().toString()) { @@ -53,8 +58,18 @@ public class EntityHandler extends AbstractHandler { break; } } - System.out.println("sqlEntity.getElementValues() = " + sqlEntity.getElementValues()); +// System.out.println("sqlEntity.getElementValues() = " + sqlEntity.getElementValues()); + } + + System.out.println("packages = " + packages); + if (packages.size() == 0) { + throw new RuntimeException("There has to be exactly one @SqlEntitySet annotated package."); + } + if (packages.size() != 1) { + throw new RuntimeException("There can only be one @SqlEntitySet annotated package."); } + + packageElement = packages.iterator().next(); } private AnnotationMirror findAnnotation(Class c, List annotations) { @@ -69,49 +84,103 @@ public class EntityHandler extends AbstractHandler { } public void processEntity(TypeElement element) throws Exception { - EntityMirror entityMirror = new EntityMirror(generatorSupport, element.asType(), sqlName(element.getSimpleName().toString())); + DeclaredType declaredType = types.getDeclaredType(element); + EntityMirror entityMirror = new EntityMirror(generatorSupport, declaredType, sqlName(element.getSimpleName().toString())); for (VariableElement f : fieldsIn(elements.getAllMembers(element))) { entityMirror.add(fromElement(generatorSupport, f)); } + List idFields = new ArrayList<>(); + for (FieldMirror field : entityMirror.fields) { + if (field.id) { + idFields.add(field); + } + } + + if (idFields.size() == 0) { + throw new RuntimeException("An @Entity is required to have at least one @Id field."); + } + if (idFields.size() != 1) { + throw new RuntimeException("This implementation only support a single @Id annotated field."); + } + String p = elements.getPackageOf(element).getQualifiedName().toString(); - String className = element.getSimpleName() + "_Sql"; - ClassG g = new ClassG(p, className, null); - g.addPublicFinalField(String.class, "insertIntoSql"); + ClassG g = new ClassG(p, entityMirror.daoName); String insertInto = entityMirror.insertIntoSql(); - List body = new ArrayList<>(); - body.add("this.insertIntoSql = \"" + insertInto + "\";"); - g.addConstructor(new Parameters(), body); + g.addPublicStaticFinalField(String.class, "insertIntoSql").value("\"" + insertInto + "\""); +// List body = new ArrayList<>(); +// body.add("this.insertIntoSql = \"" + insertInto + "\";"); +// g.addConstructor(new Parameters(), body); entityMirror.insertInto(g); - String fileName = (p.length() == 0 ? "" : p + ".") + className; + String fileName = (p.length() == 0 ? "" : p + ".") + entityMirror.daoName; JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(fileName, element); try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) { g.write(w); } + + entities.add(entityMirror); } public FieldMirror fromElement(GeneratorSupport generatorSupport, VariableElement var) { - System.out.print("element = "); TypeMirror type = var.asType(); - elements.printElements(new PrintWriter(System.out), var); +// System.out.print("element = "); +// elements.printElements(new PrintWriter(System.out), var); String javaName = var.getSimpleName().toString(); String sqlName = sqlName(javaName); boolean notNull = false; FieldMirror field; + boolean id = isId(var); if (generatorSupport.isPrimitive(type)) { - field = new PrimitiveFieldMirror(var, javaName, sqlName, notNull); + field = new PrimitiveFieldMirror(var, javaName, sqlName, id, notNull); } else if (generatorSupport.hasTypeHandler(type)) { + if (id) { + throw new RuntimeException("A @Id field has to be a primitive or embedded."); + } + field = new FieldMirror.ReferenceFieldMirror(var, javaName, sqlName, notNull); } else { throw new RuntimeException("Missing type handler for type: " + type); } - System.out.println("field = " + field); +// System.out.println("field = " + field); return field; } + public static boolean isId(VariableElement var) { + return var.getAnnotation(Id.class) != null; + } + + public void phase3() throws Exception { + String p = packageElement.getQualifiedName().toString(); + + // TODO: Support a name prefix from @SqlEntitySet + String className = "Daos"; + + String fileName = (p.length() == 0 ? "" : p + ".") + className; + ClassG g = new ClassG(p, className); + +/* + TypeRef conType = g.addImport(Connection.class); + Parameters parameters = new Parameters(); + ParameterRef c = parameters.addParameter(conType, "c"); + + List body = new ArrayList<>(); + for (EntityMirror entity : entities) { + FieldRef fieldRef = g.addField(entity.javaName.asElement().asType(), toFieldName(entity.daoName)); + body.add("this." + fieldRef.name + " = new " + entity.daoName + "(" + c.name + ");"); + } + + g.addConstructor(parameters, body); +*/ + + JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(fileName, packageElement); + try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) { + g.write(w); + } + } + public static String sqlName(String javaName) { StringBuilder builder = new StringBuilder(); for (char c : javaName.toCharArray()) { -- cgit v1.2.3