diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java index 6d6ade7..922091c 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java @@ -482,7 +482,12 @@ public class CodebaseContext { } } enumValues.put(fqn, values); - if (!simpleNameToFqn.containsKey(simpleName)) { + if (simpleNameToFqn.containsKey(simpleName)) { + String existingFqn = simpleNameToFqn.get(simpleName); + if (existingFqn != null && !existingFqn.equals(fqn)) { + ambiguousSimpleNames.add(simpleName); + } + } else { simpleNameToFqn.put(simpleName, fqn); } @@ -516,6 +521,9 @@ public class CodebaseContext { List values = enumValues.get(cleanName); if (values == null) { + if (!cleanName.contains(".") && ambiguousSimpleNames.contains(cleanName)) { + return null; + } String fqn = simpleNameToFqn.get(cleanName); if (fqn != null) values = enumValues.get(fqn); } diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContextTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContextTest.java index 5ce5e6d..690faed 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContextTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContextTest.java @@ -231,6 +231,25 @@ class CodebaseContextTest { assertThat(context.findEntryPointClasses(List.of("EnableStateMachine"))).isEmpty(); } + @Test + void getEnumValuesShouldFailClosedForAmbiguousSimpleEnumName() throws IOException { + Files.createDirectories(tempDir.resolve("a")); + Files.createDirectories(tempDir.resolve("b")); + Files.writeString(tempDir.resolve("a/OrderEvent.java"), + "package a; public enum OrderEvent { PAY }"); + Files.writeString(tempDir.resolve("b/OrderEvent.java"), + "package b; public enum OrderEvent { SHIP }"); + + CodebaseContext context = new CodebaseContext(); + context.scan(tempDir); + + assertThat(context.getEnumValues("OrderEvent")) + .as("ambiguous simple enum name must not resolve to arbitrary package") + .isNull(); + assertThat(context.getEnumValues("a.OrderEvent")).containsExactly("a.OrderEvent.PAY"); + assertThat(context.getEnumValues("b.OrderEvent")).containsExactly("b.OrderEvent.SHIP"); + } + @Test void shouldFindClassWithFullyQualifiedAnnotation() throws IOException { String source = """