diff options
Diffstat (limited to 'container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoGenerator.java')
-rw-r--r-- | container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoGenerator.java | 156 |
1 files changed, 130 insertions, 26 deletions
diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoGenerator.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoGenerator.java index d9ac482..c4367fd 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoGenerator.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoGenerator.java @@ -5,6 +5,7 @@ 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.FieldRef; +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; @@ -16,16 +17,16 @@ import io.trygvis.persistence.sql.SqlDao; import io.trygvis.persistence.sql.SqlEntityMeta; import java.io.IOException; -import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import static io.trygvis.container.compiler.Utils.toJavaString; +import static io.trygvis.container.compiler.Utils.*; import static io.trygvis.container.compiler.model.TypeRef.VOID; import static io.trygvis.persistence.FieldMirror.FieldType.PRIMITIVE; import static io.trygvis.persistence.FieldMirror.FieldType.REFERENCE; +import static io.trygvis.persistence.FieldMirror.SetterType; import static java.lang.String.format; import static java.lang.reflect.Modifier.PUBLIC; import static org.apache.commons.lang.StringUtils.join; @@ -44,15 +45,15 @@ public class DaoGenerator { public ClassG generate() throws IOException { ClassG g = new ClassG(PUBLIC, entity.daoType). - extendsType(new TypeRef(SqlDao.class).args(entity.idType, entity.type)); + extendsType(new TypeRef(SqlDao.class).args(entity.idType, entity.type, unit.sessionType, entity.rowType)); Parameters p = new Parameters(); - Parameters.ParameterRef c = p.addParameter(new TypeRef(Connection.class), "c"); - g.add(new Constructor(p, "super(" + c.name + ");")); + Parameters.ParameterRef session = p.addParameter(unit.sessionType, "session"); + g.add(new Constructor(p, "super(" + session.name + ");")); TypeRef stringType = g.imports.add(String.class); TypeRef sqlEntityDescType = g.imports.add(SqlEntityMeta.class); TypeRef sqlException = g.imports.add(SQLException.class); - TypeRef listOfEntityType = new TypeRef(List.class).args(entity.type); +// TypeRef listOfEntityType = new TypeRef(List.class).args(entity.type); FieldRef createTableSql = g.addPublicStaticFinalField(stringType, "createTableSql"). value(toJavaString(createTableSql())); @@ -72,22 +73,17 @@ public class DaoGenerator { ")"; g.addPublicStaticFinalField(sqlEntityDescType, "desc").value(desc); DaoUtilsGenerator daoUtil = new DaoUtilsGenerator(unit, generatorConfiguration, entity); - g.addInnerClass(daoUtil.queryType(g.imports)); +// g.addInnerClass(daoUtil.queryType(g.imports)); g.addInnerClass(daoUtil.utils()); - { - p = new Parameters(); - Parameters.ParameterRef rs = p.addParameter(new TypeRef(ResultSet.class), "rs"); - g.add(new MethodRef(PUBLIC, entity.type, "fromResultSet", p, - "return Utils.fromResultSet" + entity.type.className + "(" + rs.name + ");"). - exception(sqlException)); - } + g.add(newRow(g.imports)); + g.add(newEntity(g.imports)); { p = new Parameters(); Parameters.ParameterRef entity = p.addParameter(this.entity.type, "entity"); g.add(new MethodRef(PUBLIC, VOID, "insert", p, - "Utils.insert" + this.entity.type.className + "(super.c, " + entity.name + ");"). + "Utils.insert" + this.entity.type.className + "(super.session.c, " + entity.name + ");"). exception(sqlException)); } @@ -95,23 +91,17 @@ public class DaoGenerator { p = new Parameters(); Parameters.ParameterRef id = p.addParameter(entity.idType, "id"); g.add(new MethodRef(PUBLIC, entity.type, "selectById", p, - "return Utils.select" + entity.type.className + "ById(super.c, " + id.name + ");"). + "return Utils.select" + entity.type.className + "ById(super.session.c, " + id.name + ");"). exception(sqlException)); } - { - p = new Parameters(); - Parameters.ParameterRef where = p.addParameter(stringType, "where"); - g.add(new MethodRef(PUBLIC, listOfEntityType, "selectWhere", p, - "return Utils.select" + entity.type.className + "Where(super.c, " + where.name + ");"). - exception(sqlException)); - } + g.add(selectWhere(g.imports)); { p = new Parameters(); Parameters.ParameterRef entity = p.addParameter(this.entity.type, "entity"); g.add(new MethodRef(PUBLIC, VOID, "delete", p, - "Utils.delete" + this.entity.type.className + "(super.c, " + entity.name + ");"). + "Utils.delete" + this.entity.type.className + "(super.session.c, " + entity.name + ");"). exception(sqlException)); } @@ -119,7 +109,7 @@ public class DaoGenerator { p = new Parameters(); Parameters.ParameterRef id = p.addParameter(entity.idType, "id"); g.add(new MethodRef(PUBLIC, VOID, "deleteById", p, - "Utils.delete" + entity.type.className + "ById(super.c, " + id.name + ");"). + "Utils.delete" + entity.type.className + "ById(super.session.c, " + id.name + ");"). exception(sqlException)); } @@ -127,13 +117,35 @@ public class DaoGenerator { p = new Parameters(); Parameters.ParameterRef entity = p.addParameter(this.entity.type, "entity"); g.add(new MethodRef(PUBLIC, VOID, "update", p, - "Utils.update" + this.entity.type.className + "(super.c, " + entity.name + ");"). + "Utils.update" + this.entity.type.className + "(super.session.c, " + entity.name + ");"). exception(sqlException)); } return g; } + public ClassG generateRow() { + ClassG g = new ClassG(PUBLIC, entity.rowType); + + Parameters parameters = new Parameters(); + List<String> body = new ArrayList<>(); + for (FieldMirror field : entity.fields) { + TypeRef type; + if (field.fieldType == PRIMITIVE) { + type = field.type; + } else { + EntityMirror entity = unit.getEntities().get(field.type); + type = entity.getIdField().type; + } + + FieldRef f = g.addPublicFinalField(type, field.javaName); + Parameters.ParameterRef p = parameters.addParameter(type, field.javaName); + body.add("this." + f.name + " = " + p.name + ";"); + } + g.add(new Constructor(parameters, body)); + return g; + } + public String createTableSql() { List<String> columns = new ArrayList<>(); for (FieldMirror field : entity.fields) { @@ -203,6 +215,98 @@ public class DaoGenerator { return "DELETE FROM " + entity.tableName + " WHERE " + join(ss, " AND ") + ";"; } + public MethodRef selectWhere(Imports imports) { + TypeRef sqlExceptionType = imports.add(SQLException.class); + Parameters p = new Parameters(); + Parameters.ParameterRef where = p.addParameter(imports.add(String.class), "where"); + List<String> body = new ArrayList<>(); + body.add("String sql = \"SELECT \" + desc.defaultFields + \" FROM " + entity.tableName + " WHERE \" + " + where.name + " + \";\";"); + body.add("return runQuery(sql);"); + + TypeRef listOfEntityType = new TypeRef(List.class).args(entity.type); + return new MethodRef(PUBLIC, listOfEntityType, "selectWhere", p, body). + exception(sqlExceptionType); + } + + public MethodRef newRow(Imports g) { + TypeRef rsType = g.add(ResultSet.class); + Parameters p = new Parameters(); + Parameters.ParameterRef rs = p.addParameter(rsType, "rs"); + + List<String> body = new ArrayList<>(); + List<String> fields = new ArrayList<>(); + for (int i = 0; i < entity.fields.size(); i++) { + FieldMirror field = entity.fields.get(i); + + String getter; + TypeRef type; + if (field.fieldType == PRIMITIVE) { + TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type); + type = field.type; + getter = typeHandler.getter(rs.name, i + 1); + } else { + EntityMirror referencedEntity = unit.getEntities().get(field.type); + type = referencedEntity.getIdField().type; + TypeHandler typeHandler = generatorConfiguration.typeHandler(type); + getter = typeHandler.getter(rs.name, i + 1); + } + String x = type.plainName + " " + field.javaName; + body.add(x + " = " + getter + ";"); + fields.add(field.javaName); + } + + body.add("return new " + entity.rowType.plainName + "(" + join(fields, ", ") + ");"); + + return new MethodRef(PUBLIC, entity.rowType, "newRow", p, body). + exception(g.add(SQLException.class)); + } + + public MethodRef newEntity(Imports g) { + Parameters p = new Parameters(); + Parameters.ParameterRef row = p.addParameter(this.entity.rowType, "row"); + + List<String> body = new ArrayList<>(); + List<String> cArgs = new ArrayList<>(); + List<String> method = new ArrayList<>(); + for (int i = 0; i < this.entity.fields.size(); i++) { + FieldMirror field = this.entity.fields.get(i); + + String value; + if(field.fieldType == PRIMITIVE) { + value = row.name + "." + field.javaName; + } + else { + EntityMirror referencedEntity = unit.getEntities().get(field.type); +// String x = field.type.plainName + " " + field.javaName + " = " + + value = "session." + toFieldName(referencedEntity.type) + ".selectById(" + row.name + "." + field.javaName + ")"; +// body.add(x); + } + + if (field.setterType == SetterType.CONSTRUCTOR) { + cArgs.add(value); + } else if (field.setterType == SetterType.METHOD) { + method.add("_entity." + toSetterName(field.javaName) + "(" + value + ");"); + } else if (field.setterType == SetterType.FIELD) { + method.add("_entity." + field.javaName + " = " + value + ";"); + } + } + + body.add(entity.type.plainName + " _entity = new " + entity.type.plainName + "(" + join(cArgs, ", ") + ");"); + + /* + Contact contact = new Contact(row.name, row.gender); + contact.company = session.company.selectById(row.company); + return contact; + */ + + body.addAll(method); + + body.add("return _entity;"); + + return new MethodRef(PUBLIC, this.entity.type, "newEntity", p, body). + exception(g.add(SQLException.class)); + } + public String defaultFields() { List<String> names = new ArrayList<>(); for (FieldMirror field : entity.fields) { |