IDEADEV-41386: When configuring Java SDK, resolve symbolic links and remove duplicate entries.

This commit is contained in:
Maas van den Berg
2009-11-16 21:30:59 +03:00
committed by Maxim Shafirov
parent cbaf6caa8d
commit 9921854301
@@ -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<File> childrenList = new ArrayList<File>();
Set<File> childrenSet = new LinkedHashSet<File>();
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<VirtualFile> result = new ArrayList<VirtualFile>();
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) {