summaryrefslogtreecommitdiff
path: root/container-compiler-plugin/src/main/java/io/trygvis/persistence
diff options
context:
space:
mode:
Diffstat (limited to 'container-compiler-plugin/src/main/java/io/trygvis/persistence')
-rw-r--r--container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java49
-rw-r--r--container-compiler-plugin/src/main/java/io/trygvis/persistence/FieldMirror.java22
-rw-r--r--container-compiler-plugin/src/main/java/io/trygvis/persistence/GeneratorSupport.java31
-rw-r--r--container-compiler-plugin/src/main/java/io/trygvis/persistence/TypeHandler.java22
4 files changed, 90 insertions, 34 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 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<FieldMirror> fields = new ArrayList<>();
- public final DeclaredType javaName;
+ public final List<FieldMirror> 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<String> 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<String> 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<String, TypeHandler> primitiveTypeHandlers = new HashMap<>();
- private final Map<String, TypeHandler> typeHandlers = new HashMap<>();
+ private final Map<TypeRef, TypeHandler> primitiveTypeHandlers = new TreeMap<>();
+ private final Map<TypeRef, TypeHandler> 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";
+ }
}
}