private void parseJpaEntities()

in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/java/JpaEntityScanner.java [357:425]


    private void parseJpaEntities(Path javaFile, List<DataEntity> dataEntities, List<Relationship> relationships) throws IOException {
        Optional<CompilationUnit> cuOpt = parseJavaFile(javaFile);
        if (cuOpt.isEmpty()) {
            return;
        }

        CompilationUnit cu = cuOpt.get();
        cu.findAll(ClassOrInterfaceDeclaration.class).forEach(classDecl -> {
            Optional<AnnotationExpr> entityAnnotation = classDecl.getAnnotations().stream()
                .filter(ann -> ENTITY_ANNOTATIONS.contains(ann.getNameAsString()))
                .findFirst();

            if (entityAnnotation.isEmpty()) {
                return;
            }

            String annotationType = entityAnnotation.get().getNameAsString();
            boolean isMongoDocument = DOCUMENT_ANNOTATION.equals(annotationType);

            String className = classDecl.getNameAsString();
            String packageName = cu.getPackageDeclaration()
                .map(pd -> pd.getNameAsString())
                .orElse("");

            String fullyQualifiedName = packageName.isEmpty() ? className : packageName + "." + className;
            String tableName = isMongoDocument
                ? extractCollectionName(classDecl, className)
                : extractTableName(classDecl, className);
            String entityType = isMongoDocument ? DATA_ENTITY_TYPE_COLLECTION : DATA_ENTITY_TYPE_TABLE;
            String description = (isMongoDocument ? DOCUMENT_DESCRIPTION_PREFIX : ENTITY_DESCRIPTION_PREFIX) + className;

            List<DataEntity.Field> fields = new ArrayList<>();
            String primaryKey = null;

            for (FieldDeclaration fieldDecl : classDecl.getFields()) {
                Optional<AnnotationExpr> relationshipAnnotation = fieldDecl.getAnnotations().stream()
                    .filter(ann -> RELATIONSHIP_ANNOTATIONS.contains(ann.getNameAsString()))
                    .findFirst();

                if (relationshipAnnotation.isPresent()) {
                    extractRelationship(fieldDecl, fullyQualifiedName, relationshipAnnotation.get(), relationships);
                } else {
                    DataEntity.Field field = extractField(fieldDecl);
                    if (field != null) {
                        fields.add(field);
                        if (isIdField(fieldDecl) && primaryKey == null) {
                            primaryKey = field.name();
                        }
                    }
                }
            }

            DataEntity entity = new DataEntity(
                fullyQualifiedName,
                tableName,
                entityType,
                fields,
                primaryKey,
                description
            );

            dataEntities.add(entity);
            log.debug("Found {} entity: {} -> {}: {}",
                isMongoDocument ? "MongoDB" : "JPA",
                fullyQualifiedName,
                entityType,
                tableName);
        });
    }