core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/FeatureInstallOperation.java
author dadubrow
Fri, 13 Aug 2010 13:39:46 -0500
changeset 1826 48569468eaf3
parent 1824 7e34f628583a
permissions -rw-r--r--
fix some minor issues
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1824
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     1
/*
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     3
 * All rights reserved.
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     5
 * under the terms of the License "Eclipse Public License v1.0"
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     8
 *
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
     9
 * Initial Contributors:
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    11
 *
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    12
 * Contributors:
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    13
 *
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    14
 * Description: 
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    15
 *
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    16
 */
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    17
package com.nokia.carbide.internal.discovery.ui.wizard;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    18
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    19
import java.lang.reflect.InvocationTargetException;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    20
import java.net.URI;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    21
import java.util.ArrayList;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    22
import java.util.Collection;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    23
import java.util.HashSet;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    24
import java.util.Set;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    25
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    26
import org.eclipse.core.runtime.CoreException;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    27
import org.eclipse.core.runtime.IProgressMonitor;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    28
import org.eclipse.core.runtime.IStatus;
1826
48569468eaf3 fix some minor issues
dadubrow
parents: 1824
diff changeset
    29
import org.eclipse.core.runtime.NullProgressMonitor;
1824
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    30
import org.eclipse.core.runtime.OperationCanceledException;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    31
import org.eclipse.core.runtime.SubMonitor;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    32
import org.eclipse.equinox.p2.core.ProvisionException;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    33
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    34
import org.eclipse.equinox.p2.operations.InstallOperation;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    35
import org.eclipse.equinox.p2.operations.ProvisioningSession;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    36
import org.eclipse.equinox.p2.operations.RepositoryTracker;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    37
import org.eclipse.equinox.p2.query.IQuery;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    38
import org.eclipse.equinox.p2.query.IQueryResult;
1826
48569468eaf3 fix some minor issues
dadubrow
parents: 1824
diff changeset
    39
import org.eclipse.equinox.p2.query.IQueryable;
1824
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    40
import org.eclipse.equinox.p2.query.QueryUtil;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    41
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    42
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    43
import org.eclipse.equinox.p2.ui.ProvisioningUI;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    44
import org.eclipse.jface.operation.IRunnableWithProgress;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    45
import org.eclipse.swt.widgets.Display;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    46
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    47
import com.nokia.carbide.discovery.ui.Messages;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    48
1826
48569468eaf3 fix some minor issues
dadubrow
parents: 1824
diff changeset
    49
class FeatureInstallOperation implements IRunnableWithProgress {
1824
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    50
	
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    51
	private Collection<URI> uris;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    52
	private Collection<FeatureInfo> featureInfos;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    53
	private boolean wantVersions;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    54
	private ProvisioningUI provisioningUI;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    55
	private Collection<IMetadataRepository> repositories;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    56
	private Collection<IInstallableUnit> ius;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    57
	private Collection<URI> urisUsed;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    58
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    59
	public FeatureInstallOperation(Collection<URI> uris, Collection<FeatureInfo> featureInfos, boolean wantVersions) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    60
		this.uris = uris;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    61
		this.featureInfos = featureInfos;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    62
		this.wantVersions = wantVersions;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    63
		provisioningUI = ProvisioningUI.getDefaultUI();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    64
	}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    65
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    66
	@Override
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    67
	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    68
		try {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    69
			doInstall(monitor);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    70
		} catch (OperationCanceledException e) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    71
			throw new InterruptedException();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    72
		} catch (CoreException e) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    73
			throw new InvocationTargetException(e);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    74
		}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    75
	}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    76
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    77
	public void doInstall(IProgressMonitor monitor) throws OperationCanceledException, CoreException {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    78
		SubMonitor subMonitor = SubMonitor.convert(monitor, Messages.FeatureInstallOperation_ConfiguringTaskName, 100);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    79
		getRepositories(subMonitor.newChild(30));
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    80
		findInstallableUnits(subMonitor.newChild(40));
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    81
		final InstallOperation operation = resolve(subMonitor.newChild(30));
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    82
		Display.getDefault().asyncExec(new Runnable() {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    83
			@Override
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    84
			public void run() {
1826
48569468eaf3 fix some minor issues
dadubrow
parents: 1824
diff changeset
    85
				IQueryable<IInstallableUnit> additions = operation.getProvisioningPlan().getAdditions();
48569468eaf3 fix some minor issues
dadubrow
parents: 1824
diff changeset
    86
				IQueryResult<IInstallableUnit> result = additions.query(QueryUtil.createIUGroupQuery(), new NullProgressMonitor());
48569468eaf3 fix some minor issues
dadubrow
parents: 1824
diff changeset
    87
				provisioningUI.openInstallWizard(result.toSet(), operation, null);
1824
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    88
			}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    89
		});
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    90
	}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    91
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    92
	private void getRepositories(SubMonitor monitor) throws ProvisionException, OperationCanceledException {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    93
		monitor.setWorkRemaining(uris.size());
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    94
		repositories = new ArrayList<IMetadataRepository>();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    95
		ProvisioningSession session = provisioningUI.getSession();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    96
		RepositoryTracker repositoryTracker = provisioningUI.getRepositoryTracker();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    97
		IMetadataRepositoryManager manager = 
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    98
			(IMetadataRepositoryManager) session.getProvisioningAgent().getService(IMetadataRepositoryManager.SERVICE_NAME);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
    99
		for (URI uri : uris) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   100
			checkIfCanceled(monitor);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   101
			repositoryTracker.addRepository(uri, null, session);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   102
			repositories.add(manager.loadRepository(uri, monitor.newChild(1)));
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   103
		}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   104
	}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   105
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   106
	private void findInstallableUnits(SubMonitor monitor) throws ProvisionException {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   107
		monitor.setWorkRemaining(repositories.size() * featureInfos.size());
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   108
		ius = new ArrayList<IInstallableUnit>();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   109
		urisUsed = new HashSet<URI>();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   110
		Set<FeatureInfo> remainingInfos = new HashSet<FeatureInfo>(featureInfos);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   111
		for (IMetadataRepository repository : repositories) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   112
			checkIfCanceled(monitor);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   113
			IQueryResult<IInstallableUnit> iusInRepository = repository.query(QueryUtil.createIUGroupQuery(), monitor.newChild(1));
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   114
			for (FeatureInfo featureInfo : new HashSet<FeatureInfo>(remainingInfos)) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   115
				String id = featureInfo.getId();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   116
				IQuery<IInstallableUnit> iuQuery = wantVersions ?
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   117
					QueryUtil.createIUQuery(id, featureInfo.getVersion()) :
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   118
					QueryUtil.createLatestQuery(QueryUtil.createIUQuery(id));
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   119
				IQueryResult<IInstallableUnit> result = iusInRepository.query(iuQuery, monitor.newChild(1));
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   120
				if (!result.isEmpty()) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   121
					ius.add(result.iterator().next());
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   122
					urisUsed.add(repository.getLocation());
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   123
					remainingInfos.remove(featureInfo);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   124
					if (remainingInfos.isEmpty())
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   125
						break;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   126
				}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   127
			}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   128
		}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   129
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   130
		if (!remainingInfos.isEmpty()) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   131
			StringBuilder sb = new StringBuilder();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   132
			sb.append(Messages.FeatureInstallOperation_MissingFeaturesError);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   133
			for (FeatureInfo featureInfo : remainingInfos) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   134
				sb.append(Messages.FeatureInstallOperation_IdLabel);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   135
				sb.append(featureInfo.getId());
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   136
				if (wantVersions) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   137
					sb.append(Messages.FeatureInstallOperation_VersionLabel);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   138
					sb.append(featureInfo.getVersion().toString());
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   139
				}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   140
				sb.append("\n"); //$NON-NLS-1$
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   141
			}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   142
			throw new ProvisionException(sb.toString());
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   143
		}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   144
		monitor.done();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   145
	}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   146
	
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   147
	private InstallOperation resolve(SubMonitor monitor) throws CoreException {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   148
		checkIfCanceled(monitor);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   149
		URI[] uris = (URI[]) urisUsed.toArray(new URI[urisUsed.size()]);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   150
		InstallOperation installOperation = provisioningUI.getInstallOperation(ius, uris);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   151
		IStatus operationStatus = installOperation.resolveModal(monitor);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   152
		if (operationStatus.getSeverity() > IStatus.WARNING) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   153
			throw new CoreException(operationStatus);
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   154
		}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   155
		return installOperation;
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   156
	}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   157
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   158
	private void checkIfCanceled(IProgressMonitor monitor) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   159
		if (monitor.isCanceled()) {
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   160
			throw new OperationCanceledException();
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   161
		}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   162
	}
7e34f628583a update import wizard and operation
dadubrow
parents:
diff changeset
   163
}