diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index 2bf2eaf0dd4b..2da159165c07 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -801,6 +801,22 @@ public class StringUtil extends StringUtilRt { return testee.startsWith(firstPrefix) && testee.regionMatches(l1, secondPrefix, 0, l2); } + /** + * Equivalent to testee.startsWith(firstPrefix + secondPrefix + thirdPrefix) but avoids creating an object for concatenation. + */ + public static boolean startsWithConcatenationOf(@NotNull String testee, + @NotNull String firstPrefix, + @NotNull String secondPrefix, + @NotNull String thirdPrefix) { + int l1 = firstPrefix.length(); + int l2 = secondPrefix.length(); + int l3 = thirdPrefix.length(); + if (testee.length() < l1 + l2 + l3) return false; + return testee.startsWith(firstPrefix) + && testee.regionMatches(l1, secondPrefix, 0, l2) + && testee.regionMatches(l1 + l2, thirdPrefix, 0, l3); + } + @NotNull public static String trimEnd(@NotNull String s, @NonNls @NotNull String suffix) { if (s.endsWith(suffix)) { diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenArtifact.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenArtifact.java index 829a8ffcb352..75ad374423de 100644 --- a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenArtifact.java +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenArtifact.java @@ -140,9 +140,9 @@ public class MavenArtifact implements Serializable { return getRelativePathForExtraArtifact(null, null); } - public String getFileNameWithBaseVersion() { + public String getFileNameWithBaseVersion(@Nullable String extraArtifactClassifier, @Nullable String customExtension) { StringBuilder res = new StringBuilder(); - appendFileName(res, null, null); + appendFileName(res, extraArtifactClassifier, customExtension); return res.toString(); } @@ -166,7 +166,7 @@ public class MavenArtifact implements Serializable { result.append('/'); result.append(myArtifactId); result.append('/'); - result.append(myVersion); + result.append(myBaseVersion); result.append('/'); appendFileName(result, extraArtifactClassifier, customExtension); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java index 27c8f5cad1fb..6aaf850d5d28 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java @@ -334,8 +334,17 @@ public class MavenRootModelAdapter { library.addRoot(newUrl, type); } - private static boolean isRepositoryUrl(MavenArtifact artifact, String url, String classifier, String extension) { - return url.endsWith(artifact.getRelativePathForExtraArtifact(classifier, extension) + JarFileSystem.JAR_SEPARATOR); + private static boolean isRepositoryUrl(MavenArtifact artifact, String url, @Nullable String classifier, @Nullable String extension) { + if (!url.contains(artifact.getGroupId() + '/' + artifact.getArtifactId() + '/' + artifact.getBaseVersion() + '/' + artifact.getArtifactId() + '-')) { + return false; + } + + String fileName = artifact.getFileNameWithBaseVersion(classifier, extension); + assert StringUtil.startsWithConcatenationOf(fileName, artifact.getArtifactId(), "-", artifact.getVersion()); + + String suffix = fileName.substring(artifact.getArtifactId().length() + 1 + artifact.getVersion().length()); + + return StringUtil.trimEnd(url, "!/").endsWith(suffix); } public static boolean isChangedByUser(Library library) {