diff options
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.java | 129 |
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) { |