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.java111
1 files changed, 90 insertions, 21 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 f9247e0..fc7ca4f 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,7 +1,10 @@
package io.trygvis.container.compiler;
import io.trygvis.container.compiler.model.ClassG;
+import io.trygvis.container.compiler.model.FieldRef;
+import io.trygvis.container.compiler.model.ParameterRef;
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.GeneratorSupport;
@@ -11,35 +14,37 @@ import io.trygvis.persistence.TypeHandler;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
+import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeMirror;
+import javax.persistence.Id;
import javax.tools.JavaFileObject;
import java.io.PrintWriter;
+import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import static io.trygvis.container.compiler.Utils.toFieldName;
import static io.trygvis.persistence.FieldMirror.PrimitiveFieldMirror;
import static java.lang.Character.isUpperCase;
import static javax.lang.model.util.ElementFilter.fieldsIn;
public class EntityHandler extends AbstractHandler {
- GeneratorSupport generatorSupport = new GeneratorSupport();
+ private GeneratorSupport generatorSupport = new GeneratorSupport();
+ private List<EntityMirror> entities = new ArrayList<>();
+ private PackageElement packageElement;
public EntityHandler(ProcessingEnvironment processingEnv) {
super(processingEnv);
}
- public void phase1(Set<? extends Element> sqlEntities) throws Exception {
- System.out.println("io.trygvis.container.compiler.EntityHandler.phase1");
- for (Element entity : sqlEntities) {
-// SqlEntity sqlEntity = entity.getAnnotation(SqlEntity.class);
-// Class<? extends TypeHandler> typeHandlerClass = sqlEntity.value();
-
+ public void phase1(Set<TypeElement> sqlEntities, Set<PackageElement> packages) throws Exception {
+ for (TypeElement entity : sqlEntities) {
AnnotationMirror sqlEntity = findAnnotation(SqlEntity.class, entity.getAnnotationMirrors());
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> v : sqlEntity.getElementValues().entrySet()) {
switch (v.getKey().getSimpleName().toString()) {
@@ -53,8 +58,18 @@ public class EntityHandler extends AbstractHandler {
break;
}
}
- System.out.println("sqlEntity.getElementValues() = " + sqlEntity.getElementValues());
+// System.out.println("sqlEntity.getElementValues() = " + sqlEntity.getElementValues());
+ }
+
+ System.out.println("packages = " + packages);
+ if (packages.size() == 0) {
+ throw new RuntimeException("There has to be exactly one @SqlEntitySet annotated package.");
+ }
+ if (packages.size() != 1) {
+ throw new RuntimeException("There can only be one @SqlEntitySet annotated package.");
}
+
+ packageElement = packages.iterator().next();
}
private AnnotationMirror findAnnotation(Class<?> c, List<? extends AnnotationMirror> annotations) {
@@ -69,49 +84,103 @@ public class EntityHandler extends AbstractHandler {
}
public void processEntity(TypeElement element) throws Exception {
- EntityMirror entityMirror = new EntityMirror(generatorSupport, element.asType(), sqlName(element.getSimpleName().toString()));
+ DeclaredType declaredType = types.getDeclaredType(element);
+ EntityMirror entityMirror = new EntityMirror(generatorSupport, declaredType, sqlName(element.getSimpleName().toString()));
for (VariableElement f : fieldsIn(elements.getAllMembers(element))) {
entityMirror.add(fromElement(generatorSupport, f));
}
+ List<FieldMirror> idFields = new ArrayList<>();
+ for (FieldMirror field : entityMirror.fields) {
+ if (field.id) {
+ idFields.add(field);
+ }
+ }
+
+ if (idFields.size() == 0) {
+ throw new RuntimeException("An @Entity is required to have at least one @Id field.");
+ }
+ if (idFields.size() != 1) {
+ throw new RuntimeException("This implementation only support a single @Id annotated field.");
+ }
+
String p = elements.getPackageOf(element).getQualifiedName().toString();
- String className = element.getSimpleName() + "_Sql";
- ClassG g = new ClassG(p, className, null);
- g.addPublicFinalField(String.class, "insertIntoSql");
+ ClassG g = new ClassG(p, entityMirror.daoName);
String insertInto = entityMirror.insertIntoSql();
- List<String> body = new ArrayList<>();
- body.add("this.insertIntoSql = \"" + insertInto + "\";");
- g.addConstructor(new Parameters(), body);
+ g.addPublicStaticFinalField(String.class, "insertIntoSql").value("\"" + insertInto + "\"");
+// List<String> body = new ArrayList<>();
+// body.add("this.insertIntoSql = \"" + insertInto + "\";");
+// g.addConstructor(new Parameters(), body);
entityMirror.insertInto(g);
- String fileName = (p.length() == 0 ? "" : p + ".") + className;
+ String fileName = (p.length() == 0 ? "" : p + ".") + entityMirror.daoName;
JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(fileName, element);
try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) {
g.write(w);
}
+
+ entities.add(entityMirror);
}
public FieldMirror fromElement(GeneratorSupport generatorSupport, VariableElement var) {
- System.out.print("element = ");
TypeMirror type = var.asType();
- elements.printElements(new PrintWriter(System.out), var);
+// System.out.print("element = ");
+// elements.printElements(new PrintWriter(System.out), var);
String javaName = var.getSimpleName().toString();
String sqlName = sqlName(javaName);
boolean notNull = false;
FieldMirror field;
+ boolean id = isId(var);
if (generatorSupport.isPrimitive(type)) {
- field = new PrimitiveFieldMirror(var, javaName, sqlName, notNull);
+ field = new PrimitiveFieldMirror(var, javaName, sqlName, id, notNull);
} else if (generatorSupport.hasTypeHandler(type)) {
+ if (id) {
+ throw new RuntimeException("A @Id field has to be a primitive or embedded.");
+ }
+
field = new FieldMirror.ReferenceFieldMirror(var, javaName, sqlName, notNull);
} else {
throw new RuntimeException("Missing type handler for type: " + type);
}
- System.out.println("field = " + field);
+// System.out.println("field = " + field);
return field;
}
+ public static boolean isId(VariableElement var) {
+ return var.getAnnotation(Id.class) != null;
+ }
+
+ public void phase3() throws Exception {
+ String p = packageElement.getQualifiedName().toString();
+
+ // TODO: Support a name prefix from @SqlEntitySet
+ String className = "Daos";
+
+ String fileName = (p.length() == 0 ? "" : p + ".") + className;
+ ClassG g = new ClassG(p, className);
+
+/*
+ TypeRef conType = g.addImport(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);
+*/
+
+ JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(fileName, packageElement);
+ try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) {
+ g.write(w);
+ }
+ }
+
public static String sqlName(String javaName) {
StringBuilder builder = new StringBuilder();
for (char c : javaName.toCharArray()) {