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);