From 8cca2127e0e11486cc45ae1a8198bd778301f935 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Mon, 19 Aug 2013 19:45:28 +0200 Subject: o Dropping the Sequences class. Moving more stuff into SqlUnit to make it easier available in a generic form. o Fixing the complicated cases where the generation got confused with both setter and constructor injection. --- .../persistence/generators/DaoGenerator.java | 20 ++++++----- .../persistence/generators/DaoUtilsGenerator.java | 4 +-- .../persistence/generators/SequencesGenerator.java | 41 ---------------------- .../generators/SqlSessionFactoryGenerator.java | 38 ++++++++++++++++---- .../generators/SqlSessionGenerator.java | 25 +++++++++++-- 5 files changed, 68 insertions(+), 60 deletions(-) delete mode 100644 container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SequencesGenerator.java (limited to 'container-compiler-plugin/src/main/java/io/trygvis/persistence/generators') 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 7cd3f59..b9b65a5 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 @@ -26,9 +26,10 @@ 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 javax.persistence.AccessType.FIELD; +import static javax.persistence.AccessType.PROPERTY; import static org.apache.commons.lang.StringUtils.join; public class DaoGenerator { @@ -51,16 +52,17 @@ public class DaoGenerator { g.add(new Constructor(p, "super(" + session.name + ");")); TypeRef stringType = g.imports.add(String.class); + TypeRef stringArrayType = 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); FieldRef createTableSql = g.addPublicStaticFinalField(stringType, "createTableSql"). value(toJavaString(createTableSql())); - g.add(new MethodRef(PUBLIC, stringType, "createTableSql", "return createTableSql;")); + g.add(new MethodRef(PUBLIC, stringArrayType, "createTableSql", "return new String[]{createTableSql};")); FieldRef dropTableSql = g.addPublicStaticFinalField(stringType, "dropTableSql"). value(toJavaString(dropTableSql())); - g.add(new MethodRef(PUBLIC, stringType, "dropTableSql", "return dropTableSql;")); + g.add(new MethodRef(PUBLIC, stringArrayType, "dropTableSql", "return new String[]{dropTableSql};")); g.addPublicStaticFinalField(stringType, "insertIntoSql"). value(toJavaString(insertIntoSql())); g.addPublicStaticFinalField(stringType, "deleteFromSql"). @@ -277,7 +279,7 @@ public class DaoGenerator { Parameters.ParameterRef row = p.addParameter(this.entity.rowType, "row"); List body = new ArrayList<>(); - List cArgs = new ArrayList<>(); + String[] cArgs = new String[entity.getConstructorParameters().size()]; List method = new ArrayList<>(); for (int i = 0; i < entity.getFields().size(); i++) { FieldMirror field = this.entity.getFields().get(i); @@ -292,11 +294,13 @@ public class DaoGenerator { // body.add(x); } - if (field.setterType == SetterType.CONSTRUCTOR) { - cArgs.add(value); - } else if (field.setterType == SetterType.METHOD) { + if (field.constructorParam) { + System.out.println("entity.getConstructorParameters() = " + entity.getConstructorParameters()); + System.out.println("field.javaName = " + field.javaName); + cArgs[entity.getConstructorParameters().indexOf(field.javaName)] = value; + } else if (field.setterType == PROPERTY) { method.add("_entity." + toSetterName(field.javaName) + "(" + value + ");"); - } else if (field.setterType == SetterType.FIELD) { + } else if (field.setterType == FIELD) { method.add("_entity." + field.javaName + " = " + value + ";"); } } diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoUtilsGenerator.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoUtilsGenerator.java index 08a7f45..3ca191f 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoUtilsGenerator.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/DaoUtilsGenerator.java @@ -22,10 +22,10 @@ import java.util.List; import static io.trygvis.container.compiler.Utils.toGetterName; import static io.trygvis.persistence.FieldMirror.FieldType.PRIMITIVE; -import static io.trygvis.persistence.FieldMirror.GetterType; import static java.lang.reflect.Modifier.PUBLIC; import static java.lang.reflect.Modifier.STATIC; import static java.util.Collections.singletonList; +import static javax.persistence.AccessType.FIELD; import static org.apache.commons.lang.StringUtils.join; public class DaoUtilsGenerator { @@ -134,7 +134,7 @@ public class DaoUtilsGenerator { List arguments = new ArrayList<>(); arguments.add(con.name); FieldMirror field = entity.getIdField(); - if (field.getterType == GetterType.FIELD) { + if (field.getterType == FIELD) { arguments.add(o.name + "." + field.javaName); } else { arguments.add(o.name + "." + toGetterName(field.javaName) + "()"); diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SequencesGenerator.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SequencesGenerator.java deleted file mode 100644 index 07823af..0000000 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SequencesGenerator.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.trygvis.persistence.generators; - -import io.trygvis.container.compiler.SqlUnitModel; -import io.trygvis.container.compiler.model.ClassG; -import io.trygvis.container.compiler.model.FieldRef; -import io.trygvis.container.compiler.model.TypeRef; -import io.trygvis.persistence.SequenceMirror; - -import java.util.ArrayList; -import java.util.List; - -import static io.trygvis.container.compiler.Utils.toJavaString; -import static java.lang.reflect.Modifier.PUBLIC; -import static org.apache.commons.lang.StringUtils.capitalize; -import static org.apache.commons.lang.StringUtils.join; - -public class SequencesGenerator { - public static 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; - } -} diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java index 7b6f667..697b262 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionFactoryGenerator.java @@ -9,7 +9,9 @@ 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.SequenceMirror; import io.trygvis.persistence.sql.SqlEntityMeta; +import io.trygvis.persistence.sql.SqlSequenceMeta; import io.trygvis.persistence.sql.SqlSessionFactory; import io.trygvis.persistence.sql.SqlUnit; @@ -20,6 +22,8 @@ import java.util.ArrayList; import java.util.List; import static io.trygvis.container.compiler.Utils.toClassName; +import static io.trygvis.container.compiler.Utils.toJavaString; +import static java.lang.String.format; import static java.lang.reflect.Modifier.*; import static org.apache.commons.lang.StringUtils.join; @@ -32,30 +36,50 @@ public class SqlSessionFactoryGenerator { ClassG g = new ClassG(PUBLIC, ssfType). extendsType(new TypeRef(SqlSessionFactory.class).args(ssType)); - List s = new ArrayList<>(); + List es = new ArrayList<>(); for (EntityMirror entity : unit.getEntities().values()) { if (!entity.concrete) { continue; } - s.add(entity.daoType.plainName + ".desc"); + es.add(entity.daoType.plainName + ".desc"); } TypeRef sqlEntityMetaArrayType = new TypeRef(SqlEntityMeta[].class); - FieldRef entities = g.addField(PUBLIC | STATIC, sqlEntityMetaArrayType, "entities"). - value("new " + sqlEntityMetaArrayType + "{" + join(s, ", ") + "}"); + FieldRef entities = g.addField(PRIVATE | STATIC, sqlEntityMetaArrayType, "entities"). + value(format("new " + sqlEntityMetaArrayType + "{%n" + join(es, ", %n") + "%n}")); - g.add(constructor(entities, g.imports)); + TypeRef sqlSequenceMetaArrayType = new TypeRef(SqlSequenceMeta[].class); + List ss = generateSequences(unit, g.imports); + FieldRef sequences = g.addField(PRIVATE | STATIC, sqlSequenceMetaArrayType, "sequences"). + value(format("new " + sqlSequenceMetaArrayType + "{%n" + join(ss, ", %n") + "%n}")); + + g.add(constructor(entities, sequences, g.imports)); g.add(newSession(unit, ssType, g.imports)); return g; } - private static Constructor constructor(FieldRef entities, Imports imports) { + public static List generateSequences(SqlUnitModel unit, Imports imports) { + TypeRef sqlSequenceMetaType = imports.add(SqlSequenceMeta.class); + List fields = new ArrayList<>(); + for (SequenceMirror sequence : unit.getSequences().values()) { + String create = "CREATE SEQUENCE " + sequence.sequenceName; + String drop = "DROP SEQUENCE " + sequence.sequenceName; + + fields.add(format("new " + sqlSequenceMetaType.plainName + "(" + toJavaString(sequence.sequenceName) + ",%n" + + toJavaString(create) + ",%n" + + toJavaString(drop) + ")")); + } + + return fields; + } + + private static Constructor constructor(FieldRef entities, FieldRef sequences, Imports imports) { TypeRef dataSourceType = imports.add(DataSource.class); TypeRef sqlUnitType = imports.add(SqlUnit.class); Parameters p = new Parameters(); Parameters.ParameterRef ds = p.addParameter(dataSourceType, "ds"); ArrayList body = new ArrayList<>(); - body.add("super(new " + sqlUnitType.plainName + "(" + entities.name + "), " + ds.name + ");"); + body.add("super(new " + sqlUnitType.plainName + "(" + entities.name + "," + sequences.name + "), " + ds.name + ");"); return new Constructor(p, body); } diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionGenerator.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionGenerator.java index 8e32cfe..90309e4 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionGenerator.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/generators/SqlSessionGenerator.java @@ -16,13 +16,17 @@ import io.trygvis.persistence.sql.SqlSession; import java.io.IOException; import java.sql.Connection; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import static io.trygvis.container.compiler.Utils.toFieldName; import static io.trygvis.container.compiler.model.Parameters.ParameterRef; +import static java.lang.String.format; +import static java.lang.reflect.Modifier.FINAL; import static java.lang.reflect.Modifier.PUBLIC; +import static org.apache.commons.lang.StringUtils.join; public class SqlSessionGenerator { public static ClassG generateSqlSession(SqlUnitModel unit) throws IOException { @@ -41,18 +45,33 @@ public class SqlSessionGenerator { daoFields.put(entity, f); } - g.add(constructor(unit, g.imports, daoFields)); + TypeRef sqlDaoType = new TypeRef(SqlDao.class); + TypeRef listOfDaos = g.imports.add(new TypeRef(List.class).args(sqlDaoType)); + FieldRef daos = new FieldRef(PUBLIC | FINAL, listOfDaos, "daos"); + + g.add(daos); + g.add(constructor(unit, g.imports, daoFields, daos)); g.add(getSqlDao(unit, g.imports, daoFields)); + g.add(getDaos(g.imports, daos)); return g; } - private static Constructor constructor(SqlUnitModel unit, Imports imports, Map daoFields) { + private static MethodRef getDaos(Imports imports, FieldRef daos) { + TypeRef sqlDaoType = new TypeRef(SqlDao.class); + TypeRef listOfDaos = imports.add(new TypeRef(List.class).args(sqlDaoType)); + return new MethodRef(PUBLIC, listOfDaos, "getDaos", "return " + daos.name + ";"); + } + + private static Constructor constructor(SqlUnitModel unit, Imports imports, Map daoFields, FieldRef daos) { + TypeRef arraysType = imports.add(Arrays.class); + Parameters p = new Parameters(); ParameterRef c = p.addParameter(imports.add(Connection.class), "c"); List body = new ArrayList<>(); body.add("super(" + c.name + ");"); + List daoNames = new ArrayList<>(); for (EntityMirror entity : unit.getEntities().values()) { if (!entity.concrete) { continue; @@ -60,7 +79,9 @@ public class SqlSessionGenerator { FieldRef f = daoFields.get(entity); body.add("this." + f.name + " = new " + entity.daoType.plainName + "(this);"); + daoNames.add(f.name); } + body.add(format("this." + daos.name + " = " + arraysType.plainName + ".asList(new SqlDao[]{%n" + join(daoNames, ", %n") + "%n});")); return new Constructor(p, body); } -- cgit v1.2.3