2626from codeflash .code_utils .shell_utils import get_shell_rc_path , is_powershell
2727from codeflash .telemetry .posthog_cf import ph
2828
29+ _MAVEN_NS = {"m" : "http://maven.apache.org/POM/4.0.0" }
30+
2931
3032class JavaBuildTool (Enum ):
3133 """Java build tools."""
@@ -75,23 +77,15 @@ def detect_java_build_tool(project_root: Path) -> JavaBuildTool:
7577def detect_java_source_root (project_root : Path ) -> str :
7678 """Detect the Java source root directory."""
7779 # Standard Maven/Gradle layout
78- standard_src = project_root / "src" / "main" / "java"
79- if standard_src .is_dir ():
80+ if (project_root / "src" / "main" / "java" ).is_dir ():
8081 return "src/main/java"
8182
8283 # Try to detect from pom.xml
83- pom_path = project_root / "pom.xml"
84- if pom_path .exists ():
85- try :
86- tree = ET .parse (pom_path )
87- root = tree .getroot ()
88- # Handle Maven namespace
89- ns = {"m" : "http://maven.apache.org/POM/4.0.0" }
90- source_dir = root .find (".//m:sourceDirectory" , ns )
91- if source_dir is not None and source_dir .text :
92- return source_dir .text
93- except ET .ParseError :
94- pass
84+ root = _get_pom_root_cached (project_root )
85+ if root is not None :
86+ source_dir = root .find (".//m:sourceDirectory" , _MAVEN_NS )
87+ if source_dir is not None and source_dir .text :
88+ return source_dir .text
9589
9690 # Fallback to src directory
9791 if (project_root / "src" ).is_dir ():
@@ -103,22 +97,15 @@ def detect_java_source_root(project_root: Path) -> str:
10397def detect_java_test_root (project_root : Path ) -> str :
10498 """Detect the Java test root directory."""
10599 # Standard Maven/Gradle layout
106- standard_test = project_root / "src" / "test" / "java"
107- if standard_test .is_dir ():
100+ if (project_root / "src" / "test" / "java" ).is_dir ():
108101 return "src/test/java"
109102
110103 # Try to detect from pom.xml
111- pom_path = project_root / "pom.xml"
112- if pom_path .exists ():
113- try :
114- tree = ET .parse (pom_path )
115- root = tree .getroot ()
116- ns = {"m" : "http://maven.apache.org/POM/4.0.0" }
117- test_source_dir = root .find (".//m:testSourceDirectory" , ns )
118- if test_source_dir is not None and test_source_dir .text :
119- return test_source_dir .text
120- except ET .ParseError :
121- pass
104+ root = _get_pom_root_cached (project_root )
105+ if root is not None :
106+ test_source_dir = root .find (".//m:testSourceDirectory" , _MAVEN_NS )
107+ if test_source_dir is not None and test_source_dir .text :
108+ return test_source_dir .text
122109
123110 # Fallback patterns
124111 if (project_root / "test" ).is_dir ():
@@ -461,10 +448,9 @@ def configure_java_project(setup_info: JavaSetupInfo) -> bool:
461448 test_root = setup_info .test_root_override or detect_java_test_root (curdir )
462449
463450 # Only include non-default values
464- defaults = {"module-root" : "src/main/java" , "tests-root" : "src/test/java" }
465- if source_root != defaults ["module-root" ]:
451+ if source_root != "src/main/java" :
466452 config ["module-root" ] = source_root
467- if test_root != defaults [ "tests-root" ] :
453+ if test_root != "src/test/java" :
468454 config ["tests-root" ] = test_root
469455
470456 if setup_info .formatter_override is not None and setup_info .formatter_override != ["disabled" ]:
@@ -539,6 +525,18 @@ def get_java_test_command(build_tool: JavaBuildTool) -> str:
539525 return "mvn test"
540526
541527
528+ @lru_cache (maxsize = 8 )
529+ def _get_pom_root_cached (project_root : Path ) -> Union [ET .Element , None ]:
530+ pom_path = project_root / "pom.xml"
531+ if not pom_path .exists ():
532+ return None
533+ try :
534+ tree = ET .parse (pom_path )
535+ return tree .getroot ()
536+ except ET .ParseError :
537+ return None
538+
539+
542540formatter_warning_shown = False
543541
544542_SPOTLESS_COMMANDS = {
0 commit comments