com.nokia.carbide.internal.discovery.ui.extension.AbstractDiscoveryPortalPageLayer.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.internal.discovery.ui.extension.AbstractDiscoveryPortalPageLayer.java

Source

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.carbide.internal.discovery.ui.extension;

import java.net.URI;
import java.net.URISyntaxException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.equinox.internal.p2.discovery.Catalog;
import org.eclipse.equinox.internal.p2.discovery.DiscoveryCore;
import org.eclipse.equinox.internal.p2.discovery.compatibility.BundleDiscoveryStrategy;
import org.eclipse.equinox.internal.p2.discovery.compatibility.RemoteBundleDiscoveryStrategy;
import org.eclipse.equinox.internal.p2.discovery.model.CatalogItem;
import org.eclipse.equinox.internal.p2.ui.discovery.DiscoveryUi;
import org.eclipse.equinox.internal.p2.ui.discovery.wizards.CatalogConfiguration;
import org.eclipse.equinox.internal.p2.ui.discovery.wizards.CatalogViewer;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.equinox.p2.ui.ProvisioningUI;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
import org.eclipse.ui.handlers.IHandlerService;

import com.nokia.carbide.discovery.ui.Activator;
import com.nokia.carbide.discovery.ui.Messages;
import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils;

@SuppressWarnings("restriction")
public abstract class AbstractDiscoveryPortalPageLayer implements IPortalPageLayer {

    private class RunnableContextDialog extends ProgressMonitorDialog {
        private final String title;

        private RunnableContextDialog(Shell parent, String title) {
            super(parent);
            this.title = title;
        }

        @Override
        protected void configureShell(Shell shell) {
            super.configureShell(shell);
            shell.setText(title);
        }

    }

    protected class ActionBar implements IActionBar {
        private IAction[] actions;

        public ActionBar(IEditorPart part) {
            actions = makeActions(part);
        }

        @Override
        public String getTitle() {
            return Messages.AbstractDiscoveryPortalPageLayer_Title;
        }

        @Override
        public IAction[] getActions() {
            return actions;
        }

        @Override
        public String[] getHighlightedActionIds() {
            return new String[] { INSTALL_ACTION_ID };
        }
    }

    protected static final String INSTALL_ACTION_ID = AbstractDiscoveryPortalPageLayer.class.getName() + ".install"; //$NON-NLS-1$
    protected static final String UNCHECK_ALL_ACTION_ID = AbstractDiscoveryPortalPageLayer.class.getName()
            + ".uncheckAll"; //$NON-NLS-1$
    protected static final String CHECK_ALL_ACTION_ID = AbstractDiscoveryPortalPageLayer.class.getName()
            + ".checkAll"; //$NON-NLS-1$
    protected static final String ADV_INSTALL_ACTION_ID = AbstractDiscoveryPortalPageLayer.class.getName()
            + ".advancedInstall"; //$NON-NLS-1$
    protected static final String REFRESH_ACTION_ID = AbstractDiscoveryPortalPageLayer.class.getName() + ".refresh"; //$NON-NLS-1$

    protected IEditorPart part;
    private CatalogViewer viewer;
    private List<ISelectionChangedListener> selectionListeners;
    private IActionUIUpdater updater;

    @Override
    public Control createControl(Composite parent, IEditorPart part) {
        Composite c = new Composite(parent, SWT.NONE);
        GridLayoutFactory.swtDefaults().applyTo(c);
        viewer = new CatalogViewer(getCatalog(), part.getEditorSite(),
                new RunnableContextDialog(part.getEditorSite().getShell(),
                        Messages.AbstractDiscoveryPortalPageLayer_GatheringExtensionsDesc),
                getConfiguration());
        viewer.createControl(c);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(viewer.getControl());

        return c;
    }

    @Override
    public void init() {
        if (!WorkbenchUtils.isJUnitRunning()) { // do not initialize the catalog if JUnit is running
            Display.getDefault().asyncExec(new Runnable() {
                @Override
                public void run() {
                    for (ISelectionChangedListener listener : selectionListeners) {
                        viewer.addSelectionChangedListener(listener);
                    }
                    viewer.updateCatalog();
                    viewer.getControl().setFocus();
                }
            });
        }
    }

    @Override
    public IActionBar[] createCommandBars(IEditorPart part, IActionUIUpdater updater) {
        this.updater = updater;
        return new IActionBar[] { new ActionBar(part) };
    }

    protected CatalogConfiguration getConfiguration() {
        CatalogConfiguration configuration = new CatalogConfiguration();
        configuration.setShowTagFilter(false);
        return configuration;
    }

    protected Catalog getCatalog() {
        Catalog catalog = new Catalog();
        catalog.setEnvironment(DiscoveryCore.createEnvironment());
        catalog.setVerifyUpdateSiteAvailability(false);

        // look for remote descriptor
        RemoteBundleDiscoveryStrategy remoteDiscoveryStrategy = new RemoteBundleDiscoveryStrategy();
        String url = getDirectoryURL();
        if (url != null) {
            remoteDiscoveryStrategy.setDirectoryUrl(url);
            catalog.getDiscoveryStrategies().add(remoteDiscoveryStrategy);
        } else // look for descriptors from installed bundles
            catalog.getDiscoveryStrategies().add(new BundleDiscoveryStrategy());

        return catalog;
    }

    protected String getDirectoryURL() {
        return Activator.getFromServerProperties(getClass().getName());
    }

    protected IAction[] makeActions(final IEditorPart part) {
        this.part = part;
        selectionListeners = new ArrayList<ISelectionChangedListener>();
        List<IAction> actions = new ArrayList<IAction>();
        IAction action;

        // install
        action = new BaseSelectionListenerAction(Messages.AbstractDiscoveryPortalPageLayer_InstallActionLabel) {
            public void run() {
                installCatalogItems(viewer.getCheckedItems());
            };

            protected boolean updateSelection(IStructuredSelection selection) {
                scheduleUpdateAllActionUIs();
                return !selection.isEmpty();
            };
        };
        action.setToolTipText(Messages.AbstractDiscoveryPortalPageLayer_InstallActionTooltip);
        action.setId(INSTALL_ACTION_ID);
        selectionListeners.add((ISelectionChangedListener) action);
        actions.add(action);

        // refresh
        action = new Action(Messages.AbstractDiscoveryPortalPageLayer_RefreshActionLabel) {
            public void run() {
                viewer.setSelection(StructuredSelection.EMPTY);
                viewer.updateCatalog();
                viewer.refresh();
            }
        };
        action.setId(REFRESH_ACTION_ID);
        actions.add(action);

        // check all
        action = new BaseSelectionListenerAction(Messages.AbstractDiscoveryPortalPageLayer_CheckAllActionLabel) {
            public void run() {
                viewer.setSelection(StructuredSelection.EMPTY);
                viewer.setSelection(getAllItemsSelection());
                viewer.refresh();
            }

            private IStructuredSelection getAllItemsSelection() {
                List<CatalogItem> catalogItems = new ArrayList<CatalogItem>();
                for (CatalogItem catalogItem : viewer.getCatalog().getItems()) {
                    if (!catalogItem.isInstalled())
                        catalogItems.add(catalogItem);
                }
                return new StructuredSelection(catalogItems);
            }

            protected boolean updateSelection(IStructuredSelection selection) {
                scheduleUpdateAllActionUIs();
                return !getAllItemsSelection().equals(selection);
            }
        };
        action.setId(CHECK_ALL_ACTION_ID);
        selectionListeners.add((ISelectionChangedListener) action);
        actions.add(action);

        // uncheck all
        action = new BaseSelectionListenerAction(Messages.AbstractDiscoveryPortalPageLayer_UncheckAllActionLabel) {
            public void run() {
                viewer.setSelection(StructuredSelection.EMPTY);
                viewer.refresh();
            };

            protected boolean updateSelection(IStructuredSelection selection) {
                scheduleUpdateAllActionUIs();
                return !selection.isEmpty();
            };
        };
        action.setId(UNCHECK_ALL_ACTION_ID);
        selectionListeners.add((ISelectionChangedListener) action);
        actions.add(action);

        // advanced install
        action = new Action(Messages.AbstractDiscoveryPortalPageLayer_AdvancedInstallActionLabel) {
            public void run() {
                showInstallWizard();
            }
        };
        action.setId(ADV_INSTALL_ACTION_ID);
        actions.add(action);

        ISelectionChangedListener selectionListener = new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                IActionBars bars = part.getEditorSite().getActionBars();
                bars.getStatusLineManager()
                        .setMessage(selection.isEmpty() ? null
                                : MessageFormat.format(
                                        Messages.AbstractDiscoveryPortalPageLayer_CheckedItemsStatusMessage,
                                        selection.size()));
            }
        };
        selectionListeners.add(selectionListener);

        return (IAction[]) actions.toArray(new IAction[actions.size()]);
    }

    protected void installCatalogItems(List<CatalogItem> items) {
        DiscoveryUi.install(items, new RunnableContextDialog(part.getEditorSite().getShell(),
                Messages.AbstractDiscoveryPortalPageLayer_GatheringInstallInfoDesc));
    }

    @Override
    public void dispose() {
        for (ISelectionChangedListener listener : selectionListeners) {
            viewer.removeSelectionChangedListener(listener);
        }
    }

    protected void showInstallWizard() {
        IProvisioningAgent agent = ProvisioningUI.getDefaultUI().getSession().getProvisioningAgent();
        IMetadataRepositoryManager metadataManager = (IMetadataRepositoryManager) agent
                .getService(IMetadataRepositoryManager.SERVICE_NAME);
        IArtifactRepositoryManager artifactManager = (IArtifactRepositoryManager) agent
                .getService(IArtifactRepositoryManager.SERVICE_NAME);
        for (URI uri : getSiteURIs(viewer.getCatalog().getItems())) {
            metadataManager.addRepository(uri);
            artifactManager.addRepository(uri);
        }
        IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                .getService(IHandlerService.class);
        try {
            handlerService.executeCommand("org.eclipse.equinox.p2.ui.sdk.install", null); //$NON-NLS-1$
        } catch (Exception e) {
            Activator.logError(Messages.AbstractDiscoveryPortalPageLayer_P2InstallWizardOpenError, e);
        }
    }

    protected static Collection<URI> getSiteURIs(List<CatalogItem> catalogItems) {
        Set<URI> uris = new HashSet<URI>();
        for (CatalogItem catalogItem : catalogItems) {
            try {
                uris.add(new URI(catalogItem.getSiteUrl()));
            } catch (URISyntaxException e) {
                // ignore bad URIs
            }
        }
        return uris;
    }

    protected void scheduleUpdateAllActionUIs() {
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                updater.updateAll();
            }
        });
    }

}