summaryrefslogtreecommitdiff
path: root/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoGenerator.java
diff options
context:
space:
mode:
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.java156
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) {