package bndtools.editor.project; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.SortedSet; import org.bndtools.api.ILogger; import org.bndtools.api.Logger; import org.bndtools.utils.osgi.BundleUtils; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.osgi.framework.Bundle; import aQute.bnd.build.Workspace; import aQute.bnd.service.RepositoryPlugin; import aQute.bnd.version.Version; import aQute.lib.exceptions.Exceptions; import bndtools.Plugin; public class OSGiFrameworkContentProvider implements IStructuredContentProvider { private static final ILogger logger = Logger.getLogger(OSGiFrameworkContentProvider.class); List<OSGiFramework> frameworks = new ArrayList<OSGiFramework>(); @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { frameworks.clear(); Workspace workspace = (Workspace) newInput; IConfigurationElement[] configElements = Platform.getExtensionRegistry().getConfigurationElementsFor(Plugin.PLUGIN_ID, "osgiFrameworks"); for (IConfigurationElement element : configElements) { String frameworkName = element.getAttribute("name"); String bsn = element.getAttribute("bsn"); URL iconUrl = null; String iconPath = element.getAttribute("icon"); if (iconPath != null) { Bundle contributorBundle = BundleUtils.findBundle(Plugin.getDefault().getBundleContext(), element.getContributor().getName(), null); if (contributorBundle != null) iconUrl = contributorBundle.getEntry(iconPath); } List<RepositoryPlugin> repositories; try { repositories = (workspace != null) ? workspace.getRepositories() : Collections.<RepositoryPlugin> emptyList(); } catch (Exception e) { throw Exceptions.duck(e); } for (RepositoryPlugin repo : repositories) { try { SortedSet<Version> versions = repo.versions(bsn); if (versions != null) for (Version version : versions) { try { File framework = repo.get(bsn, version, null); if (framework != null) frameworks.add(new OSGiFramework(frameworkName, bsn, version, iconUrl)); } catch (Exception e) { logger.logError(String.format("Error finding repository entry for OSGi framework %s, version %s.", bsn, version.toString()), e); } } } catch (Exception e) { logger.logError(String.format("Error searching repository for OSGi framework %s.", bsn), e); } } } } @Override public void dispose() {} @Override public Object[] getElements(Object inputElement) { return frameworks.toArray(); } }