469663: Missing update site causes NPE in feature computation
- added some guards
Bug: 469663
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=469663
diff --git a/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/catalog/MarketplaceCatalog.java b/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/catalog/MarketplaceCatalog.java
index a99bf50..7c720a1 100644
--- a/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/catalog/MarketplaceCatalog.java
+++ b/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/catalog/MarketplaceCatalog.java
@@ -246,7 +246,9 @@
.getService(IMetadataRepositoryManager.SERVICE_NAME);
try {
for (MarketplaceNodeCatalogItem item : catalogItemsThisSite) {
- item.setAvailable(null);
+ if (Boolean.TRUE.equals(item.getAvailable())) {
+ item.setAvailable(null);
+ }
}
IMetadataRepository repository = manager.loadRepository(uri, pm);
IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery( //
@@ -271,6 +273,9 @@
String key = createRepositoryIuKey(uri.toString(), iuItem.getId());
Version availableVersion = repositoryIuVersionById.get(key);
MarketplaceCatalog.this.repositoryIuVersionById.put(key, availableVersion);
+ if (availableVersion != null) {
+ item.setAvailable(true);
+ }
}
}
for (MarketplaceNodeCatalogItem item : catalogItemsThisSite) {
diff --git a/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/operations/AbstractProvisioningOperation.java b/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/operations/AbstractProvisioningOperation.java
index d0af8dd..1a091ad 100644
--- a/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/operations/AbstractProvisioningOperation.java
+++ b/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/operations/AbstractProvisioningOperation.java
@@ -57,7 +57,7 @@
}
protected List<IMetadataRepository> addRepositories(SubMonitor monitor) throws
- URISyntaxException, ProvisionException {
+ URISyntaxException, ProvisionException {
// tell p2 that it's okay to use these repositories
ProvisioningSession session = ProvisioningUI.getDefaultUI().getSession();
RepositoryTracker repositoryTracker = ProvisioningUI.getDefaultUI().getRepositoryTracker();
@@ -70,11 +70,14 @@
monitor.setWorkRemaining(items.size() * 5);
for (CatalogItem descriptor : items) {
- URI uri = URLUtil.toURI(descriptor.getSiteUrl());
- if (repositoryLocations.add(uri) && !knownRepositories.contains(uri)) {
- checkCancelled(monitor);
- repositoryTracker.addRepository(uri, null, session);
- addedRepositoryLocations.add(uri);
+ String siteUrl = descriptor.getSiteUrl();
+ if (siteUrl != null) {
+ URI uri = URLUtil.toURI(siteUrl);
+ if (repositoryLocations.add(uri) && !knownRepositories.contains(uri)) {
+ checkCancelled(monitor);
+ repositoryTracker.addRepository(uri, null, session);
+ addedRepositoryLocations.add(uri);
+ }
}
monitor.worked(1);
}
@@ -124,7 +127,8 @@
final Set<String> installableUnitIdsThisRepository = new HashSet<String>();
// determine all installable units for this repository
for (CatalogItem descriptor : items) {
- if (repository.getLocation().equals(URLUtil.toURI(descriptor.getSiteUrl()))) {
+ if (descriptor.getSiteUrl() != null
+ && repository.getLocation().equals(URLUtil.toURI(descriptor.getSiteUrl()))) {
installableUnitIdsThisRepository.addAll(getFeatureIds(descriptor));
}
}
@@ -161,7 +165,7 @@
/**
* remove the given repository locations from the repository tracker.
- *
+ *
* @param repositoryLocations
*/
public static void removeRepositoryLocations(Set<URI> repositoryLocations) {
diff --git a/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/wizards/DiscoveryItem.java b/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/wizards/DiscoveryItem.java
index 5320d53..85de795 100644
--- a/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/wizards/DiscoveryItem.java
+++ b/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/wizards/DiscoveryItem.java
@@ -17,6 +17,7 @@
import java.text.MessageFormat;
import org.eclipse.epp.internal.mpc.core.util.TextUtil;
+import org.eclipse.epp.internal.mpc.core.util.URLUtil;
import org.eclipse.epp.internal.mpc.ui.MarketplaceClientUi;
import org.eclipse.epp.internal.mpc.ui.MarketplaceClientUiPlugin;
import org.eclipse.epp.internal.mpc.ui.catalog.MarketplaceCatalogSource;
@@ -680,7 +681,15 @@
}
private boolean hasInstallMetadata() {
- return !connector.getInstallableUnits().isEmpty() && connector.getSiteUrl() != null;
+ if (!connector.getInstallableUnits().isEmpty() && connector.getSiteUrl() != null) {
+ try {
+ URLUtil.toURI(connector.getSiteUrl());
+ return true;
+ } catch (Exception ex) {
+ //ignore
+ }
+ }
+ return false;
}
protected void createProviderLabel(Composite parent) {
diff --git a/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/wizards/MarketplaceWizard.java b/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/wizards/MarketplaceWizard.java
index 81cc1e3..cbfb387 100644
--- a/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/wizards/MarketplaceWizard.java
+++ b/org.eclipse.epp.mpc.ui/src/org/eclipse/epp/internal/mpc/ui/wizards/MarketplaceWizard.java
@@ -277,7 +277,8 @@
final List<CatalogItem> noninstallableItems = new ArrayList<CatalogItem>();
for (Entry<CatalogItem, Operation> entry : itemToSelectedOperation) {
if (entry.getValue() != Operation.NONE) {
- boolean unavailableInstall = Boolean.FALSE.equals(entry.getKey().getAvailable())
+ boolean unavailableInstall = (Boolean.FALSE.equals(entry.getKey().getAvailable()) || entry.getKey()
+ .getSiteUrl() == null)
&& (entry.getValue() == Operation.INSTALL || entry.getValue() == Operation.UPDATE);
if (unavailableInstall) {
getSelectionModel().select(entry.getKey(), Operation.NONE);