private void addExternalParents(EntityType entityType) { Deque<Type> superTypes = new ArrayDeque<Type>(); if (entityType.getSuperType() != null) { superTypes.push(entityType.getSuperType().getType()); } while (!superTypes.isEmpty()) { Type superType = superTypes.pop(); if (!context.allTypes.containsKey(superType.getFullName())) { TypeElement typeElement = processingEnv.getElementUtils().getTypeElement(superType.getFullName()); if (typeElement == null) { throw new IllegalStateException("Found no type for " + superType.getFullName()); } EntityType superEntityType = elementHandler.handleEntityType(typeElement); if (superEntityType.getSuperType() != null) { superTypes.push(superEntityType.getSuperType().getType()); } context.allTypes.put(superType.getFullName(), superEntityType); } } }
protected Set<TypeElement> collectElements() { Set<TypeElement> elements = new HashSet<TypeElement>(); // from delegate methods elements.addAll(processDelegateMethods()); // from class annotations for (Class<? extends Annotation> annotation : conf.getEntityAnnotations()) { for (Element element : getElements(annotation)) { if (element instanceof TypeElement) { elements.add((TypeElement) element); } } } // from package annotations if (conf.getEntitiesAnnotation() != null) { for (Element element : getElements(conf.getEntitiesAnnotation())) { AnnotationMirror mirror = TypeUtils.getAnnotationMirrorOfType(element, conf.getEntitiesAnnotation()); elements.addAll(TypeUtils.getAnnotationValuesAsElements(mirror, "value")); } } // from embedded annotations if (conf.getEmbeddedAnnotation() != null) { elements.addAll(getEmbeddedTypes()); } // from embedded if (conf.isUnknownAsEmbedded()) { elements.addAll(getTypeFromProperties(elements)); } // from annotation less supertypes elements.addAll(getAnnotationlessSupertypes(elements)); // register possible embedded types of non-tracked supertypes if (conf.getEmbeddedAnnotation() != null) { Class<? extends Annotation> embedded = conf.getEmbeddedAnnotation(); Set<TypeElement> embeddedElements = new HashSet<TypeElement>(); for (TypeElement element : elements) { TypeMirror superTypeMirror = element.getSuperclass(); while (superTypeMirror != null) { TypeElement superTypeElement = (TypeElement) processingEnv.getTypeUtils().asElement(superTypeMirror); if (superTypeElement != null) { List<? extends Element> enclosed = superTypeElement.getEnclosedElements(); for (Element child : enclosed) { if (child.getAnnotation(embedded) != null) { handleEmbeddedType(child, embeddedElements); } } superTypeMirror = superTypeElement.getSuperclass(); if (superTypeMirror instanceof NoType) { superTypeMirror = null; } } else { superTypeMirror = null; } } } // register found elements for (TypeElement element : embeddedElements) { if (!elements.contains(element)) { elementHandler.handleEntityType(element); } } } return elements; }
private void processAnnotations() { processExclusions(); Set<TypeElement> elements = collectElements(); // create meta models for (Element element : elements) { typeFactory.getEntityType(element.asType(), false); } for (Element element : elements) { typeFactory.getEntityType(element.asType(), true); } // add properties boolean embeddableAnn = conf.getEmbeddableAnnotation() != null; boolean altEntityAnn = conf.getAlternativeEntityAnnotation() != null; boolean superAnn = conf.getSuperTypeAnnotation() != null; for (TypeElement element : elements) { EntityType entityType = elementHandler.handleEntityType(element); registerTypeElement(entityType.getFullName(), element); if (element.getAnnotation(conf.getEntityAnnotation()) != null) { context.entityTypes.put(entityType.getFullName(), entityType); } else if (altEntityAnn && element.getAnnotation(conf.getAlternativeEntityAnnotation()) != null) { context.entityTypes.put(entityType.getFullName(), entityType); } else if (embeddableAnn && element.getAnnotation(conf.getEmbeddableAnnotation()) != null) { context.embeddableTypes.put(entityType.getFullName(), entityType); } else if (superAnn && element.getAnnotation(conf.getSuperTypeAnnotation()) != null) { context.supertypes.put(entityType.getFullName(), entityType); } else if (!entityType.getDelegates().isEmpty()) { context.extensionTypes.put(entityType.getFullName(), entityType); } else { context.embeddableTypes.put(entityType.getFullName(), entityType); } context.allTypes.put(entityType.getFullName(), entityType); } // track also methods from external entity types for (EntityType entityType : new ArrayList<EntityType>(typeFactory.getEntityTypes())) { String fullName = entityType.getFullName(); if (!context.allTypes.keySet().contains(fullName)) { // System.err.println(fullName); TypeElement element = processingEnv.getElementUtils().getTypeElement(fullName); if (element != null) { elementHandler.handleEntityType(element); } } } // add external parents for (Element element : elements) { EntityType entityType = typeFactory.getEntityType(element.asType(), false); addExternalParents(entityType); } // add properties from parents Set<EntityType> handled = new HashSet<EntityType>(); for (EntityType entityType : context.allTypes.values()) { addSupertypeFields(entityType, handled); } processProjectionTypes(elements); // extend entity types typeFactory.extendTypes(); context.clean(); }