blob: 47cbc349ab31c95090c0eef12586e8d6934b47bf [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.ui.editors;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.ui.actions.ShowInPackageViewAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.service.resolver.ExportPackageDescription;
import org.eclipse.pde.core.IBaseModel;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.internal.core.text.bundle.ExportPackageObject;
import org.eclipse.pde.internal.core.text.bundle.ImportPackageHeader;
import org.eclipse.pde.internal.core.text.bundle.ImportPackageObject;
import org.eclipse.pde.internal.core.text.bundle.PackageObject;
import org.eclipse.pde.internal.core.util.PDEJavaHelper;
import org.eclipse.pde.internal.ui.PDEPlugin;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.editor.PDEFormPage;
import org.eclipse.pde.internal.ui.util.SWTUtil;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.virgo.ide.bundlerepository.domain.OsgiVersion;
import org.eclipse.virgo.ide.bundlerepository.domain.PackageExport;
import org.eclipse.virgo.ide.runtime.core.artefacts.Artefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.ArtefactRepository;
import org.eclipse.virgo.ide.runtime.core.artefacts.BundleArtefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.IArtefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.IArtefactTyped;
import org.eclipse.virgo.ide.runtime.core.provisioning.RepositoryUtils;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
/**
* @author Christian Dupuis
*/
public class BundleImportPackageSection extends AbstractImportSection {
private static final String DESCRIPTION = "Specify packages on which this bundle depends without explicitly identifying their originating bundle.";
private Action fGoToAction;
private static final int ADD_INDEX = 0;
private static final int ADD_REMOTE_BUNDLE_INDEX = 1;
private static final int REMOVE_INDEX = 2;
private static final int PROPERTIES_INDEX = 3;
public BundleImportPackageSection(PDEFormPage page, Composite parent) {
super(page, parent, Section.DESCRIPTION, new String[] { PDEUIMessages.ImportPackageSection_add, "Download...",
PDEUIMessages.ImportPackageSection_remove, PDEUIMessages.ImportPackageSection_properties });
getSection().setText("Import Package");
getSection().setDescription(DESCRIPTION);
getTablePart().setEditable(false);
}
protected void setElementsLocal(ImportListSelectionDialog dialog) {
IProject project = ((BundleManifestEditor) this.getPage().getEditor()).getCommonProject();
Set<PackageExport> packages = RepositoryUtils.getImportPackageProposals(project, "");
ImportPackageHeader header = (ImportPackageHeader) getBundle().getManifestHeader(Constants.IMPORT_PACKAGE);
Set<PackageExport> filteredElements = new HashSet<PackageExport>();
if (header != null) {
ImportPackageObject[] filter = header.getPackages();
for (PackageExport proposal : packages) {
for (ImportPackageObject imported : filter) {
if (proposal.getName().equalsIgnoreCase(imported.getName())) {
filteredElements.add(proposal);
}
}
}
packages.removeAll(filteredElements);
}
dialog.setElements(packages.toArray());
}
protected void setElementsRemote(ImportListSelectionDialog dialog) {
Iterable<IArtefact> bundles = null;
ArtefactRepository bundleRepository = RepositoryUtils.searchForArtifacts("", true, false);
bundles = bundleRepository.getBundles();
Set<PackageExport> allPackageExports = new HashSet<PackageExport>();
for (IArtefactTyped currBundleArtefact : bundles) {
allPackageExports.addAll(((BundleArtefact) currBundleArtefact).getExports());
}
dialog.setElements(allPackageExports.toArray());
}
@Override
protected ITableLabelProvider getLabelProvider() {
return new ImportPackageLabelProvider();
}
class ImportPackageLabelProvider extends AbstractSectionViewerLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_PACKAGE);
}
@Override
public String getColumnText(Object element, int columnIndex) {
ImportPackageObject importPackageObject = (ImportPackageObject) element;
String label = importPackageObject.getName();
if (null != importPackageObject.getVersion()) {
label += " " + importPackageObject.getVersion();
}
return label;
}
}
@Override
protected void fillContextMenu(IMenuManager manager) {
final ISelection selection = this.fViewer.getSelection();
boolean singleSelection = selection instanceof IStructuredSelection && ((IStructuredSelection) selection).size() == 1;
if (singleSelection) {
manager.add(this.fGoToAction);
}
super.fillContextMenu(manager);
}
@Override
protected void handleAdd() {
internalHandleAdd(false);
}
private void internalHandleAdd(final boolean addRemote) {
final ImportListSelectionDialog dialog = new ImportListSelectionDialog(PDEPlugin.getActiveWorkbenchShell(),
new BundleImportPackageDialogLabelProvider());
Runnable runnable = new Runnable() {
public void run() {
if (addRemote) {
setElementsRemote(dialog);
} else {
setElementsLocal(dialog);
}
dialog.setMultipleSelection(true);
dialog.setMessage(PDEUIMessages.ImportPackageSection_required);
dialog.setTitle(PDEUIMessages.ImportPackageSection_selection);
dialog.create();
SWTUtil.setDialogSize(dialog, 400, 500);
}
};
BusyIndicator.showWhile(Display.getCurrent(), runnable);
if (dialog.open() == Window.OK) {
Object[] selected = dialog.getResult();
if (addRemote) {
downloadBundlesForSelectedPackages(selected);
}
addSelectedPackagesToManifest(selected);
}
}
private void downloadBundlesForSelectedPackages(Object[] selected) {
Set<Artefact> bundleArtefacts = new HashSet<Artefact>();
for (Object element : selected) {
PackageExport currPackageExport = (PackageExport) element;
bundleArtefacts.add(currPackageExport.getBundle());
}
IProject project = ((BundleManifestEditor) this.getPage().getEditor()).getCommonProject();
RepositoryUtils.downloadArifacts(bundleArtefacts, project, Display.getDefault().getActiveShell(), true);
}
private void addSelectedPackagesToManifest(Object[] selected) {
ImportPackageHeader importPackageHeader = (ImportPackageHeader) getBundle().getManifestHeader(Constants.IMPORT_PACKAGE);
for (Object element : selected) {
PackageExport currPackage = (PackageExport) element;
if (null == importPackageHeader) {
getBundle().setHeader(Constants.IMPORT_PACKAGE, "");
importPackageHeader = (ImportPackageHeader) getBundle().getManifestHeader(Constants.IMPORT_PACKAGE);
}
String versionString = null;
OsgiVersion osgiVers = currPackage.getVersion();
if (osgiVers.getMajor() != 0 || osgiVers.getMinor() != 0 || osgiVers.getService() != 0
|| osgiVers.getQualifier() != null && !osgiVers.getQualifier().trim().equals("")) {
versionString = "[" + currPackage.getVersion().toString() + "," + currPackage.getVersion().toString() + "]";
}
ImportPackageObject newPackageObject = new ImportPackageObject(importPackageHeader, currPackage.getName(), versionString,
Constants.VERSION_ATTRIBUTE);
importPackageHeader.addPackage(newPackageObject);
}
}
@Override
protected void handleRemove() {
Object[] removed = ((IStructuredSelection) this.fViewer.getSelection()).toArray();
ImportPackageHeader importPackageHeader = (ImportPackageHeader) getBundle().getManifestHeader(Constants.IMPORT_PACKAGE);
for (Object element : removed) {
importPackageHeader.removePackage((PackageObject) element);
}
}
@Override
protected void handleOpenProperties() {
Object[] selected = ((IStructuredSelection) this.fViewer.getSelection()).toArray();
ImportPackageObject first = (ImportPackageObject) selected[0];
BundleDependencyPropertiesDialog dialog = new BundleDependencyPropertiesDialog(isEditable(), false, false, first.isOptional(),
first.getVersion(), true, true);
dialog.create();
SWTUtil.setDialogSize(dialog, 400, -1);
if (selected.length == 1) {
dialog.setTitle(((ImportPackageObject) selected[0]).getName());
} else {
dialog.setTitle(PDEUIMessages.ExportPackageSection_props);
}
if (dialog.open() == Window.OK && isEditable()) {
String newVersion = dialog.getVersion();
boolean newOptional = dialog.isOptional();
for (Object element : selected) {
ImportPackageObject object = (ImportPackageObject) element;
if (!newVersion.equals(object.getVersion())) {
object.setVersion(newVersion);
}
if (!newOptional == object.isOptional()) {
object.setOptional(newOptional);
}
}
}
}
@Override
protected void handleDoubleClick(IStructuredSelection selection) {
handleGoToPackage(selection);
}
@Override
protected void makeActions() {
super.makeActions();
this.fGoToAction = new Action(PDEUIMessages.ImportPackageSection_goToPackage) {
@Override
public void run() {
handleGoToPackage(BundleImportPackageSection.this.fViewer.getSelection());
}
};
}
private IPackageFragment getPackageFragment(ISelection sel) {
if (sel instanceof IStructuredSelection) {
IStructuredSelection selection = (IStructuredSelection) sel;
if (selection.size() != 1) {
return null;
}
IBaseModel model = getPage().getModel();
if (!(model instanceof IPluginModelBase)) {
return null;
}
return PDEJavaHelper.getPackageFragment(((PackageObject) selection.getFirstElement()).getName(),
((IPluginModelBase) model).getPluginBase().getId(), getPage().getPDEEditor().getCommonProject());
}
return null;
}
private void handleGoToPackage(ISelection selection) {
IPackageFragment frag = getPackageFragment(selection);
if (frag != null) {
try {
IViewPart part = PDEPlugin.getActivePage().showView(JavaUI.ID_PACKAGES);
ShowInPackageViewAction action = new ShowInPackageViewAction(part.getSite());
action.run(frag);
} catch (PartInitException e) {
}
}
}
@Override
protected int getAddIndex() {
return ADD_INDEX;
}
@Override
protected int getRemoveIndex() {
return REMOVE_INDEX;
}
@Override
protected int getPropertiesIndex() {
return PROPERTIES_INDEX;
}
class BundleImportPackageDialogLabelProvider extends LabelProvider {
@Override
public Image getImage(Object element) {
return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_PACKAGE);
}
@Override
public String getText(Object element) {
PackageExport packageExport = (PackageExport) element;
String label = packageExport.getName();
if (null != packageExport.getVersion()) {
label += " " + packageExport.getVersion();
}
return label;
}
}
@Override
protected IContentProvider getContentProvider() {
return new ImportPackageContentProvider();
}
@Override
protected String getHeaderConstant() {
return Constants.IMPORT_PACKAGE;
}
class ImportItemWrapper {
Object fUnderlying;
public ImportItemWrapper(Object underlying) {
this.fUnderlying = underlying;
}
@Override
public String toString() {
return getName();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ImportItemWrapper) {
ImportItemWrapper item = (ImportItemWrapper) obj;
return getName().equals(item.getName());
}
return false;
}
public String getName() {
if (this.fUnderlying instanceof ExportPackageDescription) {
return ((ExportPackageDescription) this.fUnderlying).getName();
}
if (this.fUnderlying instanceof IPackageFragment) {
return ((IPackageFragment) this.fUnderlying).getElementName();
}
if (this.fUnderlying instanceof ExportPackageObject) {
return ((ExportPackageObject) this.fUnderlying).getName();
}
return null;
}
public Version getVersion() {
if (this.fUnderlying instanceof ExportPackageDescription) {
return ((ExportPackageDescription) this.fUnderlying).getVersion();
}
if (this.fUnderlying instanceof ExportPackageObject) {
String version = ((ExportPackageObject) this.fUnderlying).getVersion();
if (version != null) {
return new Version(version);
}
}
return null;
}
boolean hasVersion() {
return hasEPD() && ((ExportPackageDescription) this.fUnderlying).getVersion() != null;
}
boolean hasEPD() {
return this.fUnderlying instanceof ExportPackageDescription;
}
}
@Override
protected void buttonSelected(int index) {
if (index == ADD_REMOTE_BUNDLE_INDEX) {
internalHandleAdd(true);
} else {
super.buttonSelected(index);
}
}
class ImportPackageContentProvider implements IStructuredContentProvider {
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public Object[] getElements(Object parent) {
ImportPackageHeader header = (ImportPackageHeader) getBundle().getManifestHeader(Constants.IMPORT_PACKAGE);
if (header == null) {
return new Object[0];
} else {
return header.getPackages();
}
}
}
}