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.java83
1 files changed, 83 insertions, 0 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
new file mode 100644
index 0000000..df7a673
--- /dev/null
+++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/EntityHandler.java
@@ -0,0 +1,83 @@
+package io.trygvis.container.compiler;
+
+import io.trygvis.container.compiler.entity.EntityMirror;
+import io.trygvis.container.compiler.model.ClassG;
+import io.trygvis.container.compiler.model.Parameters;
+
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.VariableElement;
+import javax.tools.JavaFileObject;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import static io.trygvis.container.compiler.entity.EntityMirror.FieldMirror;
+import static java.lang.Character.isUpperCase;
+import static javax.lang.model.util.ElementFilter.fieldsIn;
+import static org.springframework.util.StringUtils.collectionToDelimitedString;
+
+public class EntityHandler extends AbstractHandler {
+ public EntityHandler(ProcessingEnvironment processingEnv) {
+ super(processingEnv);
+ }
+
+ public void processEntity(TypeElement element) throws Exception {
+ EntityMirror entityMirror = new EntityMirror(sqlName(element.getSimpleName().toString()));
+
+ for (VariableElement f : fieldsIn(elements.getAllMembers(element))) {
+ entityMirror.add(fromElement(f));
+ }
+
+ String p = elements.getPackageOf(element).getQualifiedName().toString();
+ String className = element.getSimpleName() + "_Sql";
+
+ ClassG g = new ClassG(p, className, null);
+ g.addPublicFinalField(String.class, "insertInto");
+ String insertInto = insertInto(entityMirror);
+ List<String> body = new ArrayList<>();
+ body.add("this.insertInto = \"" + insertInto + "\";");
+ g.addConstructor(new Parameters(), body);
+
+ String fileName = (p.length() == 0 ? "" : p + ".") + className;
+ JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(fileName, element);
+ try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) {
+ g.write(w);
+ }
+ }
+
+ public static String insertInto(EntityMirror entityMirror) {
+ List<String> names = new ArrayList<>();
+ List<String> placeholders = new ArrayList<>();
+ for (FieldMirror field : entityMirror.fields) {
+ names.add(field.sqlName);
+ placeholders.add("?");
+ }
+ return "INSERT INTO " + entityMirror.tableName + "(" + collectionToDelimitedString(names, ", ") + ") " +
+ "VALUES(" + collectionToDelimitedString(placeholders, ", ") + ");";
+ }
+
+ public FieldMirror fromElement(VariableElement var) {
+ System.out.println("io.trygvis.container.compiler.entity.EntityMirror.FieldMirror.fromElement");
+ 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 = new FieldMirror(javaName, sqlName, notNull);
+ System.out.println("field = " + field);
+ return field;
+ }
+
+ public static String sqlName(String javaName) {
+ StringBuilder builder = new StringBuilder();
+ for (char c : javaName.toCharArray()) {
+ char lower = Character.toLowerCase(c);
+ if(isUpperCase(c) && builder.length() > 0) {
+ builder.append("_");
+ }
+ builder.append(lower);
+ }
+ return builder.toString();
+ }
+}