From 992185430117426719be1ba28af9143a219861d5 Mon Sep 17 00:00:00 2001 From: Maas van den Berg Date: Mon, 16 Nov 2009 20:58:42 +0300 Subject: [PATCH] IDEADEV-41386: When configuring Java SDK, resolve symbolic links and remove duplicate entries. --- .../openapi/projectRoots/impl/JavaSdkImpl.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java index a4527887c4b5..f44bd5635196 100644 --- a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java +++ b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java @@ -32,6 +32,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; import java.io.FileFilter; +import java.io.IOException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -340,18 +341,25 @@ public class JavaSdkImpl extends JavaSdk { jarDirs = new File[]{jreLibEndorsedFile, jreLibFile, jreLibExtFile}; } - ArrayList childrenList = new ArrayList(); + Set childrenSet = new LinkedHashSet(); for (File jarDir : jarDirs) { if (jarDir != null && jarDir.isDirectory()) { - File[] files = jarDir.listFiles(jarFileFilter); - for (File file1 : files) { - childrenList.add(file1); + File[] jarFiles = jarDir.listFiles(jarFileFilter); + for (File jarFile : jarFiles) { + try { + // File.getCanonicalFile() allows us to filter out duplicate (symbolically linked) jar files, + // commonly found in osx JDK distributions + childrenSet.add(jarFile.getCanonicalFile()); + } + catch (IOException e) { + // Symbolic links may fail to resolve. Just skip those jars as we won't be able to find virtual file in this case anyway. + } } } } ArrayList result = new ArrayList(); - for (File child : childrenList) { + for (File child : childrenSet) { String url = JarFileSystem.PROTOCOL_PREFIX + child.getAbsolutePath().replace(File.separatorChar, '/') + JarFileSystem.JAR_SEPARATOR; VirtualFile vFile = VirtualFileManager.getInstance().findFileByUrl(url); if (vFile != null) {