protected boolean shouldScanFile()

in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/java/SpringRestApiScanner.java [163:224]


    protected boolean shouldScanFile(Path file) {
        // Priority 1: Filename convention (fastest check, no I/O)
        String fileName = file.getFileName().toString();
        if (fileName.endsWith("Controller.java") ||
            fileName.endsWith("RestController.java") ||
            fileName.endsWith("Resource.java")) {
            log.trace("Including file by naming convention: {}", fileName);
            return true;
        }

        // Skip test files unless they contain Spring MVC patterns
        String filePath = file.toString();
        boolean isTestFile = filePath.contains("/test/") || filePath.contains("\\test\\");

        try {
            String content = readFileContent(file);

            // Priority 2: Check for Spring Web package imports (loose pattern for wildcards)
            // Matches: org.springframework.web.bind.annotation.* OR individual imports
            boolean hasSpringWebImport =
                (content.contains("springframework") && content.contains("web") && content.contains("annotation")) ||
                (content.contains("springframework") && content.contains("stereotype") && content.contains("Controller"));

            // Priority 3: Check for direct Spring MVC annotations (catches any usage)
            boolean hasSpringAnnotations =
                content.contains("@RestController") ||
                content.contains("@Controller") ||
                content.contains("@RequestMapping") ||
                content.contains("@GetMapping") ||
                content.contains("@PostMapping") ||
                content.contains("@PutMapping") ||
                content.contains("@DeleteMapping") ||
                content.contains("@PatchMapping");

            // Priority 4: Check for base class patterns (conservative)
            // Matches: extends BaseController/BaseRestController/etc. with Spring imports
            boolean extendsController =
                content.contains("extends") &&
                (content.contains("Controller") || content.contains("Resource")) &&
                hasSpringWebImport;

            boolean hasSpringMvcPatterns = hasSpringWebImport || hasSpringAnnotations || extendsController;

            if (hasSpringMvcPatterns) {
                log.debug("Including file with Spring MVC patterns: {} (webImport={}, annotations={}, extends={})",
                    fileName, hasSpringWebImport, hasSpringAnnotations, extendsController);
            } else {
                log.trace("Skipping file without Spring MVC patterns: {}", fileName);
            }

            // For test files, require Spring MVC patterns
            // For non-test files, allow if they have Spring MVC patterns
            if (isTestFile) {
                return hasSpringMvcPatterns;
            }

            return hasSpringMvcPatterns;
        } catch (IOException e) {
            log.debug("Failed to read file for pre-filtering: {}", file);
            return false;
        }
    }