protected boolean shouldScanFile()

in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/java/JaxRsApiScanner.java [190:252]


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

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

        try {
            String content = readFileContent(file);

            // Priority 2: Check for JAX-RS package imports (loose pattern for wildcards)
            // Matches: jakarta.ws.rs.* OR javax.ws.rs.* OR individual imports
            boolean hasJaxRsImport =
                (content.contains("jakarta") && content.contains("ws") && content.contains("rs")) ||
                (content.contains("javax") && content.contains("ws") && content.contains("rs"));

            // Priority 3: Check for direct JAX-RS annotations (catches any usage)
            boolean hasJaxRsAnnotations =
                content.contains("@Path") ||
                content.contains("@GET") ||
                content.contains("@POST") ||
                content.contains("@PUT") ||
                content.contains("@DELETE") ||
                content.contains("@PATCH") ||
                content.contains("@Produces") ||
                content.contains("@Consumes");

            // Priority 4: Check for common JAX-RS classes (conservative)
            boolean hasJaxRsClasses =
                content.contains("Response") ||
                content.contains("MediaType") ||
                content.contains("UriInfo");

            boolean hasJaxRsPatterns = hasJaxRsImport || hasJaxRsAnnotations || hasJaxRsClasses;

            if (hasJaxRsPatterns) {
                log.debug("Including file with JAX-RS patterns: {} (import={}, annotations={}, classes={})",
                    fileName, hasJaxRsImport, hasJaxRsAnnotations, hasJaxRsClasses);
            } else {
                log.trace("Skipping file without JAX-RS patterns: {}", fileName);
            }

            // For test files, require JAX-RS patterns
            // For non-test files, allow if they have JAX-RS patterns
            if (isTestFile) {
                return hasJaxRsPatterns;
            }

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