Skip to content

Commit

Permalink
535039: Add self-update capabilities
Browse files Browse the repository at this point in the history
  • Loading branch information
creckord committed Jun 6, 2018
1 parent a24275d commit b9366df
Show file tree
Hide file tree
Showing 11 changed files with 495 additions and 102 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ public class MarketplaceClientUiPlugin extends AbstractUIPlugin {

public static final String ACTION_ICON_WARNING = "ACTION_ICON_WARNING"; //$NON-NLS-1$

public static final String ACTION_ICON_UPDATE = "ACTION_ICON_UPDATE"; //$NON-NLS-1$

public static final String FAVORITES_LIST_ICON = "FAVORITES_LIST_ICON"; //$NON-NLS-1$

public static final String ITEM_ICON_STAR = "ITEM_ICON_STAR"; //$NON-NLS-1$
Expand Down Expand Up @@ -199,6 +201,8 @@ protected ImageRegistry createImageRegistry() {
imageDescriptorFromPlugin(getBundle().getSymbolicName(), "icons/action-item-login.png")); //$NON-NLS-1$
imageRegistry.put(ACTION_ICON_WARNING,
imageDescriptorFromPlugin(getBundle().getSymbolicName(), "icons/action-item-warning.png")); //$NON-NLS-1$
imageRegistry.put(ACTION_ICON_UPDATE,
imageDescriptorFromPlugin(getBundle().getSymbolicName(), "icons/action-item-update.png")); //$NON-NLS-1$
imageRegistry.put(FAVORITES_LIST_ICON,
imageDescriptorFromPlugin(getBundle().getSymbolicName(), "icons/favorites-list.png")); //$NON-NLS-1$
return imageRegistry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,13 @@
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.epp.internal.mpc.core.MarketplaceClientCore;
import org.eclipse.epp.internal.mpc.ui.MarketplaceClientUi;
import org.eclipse.epp.internal.mpc.ui.catalog.MarketplaceCategory.Contents;
import org.eclipse.epp.internal.mpc.ui.util.ConcurrentTaskManager;
import org.eclipse.epp.mpc.core.model.ICategory;
import org.eclipse.epp.mpc.core.model.IMarket;
import org.eclipse.epp.mpc.core.model.INews;
import org.eclipse.epp.mpc.core.model.INode;
import org.eclipse.epp.mpc.core.model.ISearchResult;
import org.eclipse.equinox.internal.p2.discovery.AbstractDiscoveryStrategy;
import org.eclipse.equinox.internal.p2.discovery.Catalog;
import org.eclipse.equinox.internal.p2.discovery.DiscoveryCore;
Expand Down Expand Up @@ -65,6 +67,8 @@ public class MarketplaceCatalog extends Catalog {

private INews news;

private List<MarketplaceNodeCatalogItem> availableUpdates = new ArrayList<>();

private interface DiscoveryOperation {
public void run(MarketplaceDiscoveryStrategy strategy, IProgressMonitor monitor) throws CoreException;
}
Expand Down Expand Up @@ -138,7 +142,9 @@ public IStatus checkForUpdates(final IProgressMonitor monitor) {
try {
Map<String, IInstallableUnit> installedIUs = calculateInstalledIUs(progress.newChild(100000));
List<MarketplaceNodeCatalogItem> updateCheckNeeded = new ArrayList<>();
for (CatalogItem item : getItems()) {
List<CatalogItem> updateCheckItems = getUpdateCheckItems(progress.newChild(100000));
List<MarketplaceNodeCatalogItem> updateableItems = new ArrayList<MarketplaceNodeCatalogItem>();
for (CatalogItem item : updateCheckItems) {
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
Expand All @@ -149,19 +155,103 @@ public IStatus checkForUpdates(final IProgressMonitor monitor) {
if (catalogItem.isInstalled()) {
if (setUpdatesAvailable(installedIUs, catalogItem)) {
updateCheckNeeded.add(catalogItem);
} else if (Boolean.TRUE.equals(catalogItem.getUpdateAvailable())) {
updateableItems.add(catalogItem);
}
}
}
if (!updateCheckNeeded.isEmpty()) {
checkForUpdates(updateCheckNeeded, installedIUs, progress.newChild(10000000 - 100000));
checkForUpdates(updateCheckNeeded, installedIUs, progress.newChild(10000000 - 200000));
for (MarketplaceNodeCatalogItem catalogItem : updateCheckNeeded) {
if (Boolean.TRUE.equals(catalogItem.getUpdateAvailable())) {
updateableItems.add(catalogItem);
}
}
}

availableUpdates = updateableItems;

return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS;
} finally {
monitor.done();
}
}

private List<CatalogItem> getUpdateCheckItems(IProgressMonitor monitor) {
List<CatalogItem> updateCheckItems = getItems();

//add all locally installed items as well
boolean includeInstalled = false;
for (CatalogCategory category : getCategories()) {
if (category instanceof MarketplaceCategory) {
MarketplaceCategory marketplaceCategory = (MarketplaceCategory) category;
if (marketplaceCategory.getContents() == Contents.FEATURED) {
includeInstalled = true;
break;
}
}
}
if (!includeInstalled) {
return updateCheckItems;
}

updateCheckItems = new ArrayList<>(updateCheckItems);
Map<String, CatalogItem> itemsById = new HashMap<>();
for (CatalogItem catalogItem : updateCheckItems) {
itemsById.put(catalogItem.getId(), catalogItem);
}
List<AbstractDiscoveryStrategy> discoveryStrategies = getDiscoveryStrategies();
SubMonitor progress = SubMonitor.convert(monitor, discoveryStrategies.size() * 1000);
for (AbstractDiscoveryStrategy discoveryStrategy : discoveryStrategies) {
if (monitor.isCanceled()) {
break;
}
SubMonitor discoveryStrategyProgress = progress.newChild(1000);
if (discoveryStrategy instanceof MarketplaceDiscoveryStrategy) {
MarketplaceDiscoveryStrategy marketplaceDiscoveryStrategy = (MarketplaceDiscoveryStrategy) discoveryStrategy;
try {
performUpdateCheckDiscovery(marketplaceDiscoveryStrategy, updateCheckItems, itemsById,
discoveryStrategyProgress);
} catch (CoreException e) {
// TODO Auto-generated catch block WIP
e.printStackTrace();
}
}
discoveryStrategyProgress.setWorkRemaining(0);
}
return updateCheckItems;
}

private void performUpdateCheckDiscovery(MarketplaceDiscoveryStrategy marketplaceDiscoveryStrategy,
List<CatalogItem> updateCheckItems, Map<String, CatalogItem> itemsById,
SubMonitor discoveryStrategyProgress) throws CoreException {
MarketplaceCategory catalogCategory = marketplaceDiscoveryStrategy
.findMarketplaceCategory(discoveryStrategyProgress.newChild(1));
final Contents realContents = catalogCategory.getContents();
try {
catalogCategory.setContents(Contents.INSTALLED);
ISearchResult installed = marketplaceDiscoveryStrategy
.computeInstalled(discoveryStrategyProgress.newChild(499));
List<? extends INode> installedNodes = installed.getNodes();
if (installedNodes == null || installedNodes.isEmpty()) {
return;
}
SubMonitor itemProgress = discoveryStrategyProgress.newChild(500);
itemProgress.setWorkRemaining(installedNodes.size() * 100);
for (INode node : installedNodes) {
CatalogItem item = marketplaceDiscoveryStrategy.createCatalogItem(node, catalogCategory.getId(), false,
itemProgress.newChild(100));
if (!itemsById.containsKey(item.getId())) {
itemsById.put(item.getId(), item);
updateCheckItems.add(item);
}
}
itemProgress.done();
} finally {
catalogCategory.setContents(realContents);
}
}

private Map<String, IInstallableUnit> calculateInstalledIUs(IProgressMonitor monitor) {
Map<String, IInstallableUnit> installedIUs = new HashMap<>();
List<AbstractDiscoveryStrategy> discoveryStrategies = getDiscoveryStrategies();
Expand Down Expand Up @@ -525,9 +615,14 @@ public List<IMarket> getMarkets() {
return markets;
}

public List<MarketplaceNodeCatalogItem> getAvailableUpdates() {
return availableUpdates;
}

public void removeItem(CatalogItem item) {
getItems().remove(item);
getFilteredItems().remove(item);
getAvailableUpdates().remove(item);
for (CatalogCategory category : getCategories()) {
category.getItems().remove(item);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -275,96 +275,9 @@ protected void handleSearchResult(MarketplaceCategory catalogCategory, ISearchRe
}
}
for (final INode node : result.getNodes()) {
String id = node.getId();
try {
final MarketplaceNodeCatalogItem catalogItem = new MarketplaceNodeCatalogItem();
catalogItem.setMarketplaceUrl(catalogDescriptor.getUrl());
catalogItem.setId(id);
catalogItem.setName(getCatalogItemName(node));
catalogItem.setCategoryId(catalogCategory.getId());
ICategories categories = node.getCategories();
if (categories != null) {
for (ICategory category : categories.getCategory()) {
catalogItem.addTag(new Tag(ICategory.class, category.getId(), category.getName()));
}
}
catalogItem.setData(node);
catalogItem.setSource(source);
catalogItem.setLicense(node.getLicense());
catalogItem.setUserFavorite(userFavoritesSupported ? node.getUserFavorite() : null);
IIus ius = node.getIus();
if (ius != null) {
List<MarketplaceNodeInstallableUnitItem> installableUnitItems = new ArrayList<>();
for (IIu iu : ius.getIuElements()) {
MarketplaceNodeInstallableUnitItem iuItem = new MarketplaceNodeInstallableUnitItem();
iuItem.init(iu);
installableUnitItems.add(iuItem);
}
catalogItem.setInstallableUnitItems(installableUnitItems);
}
if (node.getShortdescription() == null && node.getBody() != null) {
// bug 306653 <!--break--> marks the end of the short description.
String descriptionText = node.getBody();
Matcher matcher = BREAK_PATTERN.matcher(node.getBody());
if (matcher.find()) {
int start = matcher.start();
if (start > 0) {
String shortDescriptionText = descriptionText.substring(0, start).trim();
if (shortDescriptionText.length() > 0) {
descriptionText = shortDescriptionText;
}
}
}
catalogItem.setDescription(descriptionText);
} else {
catalogItem.setDescription(node.getShortdescription());
}
catalogItem.setProvider(node.getCompanyname());
String updateurl = node.getUpdateurl();
if (updateurl != null) {
try {
// trim is important!
updateurl = updateurl.trim();
URLUtil.toURL(updateurl);
catalogItem.setSiteUrl(updateurl);
} catch (MalformedURLException e) {
// don't use malformed URLs
}
}
if (catalogItem.getInstallableUnits() == null || catalogItem.getInstallableUnits().isEmpty()
|| catalogItem.getSiteUrl() == null) {
catalogItem.setAvailable(false);
}
if (node.getImage() != null) {
if (!source.getResourceProvider().containsResource(node.getImage())) {
cacheResource(source.getResourceProvider(), catalogItem, node.getImage());
}
createIcon(catalogItem, node);
}
if (node.getBody() != null || node.getScreenshot() != null) {
final Overview overview = new Overview();
overview.setItem(catalogItem);
overview.setSummary(node.getBody());
overview.setUrl(node.getUrl());
catalogItem.setOverview(overview);

if (node.getScreenshot() != null) {
if (!source.getResourceProvider().containsResource(node.getScreenshot())) {
cacheResource(source.getResourceProvider(), catalogItem, node.getScreenshot());
}
overview.setScreenshot(node.getScreenshot());
}
}
items.add(catalogItem);
marketplaceInfo.map(catalogItem.getMarketplaceUrl(), node);
marketplaceInfo.computeInstalled(computeInstalledFeatures(progress.newChild(nodeWork)),
catalogItem);
} catch (RuntimeException ex) {
MarketplaceClientUi.error(
NLS.bind(Messages.MarketplaceDiscoveryStrategy_ParseError,
node == null ? "null" : id), //$NON-NLS-1$
ex);
}
CatalogItem catalogItem = createCatalogItem(node, catalogCategory.getId(), userFavoritesSupported,
progress.newChild(nodeWork));
items.add(catalogItem);
}
} finally {
progress.done();
Expand All @@ -379,6 +292,102 @@ protected void handleSearchResult(MarketplaceCategory catalogCategory, ISearchRe
}
}

protected CatalogItem createCatalogItem(final INode node, String categoryId, boolean userFavoritesSupported,
IProgressMonitor monitor) {
String id = node.getId();
try {
final MarketplaceNodeCatalogItem catalogItem = new MarketplaceNodeCatalogItem();
catalogItem.setMarketplaceUrl(catalogDescriptor.getUrl());
catalogItem.setId(id);
catalogItem.setName(getCatalogItemName(node));
catalogItem.setCategoryId(categoryId);
ICategories categories = node.getCategories();
if (categories != null) {
for (ICategory category : categories.getCategory()) {
catalogItem.addTag(new Tag(ICategory.class, category.getId(), category.getName()));
}
}
catalogItem.setData(node);
catalogItem.setSource(source);
catalogItem.setLicense(node.getLicense());
catalogItem.setUserFavorite(userFavoritesSupported ? node.getUserFavorite() : null);
IIus ius = node.getIus();
if (ius != null) {
List<MarketplaceNodeInstallableUnitItem> installableUnitItems = new ArrayList<>();
for (IIu iu : ius.getIuElements()) {
MarketplaceNodeInstallableUnitItem iuItem = new MarketplaceNodeInstallableUnitItem();
iuItem.init(iu);
installableUnitItems.add(iuItem);
}
catalogItem.setInstallableUnitItems(installableUnitItems);
}
if (node.getShortdescription() == null && node.getBody() != null) {
// bug 306653 <!--break--> marks the end of the short description.
String descriptionText = node.getBody();
Matcher matcher = BREAK_PATTERN.matcher(node.getBody());
if (matcher.find()) {
int start = matcher.start();
if (start > 0) {
String shortDescriptionText = descriptionText.substring(0, start).trim();
if (shortDescriptionText.length() > 0) {
descriptionText = shortDescriptionText;
}
}
}
catalogItem.setDescription(descriptionText);
} else {
catalogItem.setDescription(node.getShortdescription());
}
catalogItem.setProvider(node.getCompanyname());
String updateurl = node.getUpdateurl();
if (updateurl != null) {
try {
// trim is important!
updateurl = updateurl.trim();
URLUtil.toURL(updateurl);
catalogItem.setSiteUrl(updateurl);
} catch (MalformedURLException e) {
// don't use malformed URLs
}
}
if (catalogItem.getInstallableUnits() == null || catalogItem.getInstallableUnits().isEmpty()
|| catalogItem.getSiteUrl() == null) {
catalogItem.setAvailable(false);
}
if (node.getImage() != null) {
if (!source.getResourceProvider().containsResource(node.getImage())) {
cacheResource(source.getResourceProvider(), catalogItem, node.getImage());
}
createIcon(catalogItem, node);
}
if (node.getBody() != null || node.getScreenshot() != null) {
final Overview overview = new Overview();
overview.setItem(catalogItem);
overview.setSummary(node.getBody());
overview.setUrl(node.getUrl());
catalogItem.setOverview(overview);

if (node.getScreenshot() != null) {
if (!source.getResourceProvider().containsResource(node.getScreenshot())) {
cacheResource(source.getResourceProvider(), catalogItem, node.getScreenshot());
}
overview.setScreenshot(node.getScreenshot());
}
}
marketplaceInfo.map(catalogItem.getMarketplaceUrl(), node);
marketplaceInfo.computeInstalled(computeInstalledFeatures(monitor),
catalogItem);

return catalogItem;
} catch (RuntimeException ex) {
MarketplaceClientUi.error(
NLS.bind(Messages.MarketplaceDiscoveryStrategy_ParseError,
node == null ? "null" : id), //$NON-NLS-1$
ex);
return null;
}
}

public static void cacheResource(ResourceProvider resourceProvider, CatalogItem catalogItem,
String resource) {
if (!resourceProvider.containsResource(resource)) {
Expand Down Expand Up @@ -785,6 +794,10 @@ public void addOpenFavoritesItem(MarketplaceCategory catalogCategory) {
addUserActionItem(catalogCategory, UserAction.OPEN_FAVORITES);
}

public void addUpdateItem(MarketplaceCategory catalogCategory, List<MarketplaceNodeCatalogItem> availableUpdates) {
addUserActionItem(catalogCategory, UserAction.UPDATE, availableUpdates);
}

public void installed(IProgressMonitor monitor) throws CoreException {
SubMonitor progress = SubMonitor.convert(monitor, Messages.MarketplaceDiscoveryStrategy_findingInstalled,
1000);
Expand Down
Loading

0 comments on commit b9366df

Please sign in to comment.