diff --git a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramHelper.java b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramHelper.java index c6ca5c5f39dc1..eaff690ceb4b2 100644 --- a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramHelper.java +++ b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramHelper.java @@ -86,10 +86,15 @@ static String extractSourceName(String source) { if (source == null || source.isBlank()) { return null; } - // strip scheme prefix (e.g. "file:") - int colon = source.lastIndexOf(':'); - if (colon >= 0 && colon < source.length() - 1) { - source = source.substring(colon + 1); + // strip URI scheme prefix (e.g. "file:", "classpath:") — only if the part + // before the first colon is all letters (a valid scheme). This avoids + // stripping line numbers from sources like "cheese.java:9". + int colon = source.indexOf(':'); + if (colon > 0) { + String scheme = source.substring(0, colon); + if (scheme.chars().allMatch(Character::isLetter)) { + source = source.substring(colon + 1); + } } // return just the filename part int slash = Math.max(source.lastIndexOf('/'), source.lastIndexOf('\\')); diff --git a/components/camel-diagram/src/test/java/org/apache/camel/diagram/RouteDiagramTest.java b/components/camel-diagram/src/test/java/org/apache/camel/diagram/RouteDiagramTest.java index 3b0060897eb2a..a7ea8029bdd56 100644 --- a/components/camel-diagram/src/test/java/org/apache/camel/diagram/RouteDiagramTest.java +++ b/components/camel-diagram/src/test/java/org/apache/camel/diagram/RouteDiagramTest.java @@ -806,6 +806,46 @@ void testNodeTextPaddingScalesWithNodeWidth() { "Text padding should increase with wider nodes"); } + @Test + void testExtractSourceNameWithScheme() { + assertEquals("my-route.yaml", RouteDiagramHelper.extractSourceName("file:/path/to/my-route.yaml")); + } + + @Test + void testExtractSourceNameClasspath() { + assertEquals("my-route.yaml", RouteDiagramHelper.extractSourceName("classpath:my-route.yaml")); + } + + @Test + void testExtractSourceNameWithLineNumber() { + assertEquals("cheese.java:9", RouteDiagramHelper.extractSourceName("cheese.java:9")); + } + + @Test + void testExtractSourceNameSchemeAndLineNumber() { + assertEquals("cheese.java:9", RouteDiagramHelper.extractSourceName("file:/path/to/cheese.java:9")); + } + + @Test + void testExtractSourceNamePlainFilename() { + assertEquals("my-route.yaml", RouteDiagramHelper.extractSourceName("my-route.yaml")); + } + + @Test + void testExtractSourceNameWindowsPath() { + assertEquals("route.yaml", RouteDiagramHelper.extractSourceName("C:\\Users\\test\\route.yaml")); + } + + @Test + void testExtractSourceNameNull() { + assertNull(RouteDiagramHelper.extractSourceName(null)); + } + + @Test + void testExtractSourceNameBlank() { + assertNull(RouteDiagramHelper.extractSourceName("")); + } + private static NodeInfo node(String type, String code, int level) { return node(type, code, level, null); }