From c0c9c358e8703c1af917d7270adbb04160ad34b3 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 4 Aug 2013 10:24:43 +0200 Subject: wip --- .../trygvis/container/compiler/EntityHandler.java | 21 +++-- .../container/compiler/InternalErrorException.java | 3 + .../trygvis/container/compiler/SqlUnitModel.java | 11 ++- .../container/compiler/TransactionalHandler.java | 12 ++- .../trygvis/container/compiler/model/ClassG.java | 105 +++++++-------------- .../trygvis/container/compiler/model/Imports.java | 54 +++++++++++ 6 files changed, 118 insertions(+), 88 deletions(-) create mode 100644 container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Imports.java (limited to 'container-compiler-plugin/src/main/java/io/trygvis/container') 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 19205b1..d9e13ac 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 @@ -21,6 +21,7 @@ import javax.persistence.Id; import javax.tools.JavaFileObject; import java.io.IOException; import java.io.PrintWriter; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -108,10 +109,12 @@ public class EntityHandler extends AbstractHandler { } public void generate(EntityMirror entityMirror) throws IOException { - TypeRef stringType = new TypeRef(String.class); - TypeRef sqlEntityDescType = new TypeRef(SqlEntityDesc.class); - ClassG g = new ClassG(PUBLIC, entityMirror.daoType); + + TypeRef stringType = g.imports.add(String.class); + TypeRef sqlEntityDescType = g.imports.add(SqlEntityDesc.class); + TypeRef sqlExceptionType = g.imports.add(SQLException.class); + g.addPublicStaticFinalField(stringType, "createTableSql"). value(toJavaString(entityMirror.createTableSql(sqlUnit))); g.addPublicStaticFinalField(stringType, "dropTableSql"). @@ -125,10 +128,12 @@ public class EntityHandler extends AbstractHandler { toJavaString(entityMirror.defaultFields()) + ")"; g.addPublicStaticFinalField(sqlEntityDescType, "desc").value(desc); - entityMirror.insertInto(sqlUnit, g); - entityMirror.delete(g); - entityMirror.deleteById(g); - entityMirror.query(sqlUnit, g); + ClassG.InnerClassG typedQuery = g.addInnerClass(entityMirror.queryType(g.imports)); + typedQuery.inner.addMethod(entityMirror.fromResultSet(sqlUnit, 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(sqlUnit, g.imports)); JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile(entityMirror.daoType.fqName, sqlUnit.elementForEntity(entityMirror)); try (PrintWriter w = new PrintWriter(sourceFile.openWriter())) { @@ -183,7 +188,7 @@ public class EntityHandler extends AbstractHandler { ClassG g = new ClassG(PUBLIC, type); /* - TypeRef conType = g.addImport(Connection.class); + TypeRef conType = g.add(Connection.class); Parameters parameters = new Parameters(); ParameterRef c = parameters.addParameter(conType, "c"); diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/InternalErrorException.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/InternalErrorException.java index dfb6746..0f76813 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/InternalErrorException.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/InternalErrorException.java @@ -6,4 +6,7 @@ public class InternalErrorException extends RuntimeException { super(message); } + public InternalErrorException(Exception e) { + super(e); + } } diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/SqlUnitModel.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/SqlUnitModel.java index 20d5f3b..bb6fa14 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/SqlUnitModel.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/SqlUnitModel.java @@ -4,15 +4,22 @@ import io.trygvis.container.compiler.model.TypeRef; import io.trygvis.persistence.EntityMirror; import javax.lang.model.element.Element; +import java.util.Collections; import java.util.Map; import java.util.TreeMap; +import static java.util.Collections.addAll; + public class SqlUnitModel { private Map entities = new TreeMap<>(); private Map elements = new TreeMap<>(); - public void add(EntityMirror entity) { - entities.put(entity.type, entity); + public SqlUnitModel add(EntityMirror... entities) { + for (EntityMirror entity : entities) { + this.entities.put(entity.type, entity); + } + + return this; } public EntityMirror get(TypeRef type) { diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java index f944b1d..b5db075 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/TransactionalHandler.java @@ -2,6 +2,7 @@ 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.MethodRef; import io.trygvis.container.compiler.model.Parameters; import io.trygvis.container.compiler.model.TypeRef; import io.trygvis.container.tx.PlatformTransactionManager; @@ -77,13 +78,13 @@ public class TransactionalHandler extends AbstractHandler { TypeKind kind = returnTypeMirror.getKind(); boolean isVoid = kind == TypeKind.VOID; - TypeRef returnType = isVoid ? TypeRef.VOID : g.addImport(returnTypeMirror); + TypeRef returnType = isVoid ? TypeRef.VOID : g.imports.add(returnTypeMirror); Parameters parameters = new Parameters(); List arguments = new ArrayList<>(); for (VariableElement ve : ee.getParameters()) { // parameters.add("final " + ve.asType().toString() + " " + ve.getSimpleName().toString()); - TypeRef k = g.addImport(ve.asType()); + TypeRef k = g.imports.add(ve.asType()); parameters.addParameter(k, ve.getSimpleName().toString()); arguments.add(ve.getSimpleName().toString()); } @@ -107,7 +108,8 @@ public class TransactionalHandler extends AbstractHandler { body.add(" }"); body.add(" });"); - g.addMethod(body, returnType, ee.getSimpleName().toString(), parameters); + MethodRef m = new MethodRef(PUBLIC, returnType, ee.getSimpleName().toString(), parameters, body); + g.addMethod(m); } JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile((p.length() == 0 ? "" : p + ".") + className, element); @@ -122,11 +124,11 @@ public class TransactionalHandler extends AbstractHandler { Parameters parameters = new Parameters(); List goesToSuper = new ArrayList<>(); - TypeRef k = g.addImport(PlatformTransactionManager.class); + TypeRef k = g.imports.add(PlatformTransactionManager.class); Parameters.ParameterRef transactionManager = parameters.addParameter(k, "transactionManager"); for (VariableElement p : constructor.getParameters()) { - k = g.addImport(p.asType()); + k = g.imports.add(p.asType()); String name = p.getSimpleName().toString(); parameters.addParameter(k, name); goesToSuper.add(name); diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/ClassG.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/ClassG.java index e71bbb7..c99feae 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/ClassG.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/ClassG.java @@ -1,13 +1,11 @@ package io.trygvis.container.compiler.model; -import io.trygvis.container.compiler.Utils; import org.apache.commons.lang.StringUtils; import javax.annotation.Generated; import javax.lang.model.type.TypeMirror; import java.lang.reflect.Modifier; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -23,18 +21,17 @@ public class ClassG { public final TypeRef type; private TypeRef extendsType; private List implementsTypes = new ArrayList<>(); - private final Set imports = new TreeSet<>(); + public final Imports imports = new Imports(); private final Set fields = new TreeSet<>(); private final List methods = new ArrayList<>(); private final List constructors = new ArrayList<>(); private final List innerClasses = new ArrayList<>(); - public static class InnerClassG extends ClassG { - public final ClassG parent; + public static class InnerClassG { + public final ClassG inner; - public InnerClassG(ClassG parent, int modifiers, TypeRef type) { - super(modifiers, type); - this.parent = parent; + public InnerClassG(ClassG inner) { + this.inner = inner; } } @@ -57,44 +54,15 @@ public class ClassG { return this; } - public TypeRef addImport(final TypeMirror type) { - return addImport(new TypeRef(type)); - } - - public TypeRef addImport(Class c) { - return addImport(new TypeRef(c)); - } - - public TypeRef addImport(TypeRef klass) { - String fqName = klass.fqName; - String name = klass.toString(); - for (TypeRef i : imports) { - if (i.fqName.equals(fqName)) { - return i; - } - - // If we've already found an import with the same name, use the fq version - if (i.plainName.equals(name)) { - name = fqName; - break; - } - } - - TypeRef ref = new TypeRef(fqName, name); - imports.add(ref); - - return ref; - } - public FieldRef addField(TypeMirror klass, String name) { - TypeRef type = addImport(klass); + TypeRef type = imports.add(klass); FieldRef ref = new FieldRef(PRIVATE | FINAL, type, name); fields.add(ref); return ref; } public FieldRef addField(int modifiers, TypeRef type, String name) { - TypeRef t = addImport(type); + TypeRef t = imports.add(type); FieldRef ref = new FieldRef(modifiers, t, name); fields.add(ref); return ref; @@ -118,44 +86,43 @@ public class ClassG { return constructor; } - public MethodRef addMethod(List body, TypeRef returnType, String name, Parameters parameters) { - MethodRef ref = new MethodRef(PUBLIC, returnType, name, parameters, body); - methods.add(ref); - return ref; + public ClassG addMethod(MethodRef methodRef) { + this.methods.add(methodRef); + return this; } - public MethodRef addStaticMethod(List body, TypeRef returnType, String name, Parameters parameters) { - MethodRef ref = new MethodRef(PUBLIC | STATIC, returnType, name, parameters, body); - methods.add(ref); - return ref; - } +// public MethodRef addMethod(List body, TypeRef returnType, String name, Parameters parameters) { +// MethodRef ref = new MethodRef(PUBLIC, returnType, name, parameters, body); +// methods.add(ref); +// return ref; +// } +// +// public MethodRef addStaticMethod(List body, TypeRef returnType, String name, Parameters parameters) { +// MethodRef ref = new MethodRef(PUBLIC | STATIC, returnType, name, parameters, body); +// methods.add(ref); +// return ref; +// } - public InnerClassG addInnerClass(int modifiers, TypeRef type) { - InnerClassG inner = new InnerClassG(this, modifiers, type); - innerClasses.add(inner); - return inner; + public InnerClassG addInnerClass(ClassG inner) { + InnerClassG i = new InnerClassG(inner); + innerClasses.add(i); + return i; } public final List generate() { - TypeRef generatedType = addImport(Generated.class); + return generate(false); + } + + public final List generate(boolean isInner) { + TypeRef generatedType = imports.add(Generated.class); List body = new ArrayList<>(); - boolean isInner = this instanceof InnerClassG; if (!type.inUnnamedPackage() && !isInner) { body.add("package " + type.packageName() + ";"); body.add(""); } if (!isInner) { - // TODO: Add imports from inner classes - for (TypeRef i : getImports()) { - if (i.isPrimitive() || i.inUnnamedPackage()) { - continue; - } - body.add("import " + i.fqName + ";"); - } - if (!imports.isEmpty()) { - body.add(""); - } + body.addAll(imports.generate()); } String extendsString = extendsType == null ? "" : " extends " + extendsType; @@ -173,7 +140,7 @@ public class ClassG { for (InnerClassG innerClass : innerClasses) { body.add(""); - addAll(1, body, innerClass.generate()); + addAll(1, body, innerClass.inner.generate(true)); } for (Constructor constructor : constructors) { @@ -197,14 +164,6 @@ public class ClassG { } } - protected Collection getImports() { - List imports = new ArrayList<>(this.imports); - for (InnerClassG c : innerClasses) { - imports.addAll(c.getImports()); - } - return imports; - } - private List write(MethodRef method) { List body = new ArrayList<>(); String returnString; diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Imports.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Imports.java new file mode 100644 index 0000000..9ed6097 --- /dev/null +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Imports.java @@ -0,0 +1,54 @@ +package io.trygvis.container.compiler.model; + +import javax.lang.model.type.TypeMirror; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +public class Imports { + private final Set imports = new TreeSet<>(); + + public TypeRef add(final TypeMirror type) { + return add(new TypeRef(type)); + } + + public TypeRef add(Class c) { + return add(new TypeRef(c)); + } + + public TypeRef add(TypeRef klass) { + String fqName = klass.fqName; + String name = klass.toString(); + for (TypeRef i : imports) { + if (i.fqName.equals(fqName)) { + return i; + } + + // If we've already found an import with the same name, use the fq version + if (i.plainName.equals(name)) { + name = fqName; + break; + } + } + + TypeRef ref = new TypeRef(fqName, name); + imports.add(ref); + + return ref; + } + + public List generate() { + List body = new ArrayList<>(); + for (TypeRef i : imports) { + if (i.isPrimitive() || i.inUnnamedPackage()) { + continue; + } + body.add("import " + i.fqName + ";"); + } + if (!imports.isEmpty()) { + body.add(""); + } + return body; + } +} -- cgit v1.2.3