summaryrefslogtreecommitdiff
path: root/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java')
-rw-r--r--container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java183
1 files changed, 99 insertions, 84 deletions
diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java
index 74f303f..9bce51e 100644
--- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java
+++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java
@@ -1,15 +1,20 @@
package io.trygvis.container.compiler;
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.MethodRef;
+import io.trygvis.container.compiler.model.Parameters;
import io.trygvis.container.compiler.model.TypeRef;
import io.trygvis.persistence.EntityMirror;
import io.trygvis.persistence.FieldMirror;
import io.trygvis.persistence.GeneratorConfiguration;
import io.trygvis.persistence.SequenceMirror;
import io.trygvis.persistence.SqlEntity;
+import io.trygvis.persistence.SqlEntitySet;
import io.trygvis.persistence.TypeHandler;
-import io.trygvis.persistence.sql.SqlEntityDesc;
+import io.trygvis.persistence.sql.SqlDao;
+import io.trygvis.persistence.sql.SqlEntityMeta;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.AnnotationMirror;
@@ -25,9 +30,10 @@ import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
-import javax.tools.JavaFileObject;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -35,8 +41,9 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
-import static io.trygvis.container.compiler.Utils.toFieldName;
-import static io.trygvis.container.compiler.Utils.toJavaString;
+import static io.trygvis.container.compiler.Utils.*;
+import static io.trygvis.container.compiler.model.Parameters.ParameterRef;
+import static io.trygvis.container.compiler.model.TypeRef.VOID;
import static io.trygvis.persistence.FieldMirror.AccessorType.FIELD;
import static io.trygvis.persistence.FieldMirror.AccessorType.METHOD;
import static io.trygvis.persistence.FieldMirror.FieldType.PRIMITIVE;
@@ -47,15 +54,15 @@ import static java.lang.String.format;
import static java.lang.reflect.Modifier.PUBLIC;
import static javax.lang.model.util.ElementFilter.fieldsIn;
import static javax.lang.model.util.ElementFilter.methodsIn;
-import static org.apache.commons.lang.StringUtils.*;
+import static org.apache.commons.lang.StringUtils.join;
public class EntityHandler extends AbstractHandler {
private GeneratorConfiguration generatorConfiguration = new GeneratorConfiguration();
- private SqlUnitModel sqlUnit = new SqlUnitModel();
- private PackageElement packageElement;
+ private SqlUnitModel sqlUnit;
- public EntityHandler(ProcessingEnvironment processingEnv) {
+ public EntityHandler(ProcessingEnvironment processingEnv, SqlUnitModel sqlUnit) {
super(processingEnv);
+ this.sqlUnit = sqlUnit;
}
public void phase1(Set<TypeElement> sqlEntities, Set<PackageElement> packages) throws Exception {
@@ -81,11 +88,22 @@ public class EntityHandler extends AbstractHandler {
if (packages.size() == 0) {
throw new CompilerException("There has to be exactly one @SqlEntitySet annotated package.");
}
- packageElement = packages.iterator().next();
+ PackageElement packageElement = packages.iterator().next();
if (packages.size() != 1) {
throw new CompilerException(packageElement, "There can only be one @SqlEntitySet annotated package.");
}
+ AnnotationMirror sqlEntitySet = getAnnotation(SqlEntitySet.class, packageElement);
+ String name = null;
+ for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> v : sqlEntitySet.getElementValues().entrySet()) {
+ String field = v.getKey().getSimpleName().toString();
+ String value = v.getValue().getValue().toString();
+ switch (field) {
+ case "name":
+ name = value;
+ }
+ }
+ sqlUnit.setName(name);
sqlUnit.setPackageName(packageElement.getQualifiedName().toString());
}
@@ -178,6 +196,7 @@ public class EntityHandler extends AbstractHandler {
if (idFields.size() != 1) {
throw new CompilerException(element, "This implementation only support a single @Id annotated field.");
}
+ entity.setIdType(idFields.get(0).type);
sqlUnit.add(entity, element);
}
@@ -193,18 +212,19 @@ public class EntityHandler extends AbstractHandler {
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> v : sequenceGenerator.getElementValues().entrySet()) {
String field = v.getKey().getSimpleName().toString();
+ String value = v.getValue().getValue().toString();
switch (field) {
case "name":
- name = v.getValue().getValue().toString();
+ name = value;
break;
case "sequenceName":
- sequenceName = v.getValue().getValue().toString();
+ sequenceName = value;
break;
case "initialValue":
- initialValue = Integer.valueOf(v.getValue().getValue().toString());
+ initialValue = Integer.valueOf(value);
break;
case "allocationSize":
- allocationSize = Integer.valueOf(v.getValue().getValue().toString());
+ allocationSize = Integer.valueOf(value);
break;
default:
throw new InternalErrorException("Unsupported field on @SequenceGenerator: " + field);
@@ -218,30 +238,83 @@ public class EntityHandler extends AbstractHandler {
}
public ClassG phase3(EntityMirror entityMirror) throws IOException {
- ClassG g = new ClassG(PUBLIC, entityMirror.daoType);
+ ClassG g = new ClassG(PUBLIC, entityMirror.daoType).
+ extendsType(new TypeRef(SqlDao.class).args(entityMirror.idType, entityMirror.type));
+ Parameters p = new Parameters();
+ ParameterRef c = p.addParameter(new TypeRef(Connection.class), "c");
+ g.add(new Constructor(p, "super(" + c.name + ");"));
TypeRef stringType = g.imports.add(String.class);
- TypeRef sqlEntityDescType = g.imports.add(SqlEntityDesc.class);
+ TypeRef sqlEntityDescType = g.imports.add(SqlEntityMeta.class);
+ TypeRef sqlException = g.imports.add(SQLException.class);
- g.addPublicStaticFinalField(stringType, "createTableSql").
+ FieldRef createTableSql = g.addPublicStaticFinalField(stringType, "createTableSql").
value(toJavaString(entityMirror.createTableSql(sqlUnit)));
- g.addPublicStaticFinalField(stringType, "dropTableSql").
+ g.add(new MethodRef(PUBLIC, stringType, "createTableSql", "return createTableSql;"));
+ FieldRef dropTableSql = g.addPublicStaticFinalField(stringType, "dropTableSql").
value(toJavaString(entityMirror.dropTableSql()));
+ g.add(new MethodRef(PUBLIC, stringType, "dropTableSql", "return dropTableSql;"));
g.addPublicStaticFinalField(stringType, "insertIntoSql").
value(toJavaString(entityMirror.insertIntoSql(sqlUnit)));
g.addPublicStaticFinalField(stringType, "deleteFromSql").
value(toJavaString(entityMirror.deleteFromSql()));
String desc = "new " + sqlEntityDescType + "(" +
toJavaString(entityMirror.tableName) + ", " +
- toJavaString(entityMirror.defaultFields()) +
+ toJavaString(entityMirror.defaultFields()) + ", " +
+ toJavaString(createTableSql.name) + ", " +
+ toJavaString(dropTableSql.name) +
")";
g.addPublicStaticFinalField(sqlEntityDescType, "desc").value(desc);
ClassG.InnerClassG typedQuery = g.addInnerClass(entityMirror.queryType(g.imports));
- typedQuery.inner.addMethod(entityMirror.fromResultSet(g.imports));
- g.addMethod(entityMirror.insertInto(sqlUnit, g.imports));
- g.addMethod(entityMirror.delete(g.imports));
- g.addMethod(entityMirror.deleteById(g.imports));
- g.addMethod(entityMirror.query(g.imports));
+ g.addInnerClass(entityMirror.utils(sqlUnit));
+
+ {
+ p = new Parameters();
+ ParameterRef rs = p.addParameter(new TypeRef(ResultSet.class), "rs");
+ g.add(new MethodRef(PUBLIC, entityMirror.type, "fromResultSet", p,
+ "return Utils.fromResultSet" + entityMirror.type.className + "(" + rs.name + ");").
+ exception(sqlException));
+ }
+
+ {
+ p = new Parameters();
+ ParameterRef entity = p.addParameter(entityMirror.type, "entity");
+ g.add(new MethodRef(PUBLIC, VOID, "insert", p,
+ "Utils.insert" + entityMirror.type.className + "(super.c, " + entity.name + ");").
+ exception(sqlException));
+ }
+
+ {
+ p = new Parameters();
+ ParameterRef id = p.addParameter(entityMirror.idType, "id");
+ g.add(new MethodRef(PUBLIC, entityMirror.type, "selectById", p,
+ "return Utils.select" + entityMirror.type.className + "ById(super.c, " + id.name + ");").
+ exception(sqlException));
+ }
+
+ {
+ p = new Parameters();
+ ParameterRef entity = p.addParameter(entityMirror.type, "entity");
+ g.add(new MethodRef(PUBLIC, VOID, "delete", p,
+ "Utils.delete" + entityMirror.type.className + "(super.c, " + entity.name + ");").
+ exception(sqlException));
+ }
+
+ {
+ p = new Parameters();
+ ParameterRef id = p.addParameter(entityMirror.idType, "id");
+ g.add(new MethodRef(PUBLIC, VOID, "deleteById", p,
+ "Utils.delete" + entityMirror.type.className + "ById(super.c, " + id.name + ");").
+ exception(sqlException));
+ }
+
+ {
+ p = new Parameters();
+ ParameterRef entity = p.addParameter(entityMirror.type, "entity");
+ g.add(new MethodRef(PUBLIC, VOID, "update", p,
+ "Utils.update" + entityMirror.type.className + "(super.c, " + entity.name + ");").
+ exception(sqlException));
+ }
return g;
}
@@ -328,10 +401,8 @@ public class EntityHandler extends AbstractHandler {
public void phase3(boolean errorRaised) throws Exception {
try {
for (EntityMirror entity : sqlUnit.getEntities().values()) {
- writeFile(phase3(entity), sqlUnit.element(entity));
+ writeFile(processingEnv, phase3(entity), sqlUnit.element(entity));
}
- writeFile(generateSequences(sqlUnit), null);
- writeFile(generateSession(), null);
} catch (CompilerException | InternalErrorException e) {
// Ignore any exceptions if we had an error from before
if (errorRaised) {
@@ -341,62 +412,6 @@ public class EntityHandler extends AbstractHandler {
}
}
- private ClassG generateSequences(SqlUnitModel unit) {
- TypeRef sequences = new TypeRef(unit.getPackageName() + ".Sequences");
- ClassG g = new ClassG(PUBLIC, sequences);
- List<String> creates = new ArrayList<>();
- List<String> 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;
- }
-
- private void writeFile(ClassG g, Element element) throws IOException {
- JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(g.type.fqName, element);
- try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) {
- for (String s : g.generate()) {
- w.println(stripEnd(s, " "));
- }
- }
- }
-
- private ClassG generateSession() throws IOException {
- String p = packageElement.getQualifiedName().toString();
-
- // TODO: Support a name prefix from @SqlEntitySet
- TypeRef type = new TypeRef(p + ".Session");
-
-/*
- TypeRef conType = g.add(Connection.class);
- Parameters parameters = new Parameters();
- ParameterRef c = parameters.addParameter(conType, "c");
-
- List<String> body = new ArrayList<>();
- for (EntityMirror entity : entities) {
- FieldRef fieldRef = g.addField(entity.javaName.asElement().asType(), toFieldName(entity.daoName));
- body.add("this." + fieldRef.name + " = new " + entity.daoName + "(" + c.name + ");");
- }
-
- g.addConstructor(parameters, body);
-*/
-
- return new ClassG(PUBLIC, type);
- }
-
public static String sqlName(String javaName) {
StringBuilder builder = new StringBuilder();
for (char c : javaName.toCharArray()) {
@@ -420,7 +435,7 @@ public class EntityHandler extends AbstractHandler {
return null;
}
- public AnnotationMirror getAnnotation(Class<?> c, TypeElement type) {
+ public AnnotationMirror getAnnotation(Class<?> c, Element type) {
AnnotationMirror annotation = findAnnotation(c, type);
if (annotation != null) {