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 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 names = new ArrayList<>(); List 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(); } }