diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/NewLibraryEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/NewLibraryEditor.java index 36a26ed809a2..dc6507eab2e3 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/NewLibraryEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/NewLibraryEditor.java @@ -30,6 +30,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Function; /** * @author nik @@ -41,6 +44,7 @@ public class NewLibraryEditor extends LibraryEditorBase { private final JarDirectories myJarDirectories = new JarDirectories(); private LibraryType myType; private LibraryProperties myProperties; + private boolean myKeepInvalidUrls = true; public NewLibraryEditor() { this(null, null); @@ -53,6 +57,14 @@ public class NewLibraryEditor extends LibraryEditorBase { myExcludedRoots = new LinkedHashSet<>(); } + public boolean isKeepInvalidUrls() { + return myKeepInvalidUrls; + } + + public void setKeepInvalidUrls(boolean keepInvalidUrls) { + myKeepInvalidUrls = keepInvalidUrls; + } + @Override public Collection getOrderRootTypes() { return myRoots.keySet(); @@ -204,33 +216,48 @@ public class NewLibraryEditor extends LibraryEditorBase { public void applyTo(LibraryEx.ModifiableModelEx model) { model.setProperties(myProperties); + exportRoots(model::getUrls, model::isValid, model::removeRoot, model::addRoot, model::addJarDirectory); + } + + + public void applyTo(LibraryEditorBase editor) { + editor.setProperties(myProperties); + exportRoots(editor::getUrls, editor::isValid, editor::removeRoot, editor::addRoot, editor::addJarDirectory); + } + + private void exportRoots( + final Function getUrls, + final BiFunction isValid, + final BiConsumer removeRoot, + final BiConsumer addRoot, + final TriConsumer addJarDir) { + for (OrderRootType type : myRoots.keySet()) { + clearRoots(type, getUrls, isValid, removeRoot); for (LightFilePointer pointer : myRoots.get(type)) { if (!myJarDirectories.contains(type, pointer.getUrl())) { - model.addRoot(pointer.getUrl(), type); + addRoot.accept(pointer.getUrl(), type); } } } for (OrderRootType rootType : myJarDirectories.getRootTypes()) { + clearRoots(rootType, getUrls, isValid, removeRoot); for (String url : myJarDirectories.getDirectories(rootType)) { - model.addJarDirectory(url, myJarDirectories.isRecursive(rootType, url), rootType); + addJarDir.accept(url, myJarDirectories.isRecursive(rootType, url), rootType); } } } - public void applyTo(LibraryEditorBase editor) { - editor.setProperties(myProperties); - for (OrderRootType type : myRoots.keySet()) { - for (LightFilePointer pointer : myRoots.get(type)) { - if (!myJarDirectories.contains(type, pointer.getUrl())) { - editor.addRoot(pointer.getUrl(), type); - } - } - } - for (OrderRootType rootType : myJarDirectories.getRootTypes()) { - for (String url : myJarDirectories.getDirectories(rootType)) { - editor.addJarDirectory(url, myJarDirectories.isRecursive(rootType, url), rootType); + private void clearRoots(OrderRootType rootType, Function getUrls, BiFunction isValid, BiConsumer removeRoot) { + for (String url : getUrls.apply(rootType)) { + if (!myKeepInvalidUrls || isValid.apply(url, rootType)) { + removeRoot.accept(url, rootType); } } } + + @FunctionalInterface + private interface TriConsumer { + void accept(T t, U u, P p); + } } diff --git a/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/RepositoryUtils.java b/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/RepositoryUtils.java index 5085640d9877..85ede972ddf3 100644 --- a/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/RepositoryUtils.java +++ b/java/idea-ui/src/org/jetbrains/idea/maven/utils/library/RepositoryUtils.java @@ -131,6 +131,7 @@ public class RepositoryUtils { if (!library.isDisposed()) { WriteAction.run(() -> { final NewLibraryEditor editor = new NewLibraryEditor(null, properties); + editor.setKeepInvalidUrls(false); editor.removeAllRoots(); editor.addRoots(roots); final Library.ModifiableModel model = library.getModifiableModel();