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.java129
1 files changed, 91 insertions, 38 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 9cb85e9..ba9f100 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
@@ -25,11 +25,13 @@ import javax.lang.model.type.TypeMirror;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
+import java.util.TreeSet;
import static io.trygvis.container.compiler.Utils.toFieldName;
import static io.trygvis.container.compiler.Utils.writeFile;
@@ -95,22 +97,60 @@ public class EntityHandler extends AbstractHandler {
sqlUnit.setName(name);
}
- public void recordEntity(TypeElement element) throws Exception {
+ Set<TypeElement> mappedSuperclasses = new HashSet<>();
+ Set<TypeElement> entities = new HashSet<>();
+
+ public void record(TypeElement element, boolean superclass) throws Exception {
+ (superclass ? mappedSuperclasses : entities).add(element);
+ }
+
+ private EntityMirror getEntity(TypeElement element, boolean superclass) throws Exception {
+ EntityMirror entity = sqlUnit.entity(element);
+ if (entity != null) {
+ return entity;
+ }
+
+ entity = buildMirror(element, superclass);
+ sqlUnit.add(entity, element);
+ return entity;
+ }
+
+ public EntityMirror buildMirror(TypeElement element, boolean concrete) throws Exception {
+ EntityMirror superEntity = null;
+
+ Set<TypeMirror> ancestry = new TreeSet<>(new TypeMirrorComparator());
+ ancestry.add(element.asType());
+ TypeMirror superType = element.getSuperclass();
+ while (!superType.toString().equals("java.lang.Object")) {
+ TypeElement superTypeMirror = elements.getTypeElement(superType.toString());
+ if (superTypeMirror == null) {
+ throw new CompilerException(element, "Couldn't find element for super class: " + element.getSuperclass());
+ }
+
+ if (mappedSuperclasses.contains(superTypeMirror)) {
+ superEntity = getEntity(superTypeMirror, false);
+ break;
+ }
+ ancestry.add(superType);
+ superType = superTypeMirror.getSuperclass();
+ }
+
EntityMirror entity = new EntityMirror(
generatorConfiguration,
new TypeRef(types.getDeclaredType(element)),
- sqlName(element.getSimpleName().toString()));
+ concrete,
+ superEntity,
+ concrete ? Utils.sqlName(element.getSimpleName().toString()) : null);
Map<String, ExecutableElement> getters = new TreeMap<>();
Map<String, ExecutableElement> setters = new TreeMap<>();
for (ExecutableElement m : methodsIn(elements.getAllMembers(element))) {
- String name = m.getSimpleName().toString();
- if (name.length() < 4 || !isUpperCase(name.charAt(3))) {
+ if (!ancestry.contains(m.getEnclosingElement().asType())) {
continue;
}
- String declaringType = ((TypeElement) m.getEnclosingElement()).getQualifiedName().toString();
- if (declaringType.equals("java.lang.Object")) {
+ String name = m.getSimpleName().toString();
+ if (name.length() < 4 || !isUpperCase(name.charAt(3))) {
continue;
}
@@ -126,6 +166,11 @@ public class EntityHandler extends AbstractHandler {
}
for (VariableElement f : fieldsIn(elements.getAllMembers(element))) {
+ System.out.println("f.getEnclosingElement() = " + f.getEnclosingElement());
+ if (!ancestry.contains(f.getEnclosingElement().asType())) {
+ continue;
+ }
+
String name = f.getSimpleName().toString();
ExecutableElement getter = getters.remove(name);
ExecutableElement setter = setters.remove(name);
@@ -141,6 +186,11 @@ public class EntityHandler extends AbstractHandler {
String name = e.getKey();
ExecutableElement getter = e.getValue();
ExecutableElement setter = setters.remove(name);
+
+ if (!ancestry.contains(getter.getEnclosingElement().asType())) {
+ continue;
+ }
+
FieldMirror field = fromElement(generatorConfiguration, null, getter, setter);
if (field == null) {
continue;
@@ -167,12 +217,16 @@ public class EntityHandler extends AbstractHandler {
processSequenceGenerators(element);
- // -----------------------------------------------------------------------
- // Validation
- // -----------------------------------------------------------------------
+ return entity;
+ }
+
+ public void validate(Element element, EntityMirror entity) {
+ if (!entity.concrete) {
+ return;
+ }
List<FieldMirror> idFields = new ArrayList<>();
- for (FieldMirror field : entity.fields) {
+ for (FieldMirror field : entity.getFields()) {
if (field.id) {
idFields.add(field);
}
@@ -184,9 +238,8 @@ 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);
+ entity.setIdType(idFields.get(0).type);
}
private void processSequenceGenerators(Element element) {
@@ -219,7 +272,7 @@ public class EntityHandler extends AbstractHandler {
}
}
if (name != null) {
- sequenceName = sequenceName == null ? sqlName(name) : sequenceName;
+ sequenceName = sequenceName == null ? Utils.sqlName(name) : sequenceName;
sqlUnit.add(new SequenceMirror(name, sequenceName, initialValue, allocationSize), element);
}
}
@@ -247,7 +300,7 @@ public class EntityHandler extends AbstractHandler {
} else {
setterType = setter != null ? SetterType.METHOD : SetterType.FIELD;
}
- getterType = GetterType.FIELD;
+ getterType = getter != null ? GetterType.METHOD : GetterType.FIELD;
type = new TypeRef(var.asType());
element = types.asElement(var.asType());
javaName = var.getSimpleName().toString();
@@ -274,7 +327,7 @@ public class EntityHandler extends AbstractHandler {
}
javaName = toFieldName(getter.getSimpleName().toString());
}
- sqlName = sqlName(javaName);
+ sqlName = Utils.sqlName(javaName);
// Register type handler if this is an enum
if (element != null && element.getKind() == ElementKind.ENUM) {
@@ -292,10 +345,7 @@ public class EntityHandler extends AbstractHandler {
FieldMirror field;
if (primitive) {
- System.out.println("type = " + type);
TypeHandler typeHandler = generatorConfiguration.typeHandler(type);
- System.out.println("typeHandler = " + typeHandler);
- System.out.println("typeHandler.typeName() = " + typeHandler.typeName());
// TODO: check for configuration conflict
notNull = !typeHandler.nullable;
field = new FieldMirror(PRIMITIVE, setterType, getterType, type, javaName, sqlName, id, notNull, unique);
@@ -312,31 +362,34 @@ public class EntityHandler extends AbstractHandler {
}
public void phase3(boolean errorRaised) throws Exception {
- try {
- for (EntityMirror entity : sqlUnit.getEntities().values()) {
+ for (TypeElement mappedSuperclass : mappedSuperclasses) {
+ getEntity(mappedSuperclass, false);
+ }
+
+ for (TypeElement entity : entities) {
+ getEntity(entity, true);
+ }
+
+ for (EntityMirror entity : sqlUnit.getEntities().values()) {
+ try {
+ validate(sqlUnit.element(entity), entity);
+
+ if (!entity.concrete) {
+ continue;
+ }
+
+ System.out.println("entity.type = " + entity.type);
DaoGenerator daoGenerator = new DaoGenerator(generatorConfiguration, sqlUnit, entity);
writeFile(processingEnv, daoGenerator.generate(), sqlUnit.element(entity));
writeFile(processingEnv, daoGenerator.generateRow(), sqlUnit.element(entity));
+ } catch (CompilerException | InternalErrorException e) {
+ // Ignore any exceptions if we had an error from before
+ if (errorRaised) {
+ continue;
+ }
+ throw e;
}
- } catch (CompilerException | InternalErrorException e) {
- // Ignore any exceptions if we had an error from before
- if (errorRaised) {
- return;
- }
- throw e;
- }
- }
-
- 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();
}
private AnnotationMirror findAnnotation(Class<?> c, Element type) {