diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/resolver/SiblingDependencyResolver.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/resolver/SiblingDependencyResolver.java index 95aa691..887427d 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/resolver/SiblingDependencyResolver.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/resolver/SiblingDependencyResolver.java @@ -66,6 +66,23 @@ public class SiblingDependencyResolver { for (String gradlePath : gradlePaths) { String relativePath = gradlePath.replace(':', '/'); Path resolvedSibling = rootDir.resolve(relativePath).normalize(); + + // Check for explicit projectDir mapping in settings.gradle or settings.gradle.kts + Path settingsFile = rootDir.resolve("settings.gradle"); + if (!Files.exists(settingsFile)) { + settingsFile = rootDir.resolve("settings.gradle.kts"); + } + if (Files.exists(settingsFile)) { + String settingsContent = Files.readString(settingsFile); + String regex = "project\\(['\"]:" + gradlePath + "['\"]\\)\\.projectDir\\s*=\\s*(?:file\\(['\"](.*?)['\"]\\)|new File\\(.*?,\\s*['\"](.*?)['\"]\\))"; + Matcher settingsMatcher = Pattern.compile(regex).matcher(settingsContent); + if (settingsMatcher.find()) { + String customPath = settingsMatcher.group(1) != null ? settingsMatcher.group(1) : settingsMatcher.group(2); + resolvedSibling = rootDir.resolve(customPath).normalize(); + log.info("Found custom projectDir in settings for {}: {}", gradlePath, resolvedSibling); + } + } + if (Files.exists(resolvedSibling)) { log.info("Discovered local Gradle sibling dependency: {}", resolvedSibling); siblings.add(resolvedSibling); @@ -156,6 +173,19 @@ public class SiblingDependencyResolver { // Also add parent dir if it has a pom.xml Path parentDir = projectDir.getParent(); + + // Check for explicit in parent block + Matcher parentRelativePathMatcher = Pattern.compile(".*?(.*?).*?", Pattern.DOTALL).matcher(content); + if (parentRelativePathMatcher.find()) { + String relPathStr = parentRelativePathMatcher.group(1).trim(); + Path relPath = projectDir.resolve(relPathStr).normalize(); + if (Files.isRegularFile(relPath) && relPath.getFileName().toString().equals("pom.xml")) { + parentDir = relPath.getParent(); + } else if (Files.isDirectory(relPath)) { + parentDir = relPath; + } + } + if (parentDir != null && Files.exists(parentDir.resolve("pom.xml")) && !parentDir.equals(projectDir)) { log.info("Discovered local Maven parent sibling: {}", parentDir); siblings.add(parentDir); diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/resolver/RelativePathTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/resolver/RelativePathTest.java new file mode 100644 index 0000000..28ec397 --- /dev/null +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/resolver/RelativePathTest.java @@ -0,0 +1,40 @@ +package click.kamil.springstatemachineexporter.analysis.resolver; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class RelativePathTest { + @Test + public void testRelativePathDirectory(@TempDir Path tempDir) throws Exception { + Path rootDir = tempDir.resolve("root"); + Path childDir = tempDir.resolve("child"); + Files.createDirectories(rootDir); + Files.createDirectories(childDir); + + Files.writeString(rootDir.resolve("pom.xml"), "com.acmeroot"); + Files.writeString(childDir.resolve("pom.xml"), "../root"); + + SiblingDependencyResolver resolver = new SiblingDependencyResolver(); + Set siblings = resolver.resolveSiblings(childDir); + assertTrue(siblings.contains(rootDir), "Should resolve parent directory from "); + } + + @Test + public void testRelativePathFile(@TempDir Path tempDir) throws Exception { + Path rootDir = tempDir.resolve("root"); + Path childDir = tempDir.resolve("child"); + Files.createDirectories(rootDir); + Files.createDirectories(childDir); + + Files.writeString(rootDir.resolve("pom.xml"), "com.acmeroot"); + Files.writeString(childDir.resolve("pom.xml"), "../root/pom.xml"); + + SiblingDependencyResolver resolver = new SiblingDependencyResolver(); + Set siblings = resolver.resolveSiblings(childDir); + assertTrue(siblings.contains(rootDir), "Should resolve parent directory from file"); + } +}