com.nokia.carbide.internal.discovery.ui.p2.FeatureInstallOperation.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.internal.discovery.ui.p2.FeatureInstallOperation.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.p2;

import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.operations.InstallOperation;
import org.eclipse.equinox.p2.operations.ProvisioningSession;
import org.eclipse.equinox.p2.operations.RepositoryTracker;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.query.IQueryResult;
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.equinox.p2.ui.ProvisioningUI;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Display;

import com.nokia.carbide.discovery.ui.Messages;

public class FeatureInstallOperation implements IRunnableWithProgress {

    private Collection<URI> uris;
    private Collection<FeatureInfo> featureInfos;
    private boolean wantVersions;
    private ProvisioningUI provisioningUI;
    private Collection<IMetadataRepository> repositories;
    private Collection<IInstallableUnit> ius;
    private Collection<URI> urisUsed;

    public FeatureInstallOperation(Collection<URI> uris, Collection<FeatureInfo> featureInfos,
            boolean wantVersions) {
        this.uris = uris;
        this.featureInfos = featureInfos;
        this.wantVersions = wantVersions;
        provisioningUI = ProvisioningUI.getDefaultUI();
    }

    @Override
    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        try {
            doInstall(monitor);
        } catch (OperationCanceledException e) {
            throw new InterruptedException();
        } catch (CoreException e) {
            throw new InvocationTargetException(e);
        }
    }

    public void doInstall(IProgressMonitor monitor) throws OperationCanceledException, CoreException {
        SubMonitor subMonitor = SubMonitor.convert(monitor, Messages.FeatureInstallOperation_ConfiguringTaskName,
                100);
        getRepositories(subMonitor.newChild(30));
        findInstallableUnits(subMonitor.newChild(40));
        final InstallOperation operation = resolve(subMonitor.newChild(30));
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                IQueryable<IInstallableUnit> additions = operation.getProvisioningPlan().getAdditions();
                IQueryResult<IInstallableUnit> result = additions.query(QueryUtil.createIUGroupQuery(),
                        new NullProgressMonitor());
                provisioningUI.openInstallWizard(result.toSet(), operation, null);
            }
        });
    }

    private void getRepositories(SubMonitor monitor) throws ProvisionException, OperationCanceledException {
        monitor.setWorkRemaining(uris.size());
        repositories = new ArrayList<IMetadataRepository>();
        ProvisioningSession session = provisioningUI.getSession();
        RepositoryTracker repositoryTracker = provisioningUI.getRepositoryTracker();
        IMetadataRepositoryManager manager = (IMetadataRepositoryManager) session.getProvisioningAgent()
                .getService(IMetadataRepositoryManager.SERVICE_NAME);
        for (URI uri : uris) {
            checkIfCanceled(monitor);
            repositoryTracker.addRepository(uri, null, session);
            repositories.add(manager.loadRepository(uri, monitor.newChild(1)));
        }
    }

    private void findInstallableUnits(SubMonitor monitor) throws ProvisionException {
        monitor.setWorkRemaining(repositories.size() * featureInfos.size());
        ius = new ArrayList<IInstallableUnit>();
        urisUsed = new HashSet<URI>();
        Set<FeatureInfo> remainingInfos = new HashSet<FeatureInfo>(featureInfos);
        for (IMetadataRepository repository : repositories) {
            checkIfCanceled(monitor);
            IQueryResult<IInstallableUnit> iusInRepository = repository.query(QueryUtil.createIUGroupQuery(),
                    monitor.newChild(1));
            for (FeatureInfo featureInfo : new HashSet<FeatureInfo>(remainingInfos)) {
                String id = featureInfo.getId();
                IQuery<IInstallableUnit> iuQuery = wantVersions
                        ? QueryUtil.createIUQuery(id, featureInfo.getVersion())
                        : QueryUtil.createLatestQuery(QueryUtil.createIUQuery(id));
                IQueryResult<IInstallableUnit> result = iusInRepository.query(iuQuery, monitor.newChild(1));
                if (!result.isEmpty()) {
                    ius.add(result.iterator().next());
                    urisUsed.add(repository.getLocation());
                    remainingInfos.remove(featureInfo);
                    if (remainingInfos.isEmpty())
                        break;
                }
            }
        }

        if (!remainingInfos.isEmpty()) {
            StringBuilder sb = new StringBuilder();
            sb.append(Messages.FeatureInstallOperation_MissingFeaturesError);
            for (FeatureInfo featureInfo : remainingInfos) {
                sb.append(Messages.FeatureInstallOperation_IdLabel);
                sb.append(featureInfo.getId());
                if (wantVersions) {
                    sb.append(Messages.FeatureInstallOperation_VersionLabel);
                    sb.append(featureInfo.getVersion().toString());
                }
                sb.append("\n"); //$NON-NLS-1$
            }
            throw new ProvisionException(sb.toString());
        }
        monitor.done();
    }

    private InstallOperation resolve(SubMonitor monitor) throws CoreException {
        checkIfCanceled(monitor);
        URI[] uris = (URI[]) urisUsed.toArray(new URI[urisUsed.size()]);
        InstallOperation installOperation = provisioningUI.getInstallOperation(ius, uris);
        IStatus operationStatus = installOperation.resolveModal(monitor);
        if (operationStatus.getSeverity() > IStatus.WARNING) {
            throw new CoreException(operationStatus);
        }
        return installOperation;
    }

    private void checkIfCanceled(IProgressMonitor monitor) {
        if (monitor.isCanceled()) {
            throw new OperationCanceledException();
        }
    }
}