download from the same repositories on both initial configuration stage and synchronization stage

This commit is contained in:
Eugene Zhuravlev
2017-04-13 20:11:32 +03:00
parent 28eb457cc2
commit ec6ed69d29
11 changed files with 58 additions and 99 deletions
@@ -42,7 +42,6 @@ import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.PairProcessor;
import com.intellij.util.Processor;
import com.intellij.util.concurrency.SequentialTaskExecutor;
import gnu.trove.THashMap;
@@ -67,7 +66,6 @@ import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -96,13 +94,14 @@ public class JarRepositoryManager {
return null;
}
final List<RemoteRepositoryDescription> repositories = dialog.getRepositories();
final String coord = dialog.getCoordinateText();
final boolean attachSources = dialog.getAttachSources();
final boolean attachJavaDoc = dialog.getAttachJavaDoc();
final String copyTo = dialog.getDirectoryPath();
final NewLibraryConfiguration config = resolveAndDownload(project, coord, attachSources, attachJavaDoc, copyTo, repositories);
final NewLibraryConfiguration config = resolveAndDownload(
project, coord, attachSources, attachJavaDoc, copyTo, RemoteRepositoryDescription.DEFAULT_REPOSITORIES
);
if (config == null) {
Messages.showErrorDialog(parentComponent, "No files were downloaded for " + coord, CommonBundle.getErrorTitle());
}
@@ -277,7 +276,7 @@ public class JarRepositoryManager {
Notifications.Bus.notify(new Notification("Repository", title, sb.toString(), NotificationType.INFORMATION), project);
}
public static void searchArtifacts(final Project project, String coord, final PairProcessor<Collection<Pair<RepositoryArtifactDescription, RemoteRepositoryDescription>>, Boolean> resultProcessor) {
public static void searchArtifacts(final Project project, String coord, final Consumer<Collection<Pair<RepositoryArtifactDescription, RemoteRepositoryDescription>>> resultProcessor) {
if (coord == null || coord.length() == 0) {
return;
}
@@ -291,30 +290,18 @@ public class JarRepositoryManager {
ProgressManager.getInstance().run(new Task.Backgroundable(project, "Maven", false) {
public void run(@NotNull ProgressIndicator indicator) {
String[] urls = MavenRepositoryServicesManager.getServiceUrls();
boolean tooManyResults = false;
final AtomicBoolean proceedFlag = new AtomicBoolean(true);
for (int i = 0, length = urls.length; i < length; i++) {
if (!proceedFlag.get()) break;
final List<Pair<RepositoryArtifactDescription, RemoteRepositoryDescription>> resultList = new ArrayList<>();
try {
String serviceUrl = urls[i];
final List<RepositoryArtifactDescription> artifacts = MavenRepositoryServicesManager.findArtifacts(template, serviceUrl);
if (!artifacts.isEmpty()) {
if (!proceedFlag.get()) {
break;
}
final List<RemoteRepositoryDescription> repositories = MavenRepositoryServicesManager.getRepositories(serviceUrl);
Map<String, RemoteRepositoryDescription> map = new THashMap<>();
for (RemoteRepositoryDescription repository : repositories) {
map.put(repository.getId(), repository);
}
for (RepositoryArtifactDescription artifact : artifacts) {
if (artifact == null) {
tooManyResults = true;
final List<Pair<RepositoryArtifactDescription, RemoteRepositoryDescription>> resultList = new ArrayList<>();
try {
for (String serviceUrl : MavenRepositoryServicesManager.getServiceUrls()) {
try {
final List<RepositoryArtifactDescription> artifacts = MavenRepositoryServicesManager.findArtifacts(template, serviceUrl);
if (!artifacts.isEmpty()) {
final List<RemoteRepositoryDescription> repositories = MavenRepositoryServicesManager.getRepositories(serviceUrl);
final Map<String, RemoteRepositoryDescription> map = new THashMap<>();
for (RemoteRepositoryDescription repository : repositories) {
map.put(repository.getId(), repository);
}
else {
for (RepositoryArtifactDescription artifact : artifacts) {
final RemoteRepositoryDescription repository = map.get(artifact.getRepositoryId());
// if the artifact is provided by an unsupported repository just skip it
// because it won't be resolved anyway
@@ -324,38 +311,32 @@ public class JarRepositoryManager {
}
}
}
}
catch (Exception e) {
LOG.error(e);
}
finally {
if (!proceedFlag.get()) {
break;
catch (Exception e) {
LOG.error(e);
}
final Boolean aBoolean = i == length - 1 ? tooManyResults : null;
ApplicationManager.getApplication().invokeLater(
() -> proceedFlag.set(resultProcessor.process(resultList, aBoolean)), o -> !proceedFlag.get()
);
}
}
finally {
ApplicationManager.getApplication().invokeLater(() -> resultProcessor.accept(resultList));
}
}
});
}
public static void searchRepositories(final Project project, final Collection<String> nexusUrls, final Processor<Collection<RemoteRepositoryDescription>> resultProcessor) {
public static void searchRepositories(final Project project, final Collection<String> serviceUrls, final Processor<Collection<RemoteRepositoryDescription>> resultProcessor) {
ProgressManager.getInstance().run(new Task.Backgroundable(project, "Maven", false) {
public void run(@NotNull ProgressIndicator indicator) {
final Ref<List<RemoteRepositoryDescription>> result = Ref.create(Collections.<RemoteRepositoryDescription>emptyList());
try {
final ArrayList<RemoteRepositoryDescription> repoList = new ArrayList<>();
for (String nexusUrl : nexusUrls) {
for (String url : serviceUrls) {
final List<RemoteRepositoryDescription> repositories;
try {
repositories = MavenRepositoryServicesManager.getRepositories(nexusUrl);
repositories = MavenRepositoryServicesManager.getRepositories(url);
}
catch (Exception ex) {
LOG.warn("Accessing Service at: " + nexusUrl, ex);
LOG.warn("Accessing Service at: " + url, ex);
continue;
}
repoList.addAll(repositories);
@@ -16,7 +16,7 @@
package com.intellij.jarRepository;
import com.intellij.codeInspection.IntentionAndQuickFixAction;
import com.intellij.jarRepository.propertiesEditor.RepositoryLibraryPropertiesDialog;
import com.intellij.jarRepository.settings.RepositoryLibraryPropertiesDialog;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.module.Module;
@@ -27,7 +27,6 @@ import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
@@ -56,8 +55,10 @@ import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class RepositoryAttachDialog extends DialogWrapper {
@NonNls private static final String PROPERTY_DOWNLOAD_TO_PATH = "Downloaded.Files.Path";
@@ -79,8 +80,7 @@ public class RepositoryAttachDialog extends DialogWrapper {
private final JComboBox myCombobox;
private final Map<String, Pair<RepositoryArtifactDescription, RemoteRepositoryDescription>> myCoordinates = ContainerUtil.newTroveMap();
private final Map<String, RemoteRepositoryDescription> myRepositories = new TreeMap<>();
private final Map<String, RepositoryArtifactDescription> myCoordinates = ContainerUtil.newTroveMap();
private final List<String> myShownItems = ContainerUtil.newArrayList();
private final String myDefaultDownloadFolder;
@@ -203,7 +203,9 @@ public class RepositoryAttachDialog extends DialogWrapper {
main:
for (String coordinate : myCoordinates.keySet()) {
for (String part : parts) {
if (!StringUtil.containsIgnoreCase(coordinate, part)) continue main;
if (!StringUtil.containsIgnoreCase(coordinate, part)) {
continue main;
}
}
myShownItems.add(coordinate);
}
@@ -267,41 +269,22 @@ public class RepositoryAttachDialog extends DialogWrapper {
private boolean performSearch() {
final String text = getCoordinateText();
if (StringUtil.isEmptyOrSpaces(text)) return false;
if (myCoordinates.containsKey(text)) return false;
if (myProgressIcon.isRunning()) return false;
if (myProgressIcon.isRunning() || StringUtil.isEmptyOrSpaces(text) || myCoordinates.containsKey(text)) {
return false;
}
myProgressIcon.resume();
JarRepositoryManager.searchArtifacts(myProject, text, (artifacts, tooMany) -> {
JarRepositoryManager.searchArtifacts(myProject, text, (pairs) -> {
if (myProgressIcon.isDisposed()) {
return false;
}
if (tooMany != null) {
myProgressIcon.suspend(); // finished
return;
}
myProgressIcon.suspend(); // finished
final int prevSize = myCoordinates.size();
for (Pair<RepositoryArtifactDescription, RemoteRepositoryDescription> each : artifacts) {
myCoordinates.put(each.first.getGroupId() + ":" + each.first.getArtifactId() + ":" + each.first.getVersion(), each);
String url = each.second != null? each.second.getUrl() : null;
if (StringUtil.isNotEmpty(url) && !myRepositories.containsKey(url)) {
myRepositories.put(url, each.second);
}
}
String title = getTitle();
String tooManyMessage = ": too many results found";
if (tooMany != null) {
boolean alreadyThere = title.endsWith(tooManyMessage);
if (tooMany.booleanValue() && !alreadyThere) {
setTitle(title + tooManyMessage);
}
else if (!tooMany.booleanValue() && alreadyThere) {
setTitle(title.substring(0, title.length() - tooManyMessage.length()));
}
for (Pair<RepositoryArtifactDescription, RemoteRepositoryDescription> pair : pairs) {
final RepositoryArtifactDescription artifact = pair.first;
myCoordinates.put(artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + artifact.getVersion(), artifact);
}
updateComboboxSelection(prevSize != myCoordinates.size());
// tooMany != null on last call, so enable OK action to let
// local maven repo a chance even if all remote services failed
setOKActionEnabled(!myRepositories.isEmpty() || tooMany != null);
return true;
setOKActionEnabled(true);
});
return true;
}
@@ -352,13 +335,6 @@ public class RepositoryAttachDialog extends DialogWrapper {
return RepositoryAttachDialog.class.getName();
}
@NotNull
public List<RemoteRepositoryDescription> getRepositories() {
final Pair<RepositoryArtifactDescription, RemoteRepositoryDescription> artifactAndRepo = myCoordinates.get(getCoordinateText());
final RemoteRepositoryDescription repository = artifactAndRepo == null ? null : artifactAndRepo.second;
return repository != null ? Collections.singletonList(repository) : ContainerUtil.findAll(myRepositories.values(), Condition.NOT_NULL);
}
private boolean isValidCoordinateSelected() {
final String text = getCoordinateText();
return text.split(":").length == 3;
@@ -16,7 +16,7 @@
package com.intellij.jarRepository;
import com.intellij.framework.addSupport.FrameworkSupportInModuleConfigurable;
import com.intellij.jarRepository.propertiesEditor.RepositoryLibraryPropertiesEditor;
import com.intellij.jarRepository.settings.RepositoryLibraryPropertiesEditor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModifiableModelsProvider;
@@ -15,7 +15,7 @@
*/
package com.intellij.jarRepository;
import com.intellij.jarRepository.propertiesEditor.RepositoryLibraryPropertiesDialog;
import com.intellij.jarRepository.settings.RepositoryLibraryPropertiesDialog;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.jarRepository.propertiesEditor;
package com.intellij.jarRepository.settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.jarRepository.propertiesEditor.RepositoryLibraryPropertiesEditor">
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.jarRepository.settings.RepositoryLibraryPropertiesEditor">
<grid id="27dc6" binding="mainPanel" layout-manager="GridLayoutManager" row-count="5" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.jarRepository.propertiesEditor;
package com.intellij.jarRepository.settings;
import com.google.common.base.Strings;
import com.intellij.jarRepository.JarRepositoryManager;
@@ -98,7 +98,7 @@ public class NexusRepositoryService extends MavenRepositoryService {
final SearchResults results = new Endpoint.DataIndex(url).getArtifactlistAsSearchResults(
name, template.getGroupId(), template.getArtifactId(), template.getVersion(), null, template.getClassNames()
);
boolean tooManyResults = results.isTooManyResults();
//boolean tooManyResults = results.isTooManyResults();
final SearchResults.Data data = results.getData();
final ArrayList<RepositoryArtifactDescription> result = new ArrayList<>();
if (data != null) {
@@ -108,9 +108,9 @@ public class NexusRepositoryService extends MavenRepositoryService {
}
}
}
if (tooManyResults) {
result.add(null);
}
//if (tooManyResults) {
// result.add(null);
//}
return result;
}
catch (UnmarshalException e) {
@@ -28,7 +28,7 @@ public class RemoteRepositoryDescription {
public static final RemoteRepositoryDescription MAVEN_CENTRAL = new RemoteRepositoryDescription(
"central",
"Maven Central repository",
"http://repo1.maven.org/maven2"
"https://repo1.maven.org/maven2"
);
public static final RemoteRepositoryDescription JBOSS_COMMUNITY = new RemoteRepositoryDescription(
"jboss.community",
@@ -77,14 +77,16 @@ public class RepositoryAttachHandler {
));
}
public static void searchArtifacts(final Project project, String coord, final PairProcessor<Collection<Pair<MavenArtifactInfo, MavenRepositoryInfo>>, Boolean> resultProcessor) {
JarRepositoryManager.searchArtifacts(project, coord, (pairs, aBoolean) -> resultProcessor.process(convert(pairs), aBoolean));
JarRepositoryManager.searchArtifacts(
project, coord, (pairs) -> resultProcessor.process(convert(pairs), Boolean.FALSE)
);
}
public static void searchRepositories(final Project project, final Collection<String> nexusUrls, final Processor<Collection<MavenRepositoryInfo>> resultProcessor) {
JarRepositoryManager.searchRepositories(project, nexusUrls, descriptions -> resultProcessor.process(
convertRepositoryList(descriptions)));
JarRepositoryManager.searchRepositories(
project, nexusUrls, descriptions -> resultProcessor.process(convertRepositoryList(descriptions))
);
}
public static MavenId getMavenId(@NotNull String coord) {