From f68c716bf5752484be0b0dbb27ffab8a76cc2169 Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Fri, 12 Apr 2024 16:04:16 +0200 Subject: [PATCH] Make TerminalOutput.pathToMaven() more robust to avoid #929 --- .../mvnd/common/logging/TerminalOutput.java | 71 +++++++++++-------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/common/src/main/java/org/mvndaemon/mvnd/common/logging/TerminalOutput.java b/common/src/main/java/org/mvndaemon/mvnd/common/logging/TerminalOutput.java index 72fa82e43..a5bf42b78 100644 --- a/common/src/main/java/org/mvndaemon/mvnd/common/logging/TerminalOutput.java +++ b/common/src/main/java/org/mvndaemon/mvnd/common/logging/TerminalOutput.java @@ -714,37 +714,50 @@ private AttributedString formatTransfers(String projectId) { public static String pathToMaven(String location) { String[] p = location.split("/"); - if (p.length >= 4 && p[p.length - 1].startsWith(p[p.length - 3] + "-" + p[p.length - 2])) { - String artifactId = p[p.length - 3]; - String version = p[p.length - 2]; - String classifier; - String type; - String artifactIdVersion = artifactId + "-" + version; - StringBuilder sb = new StringBuilder(); - if (p[p.length - 1].charAt(artifactIdVersion.length()) == '-') { - classifier = - p[p.length - 1].substring(artifactIdVersion.length() + 1, p[p.length - 1].lastIndexOf('.')); - } else { - classifier = null; - } - type = p[p.length - 1].substring(p[p.length - 1].lastIndexOf('.') + 1); - for (int j = 0; j < p.length - 3; j++) { - if (j > 0) { - sb.append('.'); - } - sb.append(p[j]); - } - sb.append(':').append(artifactId).append(':').append(version); - if (!"jar".equals(type) || classifier != null) { - sb.append(':'); - if (!"jar".equals(type)) { - sb.append(type); - } - if (classifier != null) { - sb.append(':').append(classifier); + if (p.length >= 4) { + final String artifactId = p[p.length - 3]; + final String version = p[p.length - 2]; + final String fileName = p[p.length - 1]; + final int artifactIdVersionLength = artifactId.length() + 1 /* the dash */ + version.length(); + if (fileName.length() > artifactIdVersionLength) { + /* We use fileName.length() > to avoid https://github.com/apache/maven-mvnd/issues/929 + * In the code below, we assume that the fileName ends either with `.` + * or `-.` */ + final int lastPeriodPos = fileName.lastIndexOf('.'); + if (lastPeriodPos >= 0) { + final String classifier; + final String type; + final StringBuilder sb = new StringBuilder(); + try { + if (fileName.charAt(artifactIdVersionLength) == '-') { + classifier = fileName.substring(artifactIdVersionLength + 1, lastPeriodPos); + } else { + classifier = null; + } + } catch (Exception e) { + throw new RuntimeException( + "Could not transform path '" + location + "' to Maven coordinates ", e); + } + type = fileName.substring(lastPeriodPos + 1); + for (int j = 0; j < p.length - 3; j++) { + if (j > 0) { + sb.append('.'); + } + sb.append(p[j]); + } + sb.append(':').append(artifactId).append(':').append(version); + if (!"jar".equals(type) || classifier != null) { + sb.append(':'); + if (!"jar".equals(type)) { + sb.append(type); + } + if (classifier != null) { + sb.append(':').append(classifier); + } + } + return sb.toString(); } } - return sb.toString(); } return location; }