From 680ecac84a19333182e75c6b32a836590c8950fe Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 16 Sep 2009 19:52:24 +0400 Subject: [PATCH] Endorsed Standards Override support for JDKs (IDEADEV-40400): 1. auto-discover libraries in "endorsed" folder on new jdk creation 2. auto-update jdk roots in correct sequence when new files are put into "endorsed" folder --- .../openapi/projectRoots/impl/JavaSdkImpl.java | 15 +++++-- .../projectRoots/impl/ProjectJdkTableImpl.java | 47 ++++++++++++++++++---- 2 files changed, 50 insertions(+), 12 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 944fa7a0ab..f8f96cbd2b 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 @@ -24,8 +24,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; import java.io.FileFilter; -import java.util.ArrayList; -import java.util.Map; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -171,9 +170,15 @@ public class JavaSdkImpl extends JavaSdk { VirtualFile docs = findDocs(jdkHome, "docs/api"); final SdkModificator sdkModificator = sdk.getSdkModificator(); + final Set previousRoots = new LinkedHashSet(Arrays.asList(sdkModificator.getRoots(OrderRootType.CLASSES))); + sdkModificator.removeRoots(OrderRootType.CLASSES); + previousRoots.removeAll(new HashSet(Arrays.asList(classes))); for (VirtualFile aClass : classes) { sdkModificator.addRoot(aClass, OrderRootType.CLASSES); } + for (VirtualFile root : previousRoots) { + sdkModificator.addRoot(root, OrderRootType.CLASSES); + } if(sources != null){ sdkModificator.addRoot(sources, OrderRootType.SOURCES); } @@ -316,13 +321,15 @@ public class JavaSdkImpl extends JavaSdk { File libFile = new File(file, "lib"); @NonNls File classesFile = new File(file, "../Classes"); @NonNls File libExtFile = new File(libFile, "ext"); - jarDirs = new File[]{libFile, classesFile, libExtFile}; + @NonNls File libEndorsedFile = new File(libFile, "endorsed"); + jarDirs = new File[]{libEndorsedFile, libFile, classesFile, libExtFile}; } else{ @NonNls final String jre = "jre"; File jreLibFile = isJre ? new File(file, "lib") : new File(new File(file, jre), "lib"); @NonNls File jreLibExtFile = new File(jreLibFile, "ext"); - jarDirs = new File[]{jreLibFile, jreLibExtFile}; + @NonNls File jreLibEndorsedFile = new File(jreLibFile, "endorsed"); + jarDirs = new File[]{jreLibEndorsedFile, jreLibFile, jreLibExtFile}; } ArrayList childrenList = new ArrayList(); diff --git a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java index 470ac77807..2ce02077c3 100644 --- a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java @@ -4,13 +4,16 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.ProjectBundle; +import com.intellij.openapi.projectRoots.JavaSdkType; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.vfs.*; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.impl.MessageListenerList; import org.jdom.Element; @@ -36,7 +39,7 @@ import java.util.Map; public class ProjectJdkTableImpl extends ProjectJdkTable implements PersistentStateComponent, ExportableComponent { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.projectRoots.impl.ProjectJdkTableImpl"); - private final ArrayList myJdks = new ArrayList(); + private final List mySdks = new ArrayList(); private final MessageListenerList myListenerList; @@ -48,6 +51,34 @@ public class ProjectJdkTableImpl extends ProjectJdkTable implements PersistentSt public ProjectJdkTableImpl() { myMessageBus = ApplicationManager.getApplication().getMessageBus(); myListenerList = new MessageListenerList(myMessageBus, JDK_TABLE_TOPIC); + // support external changes to jdk libraries (Endorsed Standards Override) + VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileAdapter() { + public void fileCreated(VirtualFileEvent event) { + updateJdks(event.getFile()); + } + + private void updateJdks(VirtualFile file) { + if (file.isDirectory() || !StdFileTypes.ARCHIVE.equals(file.getFileType())) { + // consider only archive files that may contain libraries + return; + } + for (Sdk sdk : mySdks) { + final SdkType sdkType = sdk.getSdkType(); + if (!(sdkType instanceof JavaSdkType)) { + continue; + } + final VirtualFile home = sdk.getHomeDirectory(); + if (home == null) { + continue; + } + if (VfsUtil.isAncestor(home, file, true)) { + sdkType.setupSdkPaths(sdk); + // no need to iterate further assuming the file cannot be under the home of several SDKs + break; + } + } + } + }); } @NotNull @@ -62,7 +93,7 @@ public class ProjectJdkTableImpl extends ProjectJdkTable implements PersistentSt @Nullable public Sdk findJdk(String name) { - for (Sdk jdk : myJdks) { + for (Sdk jdk : mySdks) { if (Comparing.strEqual(name, jdk.getName())) { return jdk; } @@ -106,7 +137,7 @@ public class ProjectJdkTableImpl extends ProjectJdkTable implements PersistentSt } public Sdk[] getAllJdks() { - return myJdks.toArray(new Sdk[myJdks.size()]); + return mySdks.toArray(new Sdk[mySdks.size()]); } public List getSdksOfType(final SdkType type) { @@ -122,14 +153,14 @@ public class ProjectJdkTableImpl extends ProjectJdkTable implements PersistentSt public void addJdk(Sdk jdk) { ApplicationManager.getApplication().assertWriteAccessAllowed(); - myJdks.add(jdk); + mySdks.add(jdk); myMessageBus.syncPublisher(JDK_TABLE_TOPIC).jdkAdded(jdk); } public void removeJdk(Sdk jdk) { ApplicationManager.getApplication().assertWriteAccessAllowed(); myMessageBus.syncPublisher(JDK_TABLE_TOPIC).jdkRemoved(jdk); - myJdks.remove(jdk); + mySdks.remove(jdk); } public void updateJdk(Sdk originalJdk, Sdk modifiedJdk) { @@ -161,7 +192,7 @@ public class ProjectJdkTableImpl extends ProjectJdkTable implements PersistentSt } public void loadState(Element element) { - myJdks.clear(); + mySdks.clear(); final List children = element.getChildren(ELEMENT_JDK); for (final Object aChildren : children) { @@ -173,13 +204,13 @@ public class ProjectJdkTableImpl extends ProjectJdkTable implements PersistentSt catch (InvalidDataException ex) { LOG.error(ex); } - myJdks.add(jdk); + mySdks.add(jdk); } } public Element getState() { Element element = new Element("ProjectJdkTableImpl"); - for (Sdk jdk : myJdks) { + for (Sdk jdk : mySdks) { final Element e = new Element(ELEMENT_JDK); try { ((ProjectJdkImpl)jdk).writeExternal(e); -- 2.11.4.GIT