blob: 0f5adbf09b40d37e519dd161b9877470de97df0e [file] [log] [blame]
/*
* Copyright (c) 2017 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.oomph.targlets.internal.ui;
import org.eclipse.oomph.p2.P2Factory;
import org.eclipse.oomph.p2.Repository;
import org.eclipse.oomph.p2.RepositoryList;
import org.eclipse.oomph.p2.Requirement;
import org.eclipse.oomph.p2.VersionSegment;
import org.eclipse.oomph.p2.core.Agent;
import org.eclipse.oomph.p2.core.P2Util;
import org.eclipse.oomph.p2.core.RepositoryProviderMap;
import org.eclipse.oomph.p2.internal.ui.P2UIPlugin;
import org.eclipse.oomph.targlets.Targlet;
import org.eclipse.oomph.targlets.core.ITargletContainer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.IProvidedCapability;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.metadata.VersionRange;
import org.eclipse.equinox.p2.query.CompoundQueryable;
import org.eclipse.equinox.p2.query.IQueryable;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.pde.internal.ui.IPDEUIConstants;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author Eike Stepper
*/
public class ManifestDiscoveryDialog extends FilteredItemsSelectionDialog
{
private static final String DIALOG_SETTINGS = "org.eclipse.oomph.targlets.ui.PluginSelectionDialog"; //$NON-NLS-1$
private final ILabelProvider labelProvider;
private final String namespace;
private final List<ITargletContainer> targletContainers;
public ManifestDiscoveryDialog(Shell parentShell, String namespace, List<ITargletContainer> targletContainers, boolean multipleSelection)
{
super(parentShell, multipleSelection);
this.namespace = namespace;
this.targletContainers = targletContainers;
if ("org.eclipse.update.feature".equals(namespace))
{
setTitle("Feature Discovery");
setMessage(PDEUIMessages.FeatureBlock_SelectFeatures);
}
else if ("java.package".equals(namespace))
{
setTitle("Package Discovery");
setMessage(PDEUIMessages.ImportPackageSection_exported);
}
else
{
setTitle("Plug-in Discovery");
setMessage(PDEUIMessages.PluginSelectionDialog_message);
}
labelProvider = new ManifestDiscoveryLabelProvider(namespace);
setListLabelProvider(labelProvider);
}
@Override
public boolean close()
{
labelProvider.dispose();
return super.close();
}
@Override
protected Control createExtendedContentArea(Composite parent)
{
return null;
}
@Override
protected ItemsFilter createFilter()
{
return new ManifestDiscoveryItemsFilter();
}
@Override
protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor monitor) throws CoreException
{
Agent agent = P2Util.getAgentManager().getCurrentAgent();
IMetadataRepositoryManager repositoryManager = agent.getMetadataRepositoryManager();
RepositoryProviderMap.Metadata repositoryProviderMap = new RepositoryProviderMap.Metadata(repositoryManager);
try
{
Set<String> urls = new HashSet<String>();
for (ITargletContainer targletContainer : targletContainers)
{
for (Targlet targlet : targletContainer.getTarglets())
{
RepositoryList activeRepositoryList = targlet.getActiveRepositoryList();
if (activeRepositoryList != null)
{
for (Repository repository : activeRepositoryList.getRepositories())
{
try
{
String url = repository.getURL();
urls.add(url);
}
catch (Exception ex)
{
TargletsUIPlugin.INSTANCE.log(ex, IStatus.WARNING);
continue;
}
}
}
}
}
SubMonitor progress = SubMonitor.convert(monitor, 10 * urls.size() + 1);
List<IQueryable<IInstallableUnit>> queryables = new ArrayList<IQueryable<IInstallableUnit>>();
for (String url : urls)
{
try
{
IMetadataRepository queryable = repositoryProviderMap.getRepository(new URI(url), progress.newChild(10));
queryables.add(queryable);
}
catch (Exception ex)
{
TargletsUIPlugin.INSTANCE.log(ex, IStatus.WARNING);
continue;
}
}
for (ITargletContainer targletContainer : targletContainers)
{
for (Targlet targlet : targletContainer.getTarglets())
{
RepositoryList activeRepositoryList = targlet.getActiveRepositoryList();
if (activeRepositoryList != null)
{
for (Repository repository : activeRepositoryList.getRepositories())
{
String url = repository.getURL();
if (urls.add(url))
{
try
{
IMetadataRepository queryable = repositoryProviderMap.getRepository(new URI(url));
queryables.add(queryable);
}
catch (URISyntaxException ex)
{
TargletsUIPlugin.INSTANCE.log(ex, IStatus.WARNING);
continue;
}
}
}
}
}
}
@SuppressWarnings("unchecked")
IQueryable<IInstallableUnit>[] array = queryables.toArray(new IQueryable[queryables.size()]);
CompoundQueryable<IInstallableUnit> compoundQueryable = new CompoundQueryable<IInstallableUnit>(array);
for (IInstallableUnit iu : P2Util.asIterable(compoundQueryable.query(QueryUtil.createLatestIUQuery(), progress.newChild(1))))
{
if (!iu.getId().endsWith(".source"))
{
for (IProvidedCapability capability : iu.getProvidedCapabilities())
{
if (namespace.equals(capability.getNamespace()))
{
String name = capability.getName();
VersionRange versionRange = P2Factory.eINSTANCE.createVersionRange(capability.getVersion(), VersionSegment.QUALIFIER, false);
Requirement requirement = P2Factory.eINSTANCE.createRequirement();
requirement.setNamespace(namespace);
requirement.setName(name);
requirement.setVersionRange(versionRange);
contentProvider.add(requirement, itemsFilter);
}
}
}
}
}
finally
{
repositoryProviderMap.dispose();
monitor.done();
}
}
@Override
protected IDialogSettings getDialogSettings()
{
return TargletsUIPlugin.INSTANCE.getDialogSettings(DIALOG_SETTINGS);
}
@Override
public String getElementName(Object item)
{
return ((Requirement)item).getName();
}
@Override
protected Comparator<?> getItemsComparator()
{
return new ManifestDiscoveryComparator();
}
@Override
protected IStatus validateItem(Object item)
{
return new Status(IStatus.OK, IPDEUIConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
}
/**
* @author Eike Stepper
*/
private final class ManifestDiscoveryItemsFilter extends ItemsFilter
{
public ManifestDiscoveryItemsFilter()
{
String pattern = patternMatcher.getPattern();
if (pattern.indexOf("*") != 0 && pattern.indexOf("?") != 0 && pattern.indexOf(".") != 0) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
{
pattern = "*" + pattern; //$NON-NLS-1$
patternMatcher.setPattern(pattern);
}
}
@Override
public boolean isConsistentItem(Object item)
{
return true;
}
@Override
public boolean matchItem(Object item)
{
return matches(((Requirement)item).getName());
}
}
/**
* @author Eike Stepper
*/
private static final class ManifestDiscoveryComparator implements Comparator<Object>
{
public ManifestDiscoveryComparator()
{
}
public int compare(Object o1, Object o2)
{
return ((Requirement)o1).getName().compareTo(((Requirement)o2).getName());
}
}
/**
* @author Eike Stepper
*/
private static final class ManifestDiscoveryLabelProvider extends LabelProvider
{
private static final Image FEATURE_IMAGE = P2UIPlugin.INSTANCE.getSWTImage("obj16/artifactFeature");
private static final Image PLUGIN_IMAGE = P2UIPlugin.INSTANCE.getSWTImage("obj16/artifactPlugin");
private static final Image PACKAGE_IMAGE = P2UIPlugin.INSTANCE.getSWTImage("full/obj16/Requirement_Package");
private final String namespace;
public ManifestDiscoveryLabelProvider(String namespace)
{
this.namespace = namespace;
}
@Override
public Image getImage(Object element)
{
if ("osgi.bundle".equals(namespace))
{
return PLUGIN_IMAGE;
}
if ("org.eclipse.update.feature".equals(namespace))
{
return FEATURE_IMAGE;
}
if ("java.package".equals(namespace))
{
return PACKAGE_IMAGE;
}
return super.getImage(element);
}
@Override
public String getText(Object element)
{
if (element instanceof Requirement)
{
Requirement requirement = (Requirement)element;
String text = requirement.getName();
Version version = requirement.getVersionRange().getMinimum();
if (version != null && !version.equals(Version.emptyVersion))
{
text += " (" + version + ")";
}
return text;
}
return super.getText(element);
}
}
}