blob: 841608d8fd8f4832bad1220eb9c1b30175205747 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.sdk;
import java.net.URL;
import org.eclipse.equinox.internal.p2.ui.sdk.prefs.PreferenceConstants;
import org.eclipse.equinox.internal.provisional.p2.artifact.repository.IArtifactRepositoryManager;
import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException;
import org.eclipse.equinox.internal.provisional.p2.director.IUProfilePropertyQuery;
import org.eclipse.equinox.internal.provisional.p2.engine.IProfile;
import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.internal.provisional.p2.metadata.query.IUPropertyQuery;
import org.eclipse.equinox.internal.provisional.p2.metadata.query.InstallableUnitQuery;
import org.eclipse.equinox.internal.provisional.p2.metadata.repository.IMetadataRepositoryManager;
import org.eclipse.equinox.internal.provisional.p2.query.*;
import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI;
import org.eclipse.equinox.internal.provisional.p2.ui.model.*;
import org.eclipse.equinox.internal.provisional.p2.ui.operations.ProvisioningUtil;
import org.eclipse.equinox.internal.provisional.p2.ui.policy.IQueryProvider;
import org.eclipse.equinox.internal.provisional.p2.ui.query.*;
import org.eclipse.equinox.internal.provisional.p2.updatechecker.UpdateEvent;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* Provides the queries appropriate for the SDK UI.
*
* @since 3.4
*/
public class ProvSDKQueryProvider implements IQueryProvider {
private Query allQuery = new Query() {
public boolean isMatch(Object candidate) {
return true;
}
};
public ElementQueryDescriptor getQueryDescriptor(Object element, int queryType) {
IQueryable queryable;
QueryContext queryContext = null;
if (element instanceof QueriedElement)
queryContext = ((QueriedElement) element).getQueryContext();
boolean showLatest = ProvSDKUIActivator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.PREF_SHOW_LATEST_VERSION);
switch (queryType) {
case IQueryProvider.ARTIFACT_REPOS :
queryable = new QueryableArtifactRepositoryManager(IArtifactRepositoryManager.REPOSITORIES_NON_SYSTEM);
return new ElementQueryDescriptor(queryable, null, new Collector() {
public boolean accept(Object object) {
if (object instanceof URL)
return super.accept(new ArtifactRepositoryElement((URL) object));
return true;
}
});
case IQueryProvider.AVAILABLE_IUS :
// Things get more complicated if the user wants to filter out installed items.
// This involves setting up a secondary query for installed content that the various
// collectors will use to reject content. We can't use a compound query because the
// queryables are different (profile for installed content, repo for available content)
AvailableIUViewQueryContext availableViewQueryContext = null;
AvailableIUCollector availableIUCollector;
boolean hideInstalled = false;
ElementQueryDescriptor installedQueryDescriptor = null;
if (queryContext instanceof AvailableIUViewQueryContext) {
availableViewQueryContext = (AvailableIUViewQueryContext) ((QueriedElement) element).getQueryContext();
showLatest = availableViewQueryContext.getShowLatestVersionsOnly();
hideInstalled = availableViewQueryContext.getHideAlreadyInstalled();
String profileId = availableViewQueryContext.getInstalledProfileId();
if (hideInstalled && profileId != null) {
try {
IProfile profile = ProvisioningUtil.getProfile(profileId);
installedQueryDescriptor = new ElementQueryDescriptor(profile, new IUProfilePropertyByIdQuery(profile.getProfileId(), IInstallableUnit.PROP_PROFILE_ROOT_IU, Boolean.toString(true)), new Collector());
} catch (ProvisionException e) {
// just bail out, we won't try to query the installed
installedQueryDescriptor = null;
}
}
}
// Showing children of a rollback element
if (element instanceof RollbackRepositoryElement) {
Query profileIdQuery = new InstallableUnitQuery(((RollbackRepositoryElement) element).getProfileId());
Query rollbackIUQuery = new IUPropertyQuery(IInstallableUnit.PROP_TYPE_PROFILE, Boolean.toString(true));
availableIUCollector = new RollbackIUCollector(this, ((RollbackRepositoryElement) element).getQueryable(), queryContext);
if (hideInstalled && installedQueryDescriptor != null)
availableIUCollector.hideInstalledIUs(installedQueryDescriptor);
return new ElementQueryDescriptor(((RollbackRepositoryElement) element).getQueryable(), new CompoundQuery(new Query[] {profileIdQuery, rollbackIUQuery}, true), availableIUCollector);
}
Query groupQuery = new IUPropertyQuery(IInstallableUnit.PROP_TYPE_GROUP, Boolean.TRUE.toString());
Query categoryQuery = new IUPropertyQuery(IInstallableUnit.PROP_TYPE_CATEGORY, Boolean.toString(true));
// Showing child IU's of some repositories
if (element instanceof MetadataRepositories) {
MetadataRepositories metaRepos = (MetadataRepositories) element;
if (metaRepos.getMetadataRepositories() == null)
metaRepos.setRepoFlags(IMetadataRepositoryManager.REPOSITORIES_NON_SYSTEM);
queryable = new QueryableMetadataRepositoryManager(metaRepos);
if (availableViewQueryContext != null) {
if (availableViewQueryContext.getViewType() == AvailableIUViewQueryContext.VIEW_FLAT) {
AvailableIUCollector collector;
if (showLatest)
collector = new LatestIUVersionElementCollector(this, queryable, queryContext, true);
else
collector = new AvailableIUCollector(this, queryable, queryContext, true);
if (hideInstalled && installedQueryDescriptor != null)
collector.hideInstalledIUs(installedQueryDescriptor);
return new ElementQueryDescriptor(queryable, groupQuery, collector);
}
}
// Assume category view if it wasn't flat or if there was no query context at all.
// Installed content not a concern for collecting categories
return new ElementQueryDescriptor(queryable, categoryQuery, new CategoryElementCollector(this, queryable, queryContext, true));
}
// Showing children of a repository. We always show categories, no concern for filtering installed content
if (element instanceof MetadataRepositoryElement) {
return new ElementQueryDescriptor(((MetadataRepositoryElement) element).getQueryable(), categoryQuery, new CategoryElementCollector(this, ((MetadataRepositoryElement) element).getQueryable(), queryContext, true));
}
// Showing children of categories
// Must do this one before CategoryElement since it's a subclass
if (element instanceof UncategorizedCategoryElement) {
// Will have to look at all categories and groups and from there, figure out what's left
Query firstPassQuery = new CompoundQuery(new Query[] {groupQuery, categoryQuery}, false);
queryable = ((UncategorizedCategoryElement) element).getQueryable();
availableIUCollector = showLatest ? new LatestIUVersionElementCollector(this, queryable, queryContext, false) : new AvailableIUCollector(this, queryable, queryContext, false);
if (hideInstalled && installedQueryDescriptor != null)
availableIUCollector.hideInstalledIUs(installedQueryDescriptor);
return new ElementQueryDescriptor(queryable, firstPassQuery, new UncategorizedElementCollector(this, queryable, queryContext, availableIUCollector));
}
if (element instanceof CategoryElement) {
Query membersOfCategoryQuery = new AnyRequiredCapabilityQuery(((CategoryElement) element).getRequirements());
if (showLatest)
availableIUCollector = new LatestIUVersionElementCollector(this, ((CategoryElement) element).getQueryable(), queryContext, true);
else
availableIUCollector = new AvailableIUCollector(this, ((CategoryElement) element).getQueryable(), queryContext, true);
if (hideInstalled && installedQueryDescriptor != null)
availableIUCollector.hideInstalledIUs(installedQueryDescriptor);
return new ElementQueryDescriptor(((CategoryElement) element).getQueryable(), new CompoundQuery(new Query[] {new CompoundQuery(new Query[] {groupQuery, categoryQuery}, false), membersOfCategoryQuery}, true), availableIUCollector);
}
// If we are showing only the latest version, we never represent other versions as children.
if (element instanceof IUVersionsElement) {
return null;
}
case IQueryProvider.AVAILABLE_UPDATES :
IProfile profile = (IProfile) ProvUI.getAdapter(element, IProfile.class);
IInstallableUnit[] toUpdate;
Collector collector;
if (profile != null) {
collector = profile.query(new IUProfilePropertyByIdQuery(profile.getProfileId(), IInstallableUnit.PROP_PROFILE_ROOT_IU, Boolean.toString(true)), new Collector(), null);
toUpdate = (IInstallableUnit[]) collector.toArray(IInstallableUnit.class);
} else if (element instanceof UpdateEvent) {
try {
profile = ProvisioningUtil.getProfile(((UpdateEvent) element).getProfileId());
} catch (ProvisionException e) {
ProvUI.handleException(e, NLS.bind(ProvSDKMessages.ProvSDKQueryProvider_ErrorRetrievingProfile, ((UpdateEvent) element).getProfileId()), StatusManager.LOG);
return null;
}
toUpdate = ((UpdateEvent) element).getIUs();
} else
return null;
QueryableUpdates updateQueryable = new QueryableUpdates(toUpdate);
if (showLatest)
collector = new LatestIUVersionCollector(this, updateQueryable, queryContext, true);
else
collector = new Collector();
return new ElementQueryDescriptor(updateQueryable, allQuery, collector);
case IQueryProvider.INSTALLED_IUS :
profile = (IProfile) ProvUI.getAdapter(element, IProfile.class);
if (profile == null)
return null;
// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=229352
// Rollback profiles are specialized/temporary instances so we must use a query that uses the profile instance, not the id.
if (element instanceof RollbackProfileElement)
return new ElementQueryDescriptor(profile, new IUProfilePropertyQuery(profile, IInstallableUnit.PROP_PROFILE_ROOT_IU, Boolean.toString(true)), new InstalledIUCollector(this, profile, queryContext));
return new ElementQueryDescriptor(profile, new IUProfilePropertyByIdQuery(profile.getProfileId(), IInstallableUnit.PROP_PROFILE_ROOT_IU, Boolean.toString(true)), new InstalledIUCollector(this, profile, queryContext));
case IQueryProvider.METADATA_REPOS :
if (element instanceof MetadataRepositories) {
MetadataRepositories metaRepos = (MetadataRepositories) element;
if (metaRepos.getMetadataRepositories() == null)
metaRepos.setRepoFlags(IMetadataRepositoryManager.REPOSITORIES_NON_SYSTEM);
queryable = new QueryableMetadataRepositoryManager(metaRepos);
metaRepos.setQueryable(queryable);
return new ElementQueryDescriptor(queryable, null, new MetadataRepositoryElementCollector(this, queryContext));
}
return null;
case IQueryProvider.PROFILES :
queryable = new QueryableProfileRegistry();
return new ElementQueryDescriptor(queryable, new Query() {
public boolean isMatch(Object candidate) {
return ProvUI.getAdapter(candidate, IProfile.class) != null;
}
}, new ProfileElementCollector(this, null, queryContext));
default :
return null;
}
}
}