blob: e2e518293e2f6fca7ae019a5003e07b6cfde3c10 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2011 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
* EclipseSource - ongoing development
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.model;
import java.util.*;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.ui.*;
import org.eclipse.equinox.internal.p2.ui.query.IUViewQueryContext;
import org.eclipse.equinox.p2.operations.RepositoryTracker;
import org.eclipse.equinox.p2.query.Collector;
import org.eclipse.equinox.p2.query.IQueryable;
import org.eclipse.osgi.util.NLS;
/**
* A wrapper that assigns a query provider and the queryable
* who was performing the query to the wrapped elements
* as they are accepted.
*
* @since 3.4
*/
public abstract class QueriedElementWrapper extends ElementWrapper {
protected IQueryable<?> queryable;
protected Object parent;
protected String emptyExplanationString;
protected int emptyExplanationSeverity;
protected String emptyExplanationDescription;
public QueriedElementWrapper(IQueryable<?> queryable, Object parent) {
this.queryable = queryable;
this.parent = parent;
}
/**
* Sets an item as Queryable if it is a QueriedElement
*/
@Override
protected Object wrap(Object item) {
if (item instanceof QueriedElement) {
QueriedElement element = (QueriedElement) item;
if (!element.knowsQueryable()) {
element.setQueryable(queryable);
}
}
return item;
}
@Override
public Collection<?> getElements(Collector<?> collector) {
// Any previously stored explanations are not valid.
emptyExplanationString = null;
emptyExplanationSeverity = IStatus.INFO;
emptyExplanationDescription = null;
if (collector.isEmpty()) {
// Before we are even filtering out items, there is nothing in the collection.
// All we can do is look for the most common reasons and guess. If the collection
// is empty and the parent is an IU, then being empty is not a big deal, it means
// we are in drilldown.
if (parent instanceof MetadataRepositoryElement) {
MetadataRepositoryElement repo = (MetadataRepositoryElement) parent;
RepositoryTracker manipulator = repo.getProvisioningUI().getRepositoryTracker();
if (manipulator.hasNotFoundStatusBeenReported(repo.getLocation())) {
return emptyExplanation(IStatus.ERROR, NLS.bind(ProvUIMessages.QueriedElementWrapper_SiteNotFound, URIUtil.toUnencodedString(repo.getLocation())), ""); //$NON-NLS-1$
}
}
if (parent instanceof QueriedElement) {
QueriedElement element = (QueriedElement) parent;
IUViewQueryContext context = element.getQueryContext();
if (context == null)
context = ProvUI.getQueryContext(element.getPolicy());
if (parent instanceof MetadataRepositoryElement || parent instanceof MetadataRepositories) {
if (context != null && context.getViewType() == IUViewQueryContext.AVAILABLE_VIEW_BY_CATEGORY && context.getUseCategories()) {
return emptyExplanation(IStatus.INFO, ProvUIMessages.QueriedElementWrapper_NoCategorizedItemsExplanation, context.getUsingCategoriesDescription());
}
return emptyExplanation(IStatus.INFO, ProvUIMessages.QueriedElementWrapper_NoItemsExplanation, null);
}
}
// It is empty, but the parent is an IU, so this could be a drilldown.
return Collections.EMPTY_LIST;
}
Collection<?> elements = super.getElements(collector);
// We had elements but now they have been filtered out. Hopefully
// we can explain this.
if (elements.isEmpty()) {
if (emptyExplanationString != null)
return emptyExplanation(emptyExplanationSeverity, emptyExplanationString, emptyExplanationDescription);
// We filtered out content but never explained it. Ideally this doesn't happen if
// all wrappers explain any filtering.
return emptyExplanation(emptyExplanationSeverity, ProvUIMessages.QueriedElementWrapper_NoItemsExplanation, null);
}
return elements;
}
Collection<?> emptyExplanation(int severity, String explanationString, String explanationDescription) {
ArrayList<Object> collection = new ArrayList<Object>(1);
collection.add(new EmptyElementExplanation(parent, severity, explanationString, explanationDescription));
return collection;
}
}