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;
}
}