diff options
Diffstat (limited to 'container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java')
-rw-r--r-- | container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java | 309 |
1 files changed, 1 insertions, 308 deletions
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 140a910..f63c4b2 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 @@ -2,34 +2,14 @@ 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.Constructor; -import io.trygvis.container.compiler.model.Imports; -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.sql.AbstractTypedQuery; -import javax.persistence.TypedQuery; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; import java.util.ArrayList; import java.util.List; -import static io.trygvis.container.compiler.Utils.toGetterName; -import static io.trygvis.container.compiler.Utils.toSetterName; -import static io.trygvis.container.compiler.model.Parameters.ParameterRef; -import static io.trygvis.persistence.FieldMirror.AccessorType.FIELD; -import static io.trygvis.persistence.FieldMirror.AccessorType.METHOD; import static io.trygvis.persistence.FieldMirror.FieldType.PRIMITIVE; import static io.trygvis.persistence.FieldMirror.FieldType.REFERENCE; 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<EntityMirror> { @@ -48,7 +28,7 @@ public class EntityMirror implements Comparable<EntityMirror> { this.tableName = tableName; this.daoType = new TypeRef(type.plainName + "Dao").args(type.args); - this.utilsType = new TypeRef(type.plainName + ".Utils").args(type.args); + this.utilsType = new TypeRef(type.plainName + "Dao.Utils").args(type.args); } public void add(FieldMirror... fields) { @@ -69,281 +49,6 @@ public class EntityMirror implements Comparable<EntityMirror> { return idFields.get(0); } - public String createTableSql(SqlUnitModel unit) { - List<String> columns = new ArrayList<>(); - for (FieldMirror field : fields) { - String s; - if (field.fieldType == PRIMITIVE) { - TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type); - s = " " + field.sqlName + " " + typeHandler.sqlType(field); - if (field.id) { - s += " PRIMARY KEY"; - } else if (field.notNull) { - s += " NOT NULL"; - } else if (field.unique) { - s += " UNIQUE"; - } - } else if (field.fieldType == REFERENCE) { - EntityMirror referenced = unit.get(field.type); - if (referenced.idFields.size() == 1) { - FieldMirror idField = referenced.idFields.get(0); - TypeHandler typeHandler = generatorConfiguration.typeHandler(idField.type); - s = " " + field.sqlName + " " + typeHandler.sqlType(field); - s += " REFERENCES " + referenced.tableName + "(" + idField.sqlName + ")"; - if (field.notNull) { - s += " NOT NULL"; - } else if (field.unique) { - s += " UNIQUE"; - } - } else { - throw new NotImplementedException(); - } - } else { - throw new RuntimeException("Unknown field type: " + field.getClass()); - } - columns.add(s); - } - - return format("CREATE TABLE " + tableName + "(%n" + - join(columns, ",%n") + - "%n);"); - } - - public String dropTableSql() { - return "DROP TABLE " + tableName + ";"; - } - - public String insertIntoSql(SqlUnitModel unit) { - List<String> columns = new ArrayList<>(); - List<String> values = new ArrayList<>(); - for (FieldMirror field : fields) { - columns.add(field.sqlName); - if (field.id) { - values.add("nextval('" + unit.getDefaultSequence().sequenceName + "')"); - } else { - values.add("?"); - } - } - - return "INSERT INTO " + tableName + "(" + join(columns, ", ") + ") " + - "VALUES(" + join(values, ", ") + ");"; - } - - public String deleteFromSql() { - List<String> ss = new ArrayList<>(); - for (FieldMirror field : idFields) { - ss.add(field.sqlName + "=?"); - } - - return "DELETE FROM " + tableName + " WHERE " + join(ss, " AND ") + ";"; - } - - public String defaultFields() { - List<String> names = new ArrayList<>(); - for (FieldMirror field : fields) { - names.add(field.sqlName); - } - - return join(names, ", "); - } - - public MethodRef insertInto(SqlUnitModel unit, Imports imports) { - TypeRef sqlExceptionType = imports.add(SQLException.class); - TypeRef typesType = imports.add(Types.class); - TypeRef conType = imports.add(Connection.class); - TypeRef psType = imports.add(PreparedStatement.class); - Parameters p = new Parameters(); - ParameterRef con = p.addParameter(conType, "con"); - ParameterRef o = p.addParameter(type, "o"); - - List<String> body = new ArrayList<>(); - - body.add("try(" + psType + " stmt = " + con.name + ".prepareStatement(insertIntoSql)) {"); - int i = 0; - for (FieldMirror field : fields) { - // Assume all ID fields are generated for now. - if (field.id) { - continue; - } - - i++; - - TypeHandler typeHandler; - String accessor; - String setter; - if (field.fieldType == PRIMITIVE) { - typeHandler = generatorConfiguration.typeHandler(field.type); - accessor = field.fieldAccessor(o); - setter = " stmt." + typeHandler.setter(i, accessor) + ";"; - } else { - EntityMirror referenced = unit.get(field.type); - FieldMirror idField = referenced.getIdField(); - typeHandler = generatorConfiguration.typeHandler(idField.type); - accessor = field.referenceAccessor(o, idField); - setter = " stmt." + typeHandler.setter(i, accessor) + ";"; - accessor = "null"; - } - - if (field.notNull) { - body.add(setter); - } else { - body.add(" " + field.type + " " + field.javaName + " = " + accessor + ";"); - body.add(" if (" + field.javaName + " == null) {"); - body.add(" stmt.setNull(" + i + ", " + typesType + "." + typeHandler.typeName() + ");"); - body.add(" } else {"); - body.add(" " + setter); - body.add(" }"); - } - } - body.add(" stmt.executeUpdate();"); - body.add("}"); - return new MethodRef(PUBLIC | STATIC, TypeRef.VOID, "insert" + type.className, p, body).exception(sqlExceptionType); - } - - public MethodRef selectById(Imports imports) { - Parameters p = new Parameters(); - p.addParameter(imports.add(Connection.class), "c"); - p.addParameter(idType, "id"); - return new MethodRef(PUBLIC | STATIC, type, "select" + type.className + "ById", p, - "throw new UnsupportedOperationException(\"Not implemented\");"); - } - - public MethodRef update(Imports imports) { - Parameters p = new Parameters(); - p.addParameter(imports.add(Connection.class), "c"); - p.addParameter(type, "entity"); - return new MethodRef(PUBLIC | STATIC, type, "update" + type.className, p, - "throw new UnsupportedOperationException(\"Not implemented\");"); - } - - public MethodRef delete(Imports imports) { - TypeRef conType = imports.add(Connection.class); - TypeRef objectType = imports.add(type); - Parameters p = new Parameters(); - ParameterRef con = p.addParameter(conType, "con"); - ParameterRef o = p.addParameter(objectType, "o"); - - List<String> arguments = new ArrayList<>(); - arguments.add(con.name); - for (FieldMirror field : idFields) { - if (field.accessorType == FIELD) { - arguments.add(o.name + "." + field.javaName); - } else { - arguments.add(o.name + "." + toGetterName(field.javaName) + "()"); - } - } - - return new MethodRef(PUBLIC | STATIC, TypeRef.VOID, "delete" + type.className, p, - "delete" + type.className + "ById(" + join(arguments, ", ") + ");").exception(imports.add(SQLException.class)); - } - - public MethodRef deleteById(Imports imports) { - TypeRef conType = imports.add(Connection.class); - TypeRef psType = imports.add(PreparedStatement.class); - Parameters p = new Parameters(); - ParameterRef con = p.addParameter(conType, "con"); - - List<String> body = new ArrayList<>(); - - 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); - body.add(" stmt." + typeHandler.setter(i + 1, field.javaName) + ";"); - } - body.add(" stmt.executeUpdate();"); - body.add("}"); - - return new MethodRef(PUBLIC | STATIC, TypeRef.VOID, "delete" + type.className + "ById", p, body). - exception(imports.add(SQLException.class)); - } - - public ClassG queryType(Imports imports) { - TypeRef sqlQueryType = imports.add(AbstractTypedQuery.class).args(type); - TypeRef conType = imports.add(Connection.class); - TypeRef entityTypedQuery = new TypeRef(type.className + "TypedQuery"); - TypeRef sqlExceptionType = new TypeRef(SQLException.class); - - Parameters p = new Parameters(); - ParameterRef c = p.addParameter(conType, "c"); - Constructor constructor = new Constructor(p, singletonList("super(" + c.name + ", " + daoType.className + ".desc);")); - ClassG g = new ClassG(PUBLIC | STATIC, entityTypedQuery). - extendsType(sqlQueryType). - add(constructor); - p = new Parameters(); - ParameterRef rs = p.addParameter(new TypeRef(ResultSet.class), "rs"); - MethodRef fromResultSet = new MethodRef(PUBLIC, type, "fromResultSet", p, - "return " + utilsType.className + ".fromResultSet" + type.className + "(" + rs.name + ");"). - exception(sqlExceptionType); - g.add(fromResultSet); - return g; - } - - public MethodRef query(Imports imports) { - TypeRef conType = imports.add(Connection.class); - TypeRef typedQueryType = imports.add(TypedQuery.class).args(type); - TypeRef entityTypedQuery = new TypeRef(type.className + "TypedQuery"); - - Parameters p = new Parameters(); - ParameterRef c = p.addParameter(conType, "c"); - return new MethodRef(PUBLIC | STATIC, typedQueryType, "query" + type.className, p, - "return new " + entityTypedQuery + "(" + c.name + ");"); - } - - public MethodRef fromResultSet(Imports g) { - TypeRef rsType = g.add(ResultSet.class); - Parameters p = new Parameters(); - ParameterRef rs = p.addParameter(rsType, "rs"); - - List<String> body = new ArrayList<>(); - List<String> names = new ArrayList<>(); - for (int i = 0; i < fields.size(); i++) { - FieldMirror field = fields.get(i); - if (field.accessorType != FIELD) { - continue; - } - if (field.fieldType == PRIMITIVE) { - TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type); - body.add(field.type + " " + field.javaName + " = " + typeHandler.getter(rs.name, i + 1) + ";"); - } else if (field.fieldType == REFERENCE) { -// 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(type + " returnValue = new " + type + "(" + join(names, ", ") + ");"); - - for (int i = 0; i < fields.size(); i++) { - FieldMirror field = fields.get(i); - if (field.accessorType != METHOD) { - continue; - } - if (field.fieldType == PRIMITIVE) { - TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type); - body.add("returnValue." + toSetterName(field.javaName) + "(" + typeHandler.getter(rs.name, i + 1) + ");"); - } else if (field.fieldType == REFERENCE) { -// 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("returnValue." + toSetterName(field.javaName) + "(" + null + ");"); - } - names.add(field.javaName); - } - - body.add("return returnValue;"); - - return new MethodRef(PUBLIC | STATIC, type, "fromResultSet" + type.className, p, body). - exception(g.add(SQLException.class)); - } - @Override public boolean equals(Object o) { if (this == o) return true; @@ -363,16 +68,4 @@ public class EntityMirror implements Comparable<EntityMirror> { public int compareTo(@SuppressWarnings("NullableProblems") EntityMirror o) { return type.compareTo(o.type); } - - public ClassG utils(SqlUnitModel unit) { - ClassG g = new ClassG(PUBLIC | STATIC, utilsType); - g.add(insertInto(unit, g.imports)); - g.add(selectById(g.imports)); - g.add(update(g.imports)); - g.add(delete(g.imports)); - g.add(deleteById(g.imports)); - g.add(query(g.imports)); - g.add(fromResultSet(g.imports)); - return g; - } } |