From 2b1c32590db960be2b5f62897e65bb10d434cae0 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 3 Aug 2013 23:13:32 +0200 Subject: wip --- .../java/io/trygvis/persistence/EntityMirror.java | 104 ++++++++++++++++----- .../java/io/trygvis/persistence/TypeHandler.java | 40 ++++++-- 2 files changed, 114 insertions(+), 30 deletions(-) (limited to 'container-compiler-plugin/src/main/java/io/trygvis/persistence') diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java index 8e1602c..74c4829 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java @@ -3,18 +3,26 @@ package io.trygvis.persistence; import io.trygvis.container.compiler.NotImplementedException; import io.trygvis.container.compiler.SqlUnitModel; import io.trygvis.container.compiler.model.ClassG; -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.sql.AbstractTypedQuery; +import io.trygvis.persistence.sql.SqlEntityDesc; +import javax.persistence.TypedQuery; import java.sql.Connection; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import static io.trygvis.container.compiler.model.Parameters.ParameterRef; import static io.trygvis.persistence.FieldMirror.PrimitiveFieldMirror; import static io.trygvis.persistence.FieldMirror.ReferenceFieldMirror; import static java.lang.String.format; +import static java.lang.reflect.Modifier.PUBLIC; +import static java.lang.reflect.Modifier.STATIC; +import static java.util.Collections.singletonList; import static org.apache.commons.lang.StringUtils.join; public class EntityMirror implements Comparable { @@ -30,7 +38,7 @@ public class EntityMirror implements Comparable { this.type = type; this.tableName = tableName; - this.daoType = new TypeRef(type.name + "Dao"); + this.daoType = new TypeRef(type.plainName + "Dao").args(type.args); } public void add(FieldMirror field) { @@ -111,41 +119,51 @@ public class EntityMirror implements Comparable { return "DELETE FROM " + tableName + " WHERE " + join(ss, " AND ") + ";"; } + public String defaultFields() { + List names = new ArrayList<>(); + for (FieldMirror field : fields) { + names.add(field.sqlName); + } + + return join(names, ", "); + } + public void insertInto(SqlUnitModel unit, ClassG g) { TypeRef conType = g.addImport(Connection.class); TypeRef psType = g.addImport(PreparedStatement.class); - TypeRef objectType = g.addImport(type); - ParameterRef con = new ParameterRef(conType, "con"); - ParameterRef object = new ParameterRef(objectType, "o"); + Parameters p = new Parameters(); + ParameterRef con = p.addParameter(conType, "con"); + ParameterRef o = p.addParameter(type, "o"); List body = new ArrayList<>(); - body.add("try(" + psType.name + " stmt = " + con.name + ".prepareStatement(insertIntoSql)) {"); + body.add("try(" + psType + " stmt = " + con.name + ".prepareStatement(insertIntoSql)) {"); for (int i = 0; i < fields.size(); i++) { FieldMirror field = fields.get(i); if(field instanceof PrimitiveFieldMirror) { TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type); - body.add(" stmt." + typeHandler.setter(i + 1, "o." + field.javaName) + ";"); + body.add(" stmt." + typeHandler.setter(i + 1, o.name + "." + field.javaName) + ";"); } else if (field instanceof ReferenceFieldMirror) { ReferenceFieldMirror ref = (ReferenceFieldMirror) field; EntityMirror referenced = unit.get(ref.type); FieldMirror idField = referenced.getIdField(); TypeHandler typeHandler = generatorConfiguration.typeHandler(idField.type); - body.add(" stmt." + typeHandler.setter(i + 1, "o." + field.javaName + "." + idField.javaName) + ";"); + body.add(" stmt." + typeHandler.setter(i + 1, o.name + "." + field.javaName + "." + idField.javaName) + ";"); } } body.add(" stmt.executeUpdate();"); body.add("}"); - g.addStaticMethod(body, TypeRef.VOID, "insertInto", con, object). + g.addStaticMethod(body, TypeRef.VOID, "insertInto", p). exception(g.addImport(SQLException.class)); } public void delete(ClassG g) { TypeRef conType = g.addImport(Connection.class); TypeRef objectType = g.addImport(type); - ParameterRef con = new ParameterRef(conType, "con"); - ParameterRef o = new ParameterRef(objectType, "o"); + Parameters p = new Parameters(); + ParameterRef con = p.addParameter(conType, "con"); + ParameterRef o = p.addParameter(objectType, "o"); List arguments = new ArrayList<>(); arguments.add(con.name); @@ -155,32 +173,76 @@ public class EntityMirror implements Comparable { List body = new ArrayList<>(); body.add("deleteById(" + join(arguments, ", ") + ");"); - g.addStaticMethod(body, TypeRef.VOID, "delete", con, o). + g.addStaticMethod(body, TypeRef.VOID, "delete", p). exception(g.addImport(SQLException.class)); } public void deleteById(ClassG g) { TypeRef conType = g.addImport(Connection.class); TypeRef psType = g.addImport(PreparedStatement.class); - ParameterRef con = new ParameterRef(conType, "con"); - - ParameterRef[] parameters = new ParameterRef[idFields.size() + 1]; - parameters[0] = con; + Parameters p = new Parameters(); + ParameterRef con = p.addParameter(conType, "con"); List body = new ArrayList<>(); - body.add("try(" + psType.name + " stmt = " + con.name + ".prepareStatement(deleteFromSql)) {"); + body.add("try(" + psType + " stmt = " + con.name + ".prepareStatement(deleteFromSql)) {"); for (int i = 0; i < idFields.size(); i++) { FieldMirror field = idFields.get(i); + p.addParameter(field.type, field.javaName); TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type); - ParameterRef p = new ParameterRef(field.type, field.javaName); - parameters[i + 1] = p; body.add(" stmt." + typeHandler.setter(i + 1, field.javaName) + ";"); } body.add(" stmt.executeUpdate();"); body.add("}"); - g.addStaticMethod(body, TypeRef.VOID, "deleteById", parameters). + g.addStaticMethod(body, TypeRef.VOID, "deleteById", p). + exception(g.addImport(SQLException.class)); + } + + public void query(SqlUnitModel sqlUnit, ClassG g) { + TypeRef conType = g.addImport(Connection.class); + TypeRef abstractQueryType = g.addImport(AbstractTypedQuery.class).args(type); + TypeRef typedQueryType = g.addImport(TypedQuery.class).args(type); + + Parameters p = new Parameters(); + ParameterRef c = p.addParameter(conType, "c"); + + ClassG typedQuery = g.addInnerClass(PUBLIC | STATIC, new TypeRef(type.className + "TypedQuery")). + extendsType(abstractQueryType); + typedQuery.addConstructor(p, singletonList("super(" + c.name + ", " + daoType.className + ".desc);")); + fromResultSet(sqlUnit, typedQuery); + + List body = new ArrayList<>(); + body.add("return new " + typedQuery.type + "(" + c.name + ");"); + g.addStaticMethod(body, typedQueryType, "query", p); + } + + public void fromResultSet(SqlUnitModel unit, ClassG g) { + TypeRef rsType = g.addImport(ResultSet.class); + Parameters p = new Parameters(); + ParameterRef rs = p.addParameter(rsType, "rs"); + + List body = new ArrayList<>(); + List names = new ArrayList<>(); + for (int i = 0; i < fields.size(); i++) { + FieldMirror field = fields.get(i); + if(field instanceof PrimitiveFieldMirror) { + TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type); + body.add(field.type + " " + field.javaName + " = " + typeHandler.getter(rs.name, i + 1) + ";"); + } else if (field instanceof ReferenceFieldMirror) { + ReferenceFieldMirror ref = (ReferenceFieldMirror) field; + EntityMirror referenced = unit.get(ref.type); + FieldMirror idField = referenced.getIdField(); + TypeHandler typeHandler = generatorConfiguration.typeHandler(idField.type); +// body.add(field.type + " " + field.javaName + " = " + typeHandler.getter(rs.name, i + 1) + ";"); + body.add(field.type + " " + field.javaName + " = null;"); + } + names.add(field.javaName); + } + + body.add("return new " + type + "(" + join(names, ", ") + ");"); + + g.addMethod(body, type, "fromResultSet", p). exception(g.addImport(SQLException.class)); } @@ -200,7 +262,7 @@ public class EntityMirror implements Comparable { } @Override - public int compareTo(EntityMirror o) { + public int compareTo(@SuppressWarnings("NullableProblems") EntityMirror o) { return type.compareTo(o.type); } } diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/TypeHandler.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/TypeHandler.java index 3aacd7a..0454a96 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/TypeHandler.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/TypeHandler.java @@ -1,14 +1,21 @@ package io.trygvis.persistence; public interface TypeHandler { - String setter(int i, String ref); + String setter(int i, String expr); + + String getter(String rs, int i); String sqlType(FieldMirror field); public static class IntTypeHandler implements TypeHandler { @Override - public String setter(int i, String ref) { - return "setInt(" + i + ", " + ref + ")"; + public String setter(int i, String expr) { + return "setInt(" + i + ", " + expr + ")"; + } + + @Override + public String getter(String rs, int i) { + return rs + ".getInt(" + i + ")"; } @Override @@ -19,8 +26,13 @@ public interface TypeHandler { public static class LongTypeHandler implements TypeHandler { @Override - public String setter(int i, String ref) { - return "setLong(" + i + ", " + ref + ")"; + public String setter(int i, String expr) { + return "setLong(" + i + ", " + expr + ")"; + } + + @Override + public String getter(String rs, int i) { + return rs + ".getLong(" + i + ")"; } @Override @@ -31,8 +43,13 @@ public interface TypeHandler { public static class StringTypeHandler implements TypeHandler { @Override - public String setter(int i, String ref) { - return "setString(" + i + ", " + ref + ")"; + public String setter(int i, String expr) { + return "setString(" + i + ", " + expr + ")"; + } + + @Override + public String getter(String rs, int i) { + return rs + ".getString(" + i + ")"; } @Override @@ -43,8 +60,13 @@ public interface TypeHandler { public static class DateTypeHandler implements TypeHandler { @Override - public String setter(int i, String ref) { - return "setTimestamp(" + i + ", new java.sql.Timestamp(" + ref + ".getTime()))"; + public String setter(int i, String expr) { + return "setTimestamp(" + i + ", new java.sql.Timestamp(" + expr + ".getTime()))"; + } + + @Override + public String getter(String rs, int i) { + return "new java.util.Date(" + rs + ".getTimestamp(" + i + ").getTime())"; } @Override -- cgit v1.2.3