From 26b01b500065634eb3133dc354a0ba71b13bff56 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Wed, 7 Aug 2013 23:53:53 +0200 Subject: wip o Start of JPA implementation. --- .../trygvis/container/compiler/EntityHandler.java | 183 +++++++++++---------- 1 file changed, 99 insertions(+), 84 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 74f303f..9bce51e 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,15 +1,20 @@ package io.trygvis.container.compiler; import io.trygvis.container.compiler.model.ClassG; +import io.trygvis.container.compiler.model.Constructor; import io.trygvis.container.compiler.model.FieldRef; +import io.trygvis.container.compiler.model.MethodRef; +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.GeneratorConfiguration; import io.trygvis.persistence.SequenceMirror; import io.trygvis.persistence.SqlEntity; +import io.trygvis.persistence.SqlEntitySet; import io.trygvis.persistence.TypeHandler; -import io.trygvis.persistence.sql.SqlEntityDesc; +import io.trygvis.persistence.sql.SqlDao; +import io.trygvis.persistence.sql.SqlEntityMeta; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.AnnotationMirror; @@ -25,9 +30,10 @@ import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.persistence.Id; import javax.persistence.SequenceGenerator; -import javax.tools.JavaFileObject; import java.io.IOException; -import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -35,8 +41,9 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import static io.trygvis.container.compiler.Utils.toFieldName; -import static io.trygvis.container.compiler.Utils.toJavaString; +import static io.trygvis.container.compiler.Utils.*; +import static io.trygvis.container.compiler.model.Parameters.ParameterRef; +import static io.trygvis.container.compiler.model.TypeRef.VOID; import static io.trygvis.persistence.FieldMirror.AccessorType.FIELD; import static io.trygvis.persistence.FieldMirror.AccessorType.METHOD; import static io.trygvis.persistence.FieldMirror.FieldType.PRIMITIVE; @@ -47,15 +54,15 @@ import static java.lang.String.format; import static java.lang.reflect.Modifier.PUBLIC; import static javax.lang.model.util.ElementFilter.fieldsIn; import static javax.lang.model.util.ElementFilter.methodsIn; -import static org.apache.commons.lang.StringUtils.*; +import static org.apache.commons.lang.StringUtils.join; public class EntityHandler extends AbstractHandler { private GeneratorConfiguration generatorConfiguration = new GeneratorConfiguration(); - private SqlUnitModel sqlUnit = new SqlUnitModel(); - private PackageElement packageElement; + private SqlUnitModel sqlUnit; - public EntityHandler(ProcessingEnvironment processingEnv) { + public EntityHandler(ProcessingEnvironment processingEnv, SqlUnitModel sqlUnit) { super(processingEnv); + this.sqlUnit = sqlUnit; } public void phase1(Set sqlEntities, Set packages) throws Exception { @@ -81,11 +88,22 @@ public class EntityHandler extends AbstractHandler { if (packages.size() == 0) { throw new CompilerException("There has to be exactly one @SqlEntitySet annotated package."); } - packageElement = packages.iterator().next(); + PackageElement packageElement = packages.iterator().next(); if (packages.size() != 1) { throw new CompilerException(packageElement, "There can only be one @SqlEntitySet annotated package."); } + AnnotationMirror sqlEntitySet = getAnnotation(SqlEntitySet.class, packageElement); + String name = null; + for (Map.Entry v : sqlEntitySet.getElementValues().entrySet()) { + String field = v.getKey().getSimpleName().toString(); + String value = v.getValue().getValue().toString(); + switch (field) { + case "name": + name = value; + } + } + sqlUnit.setName(name); sqlUnit.setPackageName(packageElement.getQualifiedName().toString()); } @@ -178,6 +196,7 @@ public class EntityHandler extends AbstractHandler { if (idFields.size() != 1) { throw new CompilerException(element, "This implementation only support a single @Id annotated field."); } + entity.setIdType(idFields.get(0).type); sqlUnit.add(entity, element); } @@ -193,18 +212,19 @@ public class EntityHandler extends AbstractHandler { for (Map.Entry v : sequenceGenerator.getElementValues().entrySet()) { String field = v.getKey().getSimpleName().toString(); + String value = v.getValue().getValue().toString(); switch (field) { case "name": - name = v.getValue().getValue().toString(); + name = value; break; case "sequenceName": - sequenceName = v.getValue().getValue().toString(); + sequenceName = value; break; case "initialValue": - initialValue = Integer.valueOf(v.getValue().getValue().toString()); + initialValue = Integer.valueOf(value); break; case "allocationSize": - allocationSize = Integer.valueOf(v.getValue().getValue().toString()); + allocationSize = Integer.valueOf(value); break; default: throw new InternalErrorException("Unsupported field on @SequenceGenerator: " + field); @@ -218,30 +238,83 @@ public class EntityHandler extends AbstractHandler { } public ClassG phase3(EntityMirror entityMirror) throws IOException { - ClassG g = new ClassG(PUBLIC, entityMirror.daoType); + ClassG g = new ClassG(PUBLIC, entityMirror.daoType). + extendsType(new TypeRef(SqlDao.class).args(entityMirror.idType, entityMirror.type)); + Parameters p = new Parameters(); + ParameterRef c = p.addParameter(new TypeRef(Connection.class), "c"); + g.add(new Constructor(p, "super(" + c.name + ");")); TypeRef stringType = g.imports.add(String.class); - TypeRef sqlEntityDescType = g.imports.add(SqlEntityDesc.class); + TypeRef sqlEntityDescType = g.imports.add(SqlEntityMeta.class); + TypeRef sqlException = g.imports.add(SQLException.class); - g.addPublicStaticFinalField(stringType, "createTableSql"). + FieldRef createTableSql = g.addPublicStaticFinalField(stringType, "createTableSql"). value(toJavaString(entityMirror.createTableSql(sqlUnit))); - g.addPublicStaticFinalField(stringType, "dropTableSql"). + g.add(new MethodRef(PUBLIC, stringType, "createTableSql", "return createTableSql;")); + FieldRef dropTableSql = g.addPublicStaticFinalField(stringType, "dropTableSql"). value(toJavaString(entityMirror.dropTableSql())); + g.add(new MethodRef(PUBLIC, stringType, "dropTableSql", "return dropTableSql;")); g.addPublicStaticFinalField(stringType, "insertIntoSql"). value(toJavaString(entityMirror.insertIntoSql(sqlUnit))); g.addPublicStaticFinalField(stringType, "deleteFromSql"). value(toJavaString(entityMirror.deleteFromSql())); String desc = "new " + sqlEntityDescType + "(" + toJavaString(entityMirror.tableName) + ", " + - toJavaString(entityMirror.defaultFields()) + + toJavaString(entityMirror.defaultFields()) + ", " + + toJavaString(createTableSql.name) + ", " + + toJavaString(dropTableSql.name) + ")"; g.addPublicStaticFinalField(sqlEntityDescType, "desc").value(desc); ClassG.InnerClassG typedQuery = g.addInnerClass(entityMirror.queryType(g.imports)); - typedQuery.inner.addMethod(entityMirror.fromResultSet(g.imports)); - g.addMethod(entityMirror.insertInto(sqlUnit, g.imports)); - g.addMethod(entityMirror.delete(g.imports)); - g.addMethod(entityMirror.deleteById(g.imports)); - g.addMethod(entityMirror.query(g.imports)); + g.addInnerClass(entityMirror.utils(sqlUnit)); + + { + p = new Parameters(); + ParameterRef rs = p.addParameter(new TypeRef(ResultSet.class), "rs"); + g.add(new MethodRef(PUBLIC, entityMirror.type, "fromResultSet", p, + "return Utils.fromResultSet" + entityMirror.type.className + "(" + rs.name + ");"). + exception(sqlException)); + } + + { + p = new Parameters(); + ParameterRef entity = p.addParameter(entityMirror.type, "entity"); + g.add(new MethodRef(PUBLIC, VOID, "insert", p, + "Utils.insert" + entityMirror.type.className + "(super.c, " + entity.name + ");"). + exception(sqlException)); + } + + { + p = new Parameters(); + ParameterRef id = p.addParameter(entityMirror.idType, "id"); + g.add(new MethodRef(PUBLIC, entityMirror.type, "selectById", p, + "return Utils.select" + entityMirror.type.className + "ById(super.c, " + id.name + ");"). + exception(sqlException)); + } + + { + p = new Parameters(); + ParameterRef entity = p.addParameter(entityMirror.type, "entity"); + g.add(new MethodRef(PUBLIC, VOID, "delete", p, + "Utils.delete" + entityMirror.type.className + "(super.c, " + entity.name + ");"). + exception(sqlException)); + } + + { + p = new Parameters(); + ParameterRef id = p.addParameter(entityMirror.idType, "id"); + g.add(new MethodRef(PUBLIC, VOID, "deleteById", p, + "Utils.delete" + entityMirror.type.className + "ById(super.c, " + id.name + ");"). + exception(sqlException)); + } + + { + p = new Parameters(); + ParameterRef entity = p.addParameter(entityMirror.type, "entity"); + g.add(new MethodRef(PUBLIC, VOID, "update", p, + "Utils.update" + entityMirror.type.className + "(super.c, " + entity.name + ");"). + exception(sqlException)); + } return g; } @@ -328,10 +401,8 @@ public class EntityHandler extends AbstractHandler { public void phase3(boolean errorRaised) throws Exception { try { for (EntityMirror entity : sqlUnit.getEntities().values()) { - writeFile(phase3(entity), sqlUnit.element(entity)); + writeFile(processingEnv, phase3(entity), sqlUnit.element(entity)); } - writeFile(generateSequences(sqlUnit), null); - writeFile(generateSession(), null); } catch (CompilerException | InternalErrorException e) { // Ignore any exceptions if we had an error from before if (errorRaised) { @@ -341,62 +412,6 @@ public class EntityHandler extends AbstractHandler { } } - private ClassG generateSequences(SqlUnitModel unit) { - TypeRef sequences = new TypeRef(unit.getPackageName() + ".Sequences"); - ClassG g = new ClassG(PUBLIC, sequences); - List creates = new ArrayList<>(); - List drops = new ArrayList<>(); - for (SequenceMirror sequence : unit.getSequences().values()) { - TypeRef stringType = g.imports.add(String.class); - String value = "CREATE SEQUENCE " + sequence.sequenceName + ";"; - FieldRef f = g.addPublicStaticFinalField(stringType, "create" + capitalize(sequence.name)). - value(toJavaString(value)); - creates.add(f.name); - - f = g.addPublicStaticFinalField(stringType, "drop" + capitalize(sequence.name)). - value(toJavaString("DROP SEQUENCE " + sequence.sequenceName) + ";"); - drops.add(f.name); - - } - g.addPublicStaticFinalField(new TypeRef(String[].class), "createSequences"). - value("new String[]{" + join(creates, ", ") + "}"); - g.addPublicStaticFinalField(new TypeRef(String[].class), "dropSequences"). - value("new String[]{" + join(drops, ", ") + "}"); - return g; - } - - private void writeFile(ClassG g, Element element) throws IOException { - JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(g.type.fqName, element); - try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) { - for (String s : g.generate()) { - w.println(stripEnd(s, " ")); - } - } - } - - private ClassG generateSession() throws IOException { - String p = packageElement.getQualifiedName().toString(); - - // TODO: Support a name prefix from @SqlEntitySet - TypeRef type = new TypeRef(p + ".Session"); - -/* - TypeRef conType = g.add(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); -*/ - - return new ClassG(PUBLIC, type); - } - public static String sqlName(String javaName) { StringBuilder builder = new StringBuilder(); for (char c : javaName.toCharArray()) { @@ -420,7 +435,7 @@ public class EntityHandler extends AbstractHandler { return null; } - public AnnotationMirror getAnnotation(Class c, TypeElement type) { + public AnnotationMirror getAnnotation(Class c, Element type) { AnnotationMirror annotation = findAnnotation(c, type); if (annotation != null) { -- cgit v1.2.3