From e1cf8889628d2d31cf7067b8c002f229fc22007d Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 3 Aug 2013 18:00:10 +0200 Subject: wip --- .../java/io/trygvis/persistence/EntityMirror.java | 49 ++++++++++++++++++---- .../java/io/trygvis/persistence/FieldMirror.java | 22 +++++----- .../io/trygvis/persistence/GeneratorSupport.java | 31 +++++++------- .../java/io/trygvis/persistence/TypeHandler.java | 22 ++++++++++ 4 files changed, 90 insertions(+), 34 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 41ae1d4..2a4952f 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 @@ -4,32 +4,56 @@ import io.trygvis.container.compiler.model.ClassG; import io.trygvis.container.compiler.model.ParameterRef; import io.trygvis.container.compiler.model.TypeRef; -import javax.lang.model.type.DeclaredType; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import static java.lang.String.format; import static org.apache.commons.lang.StringUtils.join; public class EntityMirror { public final GeneratorSupport generatorSupport; public final List fields = new ArrayList<>(); - public final DeclaredType javaName; + public final List idFields = new ArrayList<>(); + public final TypeRef type; public final String tableName; - public final String daoName; + public final TypeRef daoType; - public EntityMirror(GeneratorSupport generatorSupport, DeclaredType javaName, String tableName) { + public EntityMirror(GeneratorSupport generatorSupport, TypeRef type, String tableName) { this.generatorSupport = generatorSupport; - this.javaName = javaName; + this.type = type; this.tableName = tableName; - this.daoName = javaName.asElement().getSimpleName() + "Dao"; + this.daoType = new TypeRef(type.name + "Dao"); } public void add(FieldMirror field) { fields.add(field); + if(field.id) { + idFields.add(field); + } + } + + public String createTableSql() { + List columns = new ArrayList<>(); + for (FieldMirror field : fields) { + TypeHandler typeHandler = generatorSupport.typeHandler(field.type); + String s = " " + field.sqlName + " " + typeHandler.sqlType(field); + if(field.id) { + s += " PRIMARY KEY"; + } + columns.add(s); + } + + return format("CREATE TABLE " + tableName + "(%n" + + join(columns, ",%n") + + "%n);"); + } + + public String dropTableSql() { + return "DROP TABLE " + tableName + ";"; } public String insertIntoSql() { @@ -44,10 +68,19 @@ public class EntityMirror { "VALUES(" + join(placeholders, ", ") + ");"; } + public String deleteFromSql() { + List ss = new ArrayList<>(); + for (FieldMirror field : idFields) { + ss.add(field.sqlName + "=?"); + } + + return "DELETE FROM " + tableName + " WHERE " + join(ss, " AND ") + ";"; + } + public void insertInto(ClassG g) { TypeRef conType = g.addImport(Connection.class); TypeRef psType = g.addImport(PreparedStatement.class); - TypeRef objectType = g.addImport(javaName); + TypeRef objectType = g.addImport(type); ParameterRef con = new ParameterRef(conType, "con"); ParameterRef object = new ParameterRef(objectType, "o"); @@ -56,7 +89,7 @@ public class EntityMirror { body.add("try(" + psType.name + " stmt = " + con.name + ".prepareStatement(insertIntoSql)) {"); for (int i = 0; i < fields.size(); i++) { FieldMirror field = fields.get(i); - TypeHandler typeHandler = generatorSupport.typeHandler(field.element); + TypeHandler typeHandler = generatorSupport.typeHandler(field.type); body.add(" stmt." + typeHandler.resultSetSetter(i + 1, "o", field) + ";"); } body.add(" stmt.executeUpdate();"); diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/FieldMirror.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/FieldMirror.java index c2e5f35..bf0a0c3 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/FieldMirror.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/FieldMirror.java @@ -1,6 +1,6 @@ package io.trygvis.persistence; -import javax.lang.model.element.VariableElement; +import io.trygvis.container.compiler.model.TypeRef; import static io.trygvis.persistence.FieldMirror.FieldType.PRIMITIVE; import static io.trygvis.persistence.FieldMirror.FieldType.REFERENCE; @@ -10,7 +10,7 @@ import static io.trygvis.persistence.FieldMirror.FieldType.REFERENCE; */ public abstract class FieldMirror { public final FieldType fieldType; - public final VariableElement element; + public final TypeRef type; public final String javaName; public final String sqlName; public final boolean id; @@ -21,9 +21,9 @@ public abstract class FieldMirror { REFERENCE, } - protected FieldMirror(FieldType fieldType, VariableElement element, String javaName, String sqlName, boolean id, boolean notNull) { + protected FieldMirror(FieldType fieldType, TypeRef type, String javaName, String sqlName, boolean id, boolean notNull) { this.fieldType = fieldType; - this.element = element; + this.type = type; this.javaName = javaName; this.sqlName = sqlName; this.id = id; @@ -31,14 +31,15 @@ public abstract class FieldMirror { } public static class PrimitiveFieldMirror extends FieldMirror { - public PrimitiveFieldMirror(VariableElement element, String javaName, String sqlName, boolean id, boolean notNull) { - super(PRIMITIVE, element, javaName, sqlName, id, notNull); + public PrimitiveFieldMirror(TypeRef typeRef, String javaName, String sqlName, boolean id, boolean notNull) { + super(PRIMITIVE, typeRef, javaName, sqlName, id, notNull); } @Override public String toString() { return "PrimitiveFieldMirror{" + - "javaName='" + javaName + '\'' + + "type='" + type + '\'' + + ", javaName='" + javaName + '\'' + ", sqlName='" + sqlName + '\'' + ", notNull=" + notNull + '}'; @@ -46,14 +47,15 @@ public abstract class FieldMirror { } public static class ReferenceFieldMirror extends FieldMirror { - public ReferenceFieldMirror(VariableElement element, String javaName, String sqlName, boolean notNull) { - super(REFERENCE, element, javaName, sqlName, false, notNull); + public ReferenceFieldMirror(TypeRef typeRef, String javaName, String sqlName, boolean notNull) { + super(REFERENCE, typeRef, javaName, sqlName, false, notNull); } @Override public String toString() { return "ReferenceFieldMirror{" + - "javaName='" + javaName + '\'' + + "type='" + type + '\'' + + ", javaName='" + javaName + '\'' + ", sqlName='" + sqlName + '\'' + ", notNull=" + notNull + '}'; diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/GeneratorSupport.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/GeneratorSupport.java index 379f6f6..0563691 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/GeneratorSupport.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/GeneratorSupport.java @@ -1,42 +1,41 @@ package io.trygvis.persistence; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; +import io.trygvis.container.compiler.model.TypeRef; + import java.util.Date; -import java.util.HashMap; import java.util.Map; +import java.util.TreeMap; public class GeneratorSupport { - private final Map primitiveTypeHandlers = new HashMap<>(); - private final Map typeHandlers = new HashMap<>(); + private final Map primitiveTypeHandlers = new TreeMap<>(); + private final Map typeHandlers = new TreeMap<>(); { - typeHandlers.put(Integer.class.getName(), new TypeHandler.IntTypeHandler()); - typeHandlers.put(Long.class.getName(), new TypeHandler.LongTypeHandler()); - typeHandlers.put(String.class.getName(), new TypeHandler.StringTypeHandler()); - typeHandlers.put(Date.class.getName(), new TypeHandler.DateTypeHandler()); + typeHandlers.put(new TypeRef(Integer.class), new TypeHandler.IntTypeHandler()); + typeHandlers.put(new TypeRef(Long.class), new TypeHandler.LongTypeHandler()); + typeHandlers.put(new TypeRef(String.class), new TypeHandler.StringTypeHandler()); + typeHandlers.put(new TypeRef(Date.class), new TypeHandler.DateTypeHandler()); primitiveTypeHandlers.putAll(typeHandlers); } - public void addTypeHandler(String type, TypeHandler typeHandler) { + public void addTypeHandler(TypeRef type, TypeHandler typeHandler) { typeHandlers.put(type, typeHandler); } - public TypeHandler typeHandler(Element element) { - String type = element.asType().toString(); + public TypeHandler typeHandler(TypeRef type) { TypeHandler typeHandler = typeHandlers.get(type); if (typeHandler == null) throw new RuntimeException("Unsupported field type: " + type); return typeHandler; } - public boolean isPrimitive(TypeMirror type) { - return primitiveTypeHandlers.containsKey(type.toString()); + public boolean isPrimitive(TypeRef type) { + return primitiveTypeHandlers.containsKey(type); } - public boolean hasTypeHandler(TypeMirror type) { - return typeHandlers.containsKey(type.toString()); + public boolean hasTypeHandler(TypeRef type) { + return typeHandlers.containsKey(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 1d7d424..ff2ad0a 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 @@ -3,11 +3,18 @@ package io.trygvis.persistence; public interface TypeHandler { String resultSetSetter(int i, String o, FieldMirror field); + String sqlType(FieldMirror field); + public static class IntTypeHandler implements TypeHandler { @Override public String resultSetSetter(int i, String o, FieldMirror field) { return "setInt(" + i + ", " + o + "." + field.javaName + ")"; } + + @Override + public String sqlType(FieldMirror field) { + return "INTEGER"; + } } public static class LongTypeHandler implements TypeHandler { @@ -15,6 +22,11 @@ public interface TypeHandler { public String resultSetSetter(int i, String o, FieldMirror field) { return "setLong(" + i + ", " + o + "." + field.javaName + ")"; } + + @Override + public String sqlType(FieldMirror field) { + return "BIGINT"; + } } public static class StringTypeHandler implements TypeHandler { @@ -22,6 +34,11 @@ public interface TypeHandler { public String resultSetSetter(int i, String o, FieldMirror field) { return "setString(" + i + ", " + o + "." + field.javaName + ")"; } + + @Override + public String sqlType(FieldMirror field) { + return "VARCHAR(1000)"; + } } public static class DateTypeHandler implements TypeHandler { @@ -29,5 +46,10 @@ public interface TypeHandler { public String resultSetSetter(int i, String o, FieldMirror field) { return "setTimestamp(" + i + ", new java.sql.Timestamp(" + o + "." + field.javaName + ".getTime()))"; } + + @Override + public String sqlType(FieldMirror field) { + return "TIMESTAMP"; + } } } -- cgit v1.2.3