InstaledPackagesPanel is filled with data through PackageManagementService

This commit is contained in:
Dmitry Jemerov
2013-05-03 21:25:55 +02:00
parent ea6fe7208c
commit 0766497643
4 changed files with 71 additions and 45 deletions
@@ -19,11 +19,6 @@ public class PyPackage extends InstalledPackage {
myRequirements = requirements;
}
@Override
public String toString() {
return getName();
}
@NotNull
public List<PyRequirement> getRequirements() {
return myRequirements;
@@ -37,4 +32,10 @@ public class PyPackage extends InstalledPackage {
public boolean isInstalled() {
return myLocation != null;
}
@Nullable
@Override
public String getTooltipText() {
return myLocation;
}
}
@@ -243,14 +243,19 @@ public class PyPIPackageUtil {
}
public Collection<String> getPackageNames() throws IOException {
Map<String, String> pyPIPackages = loadAndGetPackages();
ArrayList<String> list = Lists.newArrayList(pyPIPackages.keySet());
Collections.sort(list);
return list;
}
public Map<String, String> loadAndGetPackages() throws IOException {
Map<String, String> pyPIPackages = getPyPIPackages();
if (pyPIPackages.isEmpty()) {
updatePyPICache(PyPackageService.getInstance());
pyPIPackages = getPyPIPackages();
}
ArrayList<String> list = Lists.newArrayList(pyPIPackages.keySet());
Collections.sort(list);
return list;
return pyPIPackages;
}
public static Map<String, String> getPyPIPackages() {
@@ -150,7 +150,7 @@ public class InstalledPackagesPanel extends JPanel {
@Nullable String errorDescription) {
myNotificationArea.showResult(packageName, errorDescription);
myPackagesTable.clearSelection();
doUpdatePackages(mySelectedSdk);
doUpdatePackages(myPackageManagementService);
}
});
}
@@ -337,39 +337,40 @@ public class InstalledPackagesPanel extends JPanel {
myPackageManagementService = packageManagementService;
myPackagesTable.clearSelection();
myPackagesTableModel.getDataVector().clear();
doUpdatePackages(selectedSdk);
doUpdatePackages(packageManagementService);
}
public void doUpdatePackages(final Sdk selectedSdk) {
public void doUpdatePackages(final PackageManagementService packageManagementService) {
myPackagesTable.setPaintBusy(true);
final Application application = ApplicationManager.getApplication();
application.executeOnPooledThread(new Runnable() {
@Override
public void run() {
List<PyPackage> packages = Lists.newArrayList();
if (selectedSdk != null) {
Collection<InstalledPackage> packages = Lists.newArrayList();
if (packageManagementService != null) {
try {
packages = ((PyPackageManagerImpl)PyPackageManager.getInstance(selectedSdk)).getPackages();
packages = packageManagementService.getInstalledPackages();
}
catch (PyExternalProcessException e) {
catch (IOException e) {
// do nothing, we already have an empty list
}
finally {
final List<PyPackage> finalPackages = packages;
final Map<String, String> cache = PyPIPackageUtil.getPyPIPackages();
final Collection<InstalledPackage> finalPackages = packages;
final Map<String, RepoPackage> cache = buildNameToPackageMap(packageManagementService.getAllPackagesCached());
if (cache.isEmpty()) {
updateCache(application);
refreshLatestVersions();
}
application.invokeLater(new Runnable() {
@Override
public void run() {
if (selectedSdk == mySelectedSdk) {
if (packageManagementService == myPackageManagementService) {
myPackagesTableModel.getDataVector().clear();
for (PyPackage pyPackage : finalPackages) {
final String version = cache.get(pyPackage.getName());
for (InstalledPackage pkg : finalPackages) {
RepoPackage repoPackage = cache.get(pkg.getName());
final String version = repoPackage != null ? repoPackage.getLatestVersion() : null;
myPackagesTableModel
.addRow(new Object[]{pyPackage, pyPackage.getVersion(), version == null ? "" : version});
.addRow(new Object[]{pkg, pkg.getVersion(), version == null ? "" : version});
}
if (!cache.isEmpty()) {
myPackagesTable.setPaintBusy(false);
@@ -383,20 +384,21 @@ public class InstalledPackagesPanel extends JPanel {
});
}
private void updateCache(final Application application) {
private void refreshLatestVersions() {
final Application application = ApplicationManager.getApplication();
application.executeOnPooledThread(new Runnable() {
@Override
public void run() {
try {
PyPIPackageUtil.INSTANCE.updatePyPICache(PyPackageService.getInstance());
List<RepoPackage> packages = myPackageManagementService.reloadAllPackages();
final Map<String, RepoPackage> packageMap = buildNameToPackageMap(packages);
application.invokeLater(new Runnable() {
@Override
public void run() {
final Map<String, String> cache = PyPIPackageUtil.getPyPIPackages();
for (int i = 0; i != myPackagesTableModel.getRowCount(); ++i) {
final PyPackage pyPackage = (PyPackage)myPackagesTableModel.getValueAt(i, 0);
final String version = cache.get(pyPackage.getName());
myPackagesTableModel.setValueAt(version, i, 2);
final InstalledPackage pyPackage = (PyPackage)myPackagesTableModel.getValueAt(i, 0);
final RepoPackage repoPackage = packageMap.get(pyPackage.getName());
myPackagesTableModel.setValueAt(repoPackage == null ? null : repoPackage.getLatestVersion(), i, 2);
}
myPackagesTable.setPaintBusy(false);
}
@@ -409,6 +411,14 @@ public class InstalledPackagesPanel extends JPanel {
});
}
private static Map<String, RepoPackage> buildNameToPackageMap(List<RepoPackage> packages) {
final Map<String, RepoPackage> packageMap = new HashMap<String, RepoPackage>();
for (RepoPackage aPackage : packages) {
packageMap.put(aPackage.getName(), aPackage);
}
return packageMap;
}
private static class MyTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected,
@@ -54,23 +54,41 @@ public class PyPackageManagementService extends PackageManagementService {
@Override
public List<RepoPackage> getAllPackages() throws IOException {
List<RepoPackage> packages = new ArrayList<RepoPackage>();
final Collection<String> packageNames;
final Map<String, String> packageToVersionMap;
try {
packageNames = PyPIPackageUtil.INSTANCE.getPackageNames();
packageToVersionMap = PyPIPackageUtil.INSTANCE.loadAndGetPackages();
}
catch (IOException e) {
throw new IOException("Could not reach URL " + e.getMessage() + ". Please, check your internet connection.");
}
final boolean customRepoConfigured = !PyPackageService.getInstance().additionalRepositories.isEmpty();
String url = customRepoConfigured? PyPIPackageUtil.PYPI_URL : "";
for (String name : packageNames) {
packages.add(new RepoPackage(name, url));
}
List<RepoPackage> packages = versionMapToPackageList(packageToVersionMap);
packages.addAll(PyPIPackageUtil.INSTANCE.getAdditionalPackageNames());
return packages;
}
private static List<RepoPackage> versionMapToPackageList(Map<String, String> packageToVersionMap) {
final boolean customRepoConfigured = !PyPackageService.getInstance().additionalRepositories.isEmpty();
String url = customRepoConfigured? PyPIPackageUtil.PYPI_URL : "";
List<RepoPackage> packages = new ArrayList<RepoPackage>();
for (Map.Entry<String, String> entry : packageToVersionMap.entrySet()) {
packages.add(new RepoPackage(entry.getKey(), url, entry.getValue()));
}
return packages;
}
@Override
public List<RepoPackage> reloadAllPackages() throws IOException {
final PyPackageService service = PyPackageService.getInstance();
PyPIPackageUtil.INSTANCE.updatePyPICache(service);
service.LAST_TIME_CHECKED = System.currentTimeMillis();
return getAllPackages();
}
@Override
public List<RepoPackage> getAllPackagesCached() {
return versionMapToPackageList(PyPIPackageUtil.getPyPIPackages());
}
@Override
public boolean canInstallToUser() {
return !PythonSdkType.isVirtualEnv(mySdk);
@@ -94,14 +112,6 @@ public class PyPackageManagementService extends PackageManagementService {
PyPackageService.getInstance().addSdkToUserSite(mySdk.getHomePath(), newValue);
}
@Override
public List<RepoPackage> reloadAllPackages() throws IOException {
final PyPackageService service = PyPackageService.getInstance();
PyPIPackageUtil.INSTANCE.updatePyPICache(service);
service.LAST_TIME_CHECKED = System.currentTimeMillis();
return getAllPackages();
}
@Override
public Collection<InstalledPackage> getInstalledPackages() throws IOException {
List<PyPackage> packages;