Fix duplicate urls in library definition after library update. For repository libraries also invalid urls are removed on synchronization (affects IDEA-173130)

This commit is contained in:
Eugene Zhuravlev
2017-05-23 20:36:08 +02:00
parent 0f0f5361ac
commit 5019f1b0cd
2 changed files with 42 additions and 14 deletions
@@ -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<OrderRootType> 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<OrderRootType, String[]> getUrls,
final BiFunction<String, OrderRootType, Boolean> isValid,
final BiConsumer<String, OrderRootType> removeRoot,
final BiConsumer<String, OrderRootType> addRoot,
final TriConsumer<String, Boolean, OrderRootType> 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<OrderRootType, String[]> getUrls, BiFunction<String, OrderRootType, Boolean> isValid, BiConsumer<String, OrderRootType> removeRoot) {
for (String url : getUrls.apply(rootType)) {
if (!myKeepInvalidUrls || isValid.apply(url, rootType)) {
removeRoot.accept(url, rootType);
}
}
}
@FunctionalInterface
private interface TriConsumer<T, U, P> {
void accept(T t, U u, P p);
}
}
@@ -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();