# HG changeset patch # User dadubrow # Date 1284409321 18000 # Node ID e9be28ae423abf6acee073a390d7256e492216a0 # Parent 2288674e819993b495be00e72a942bb10187d3c7 Bug 10645 - add p2 install operation for docs plugins diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/NewPluginChecker.java --- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/NewPluginChecker.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/NewPluginChecker.java Mon Sep 13 15:22:01 2010 -0500 @@ -22,21 +22,21 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWindow; -import com.nokia.carbide.cpp.internal.api.sdk.ISBSv1BuildInfo; -import com.nokia.carbide.cpp.internal.sdk.core.model.DynamicFeatureInstaller; +import com.nokia.carbide.cpp.internal.api.sdk.ISBSv2BuildInfo; import com.nokia.carbide.cpp.sdk.core.ISymbianBuilderID; import com.nokia.carbide.cpp.sdk.core.ISymbianSDK; import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin; import com.nokia.carbide.cpp.sdk.ui.SDKUIPlugin; +import com.nokia.carbide.internal.discovery.ui.p2.DynamicP2Installer; import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils; -@SuppressWarnings("restriction") public class NewPluginChecker { private static final String SDK_FEATURE_SUBDIR = "epoc32/kit"; //$NON-NLS-1$ @@ -54,16 +54,21 @@ boolean installed = false; boolean oneSDKWasScanned = false; for (ISymbianSDK sdk : sdkList) { - ISBSv1BuildInfo sbsv1BuildInfo = (ISBSv1BuildInfo)sdk.getBuildInfo(ISymbianBuilderID.SBSV1_BUILDER); - if (sbsv1BuildInfo != null) { - if (sbsv1BuildInfo.isPreviouslyScanned() == false) { + ISBSv2BuildInfo sbsv2BuildInfo = (ISBSv2BuildInfo)sdk.getBuildInfo(ISymbianBuilderID.SBSV2_BUILDER); + if (sbsv2BuildInfo != null) { + if (sbsv2BuildInfo.isPreviouslyScanned() == false) { oneSDKWasScanned = true; // XML was parsed, now try to run the feature installer - sbsv1BuildInfo.setPreviouslyScanned(true); + sbsv2BuildInfo.setPreviouslyScanned(true); File featureDir = new File(sdk.getEPOCROOT() + SDK_FEATURE_SUBDIR); try { - DynamicFeatureInstaller installer = new DynamicFeatureInstaller(featureDir, null); - if (installer.install()) { + IStatus status = DynamicP2Installer.install(featureDir, new NullProgressMonitor()); + if (status.isOK()) { + // TODO advise user?? + installed = true; + } + else if (status.getSeverity() == IStatus.CANCEL) { + // TODO was installed installed = true; } } catch (Exception e) { @@ -81,7 +86,7 @@ } if (installed) { // plugins from some SDK were installed - doEclipseRestartDialog(workbench); + //doEclipseRestartDialog(workbench); } return Status.OK_STATUS; diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPreferencePage.java --- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPreferencePage.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/sdk/ui/SDKPreferencePage.java Mon Sep 13 15:22:01 2010 -0500 @@ -71,6 +71,7 @@ import com.nokia.carbide.cpp.sdk.core.ISDKManager; import com.nokia.carbide.cpp.sdk.core.ISymbianSDK; import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin; +import com.nokia.carbide.cpp.sdk.ui.SDKUIPlugin; import com.nokia.carbide.cpp.sdk.ui.shared.AddSDKDialog; import com.nokia.carbide.cpp.ui.TextAndDialogCellEditor; import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils; @@ -536,6 +537,7 @@ addSDKComponentTableItems(); sdkListTableViewer.refresh(); selectSDKEntry(0); + NewPluginChecker.checkForNewlyInstalledPlugins(SDKUIPlugin.getDefault().getWorkbench()); rescanButton.setText(Messages.getString("SDKPreferencePage.Rescan_Button_Label")); //$NON-NLS-1$ rescanButton.setEnabled(true); } diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/SDKUIPlugin.java --- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/SDKUIPlugin.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/SDKUIPlugin.java Mon Sep 13 15:22:01 2010 -0500 @@ -28,6 +28,7 @@ import com.nokia.carbide.cpp.internal.api.sdk.ISDKManagerInternal; import com.nokia.carbide.cpp.internal.api.sdk.ui.SBSv1PlatformFilterComposite; import com.nokia.carbide.cpp.internal.sdk.core.model.SDKManager; +import com.nokia.carbide.cpp.internal.sdk.ui.NewPluginChecker; import com.nokia.carbide.cpp.internal.sdk.ui.SDKUIPreferenceConstants; import com.nokia.carbide.cpp.sdk.core.ISDKManager; import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin; @@ -60,6 +61,7 @@ */ public void start(BundleContext context) throws Exception { super.start(context); + NewPluginChecker.checkForNewlyInstalledPlugins(getWorkbench()); ISDKManager sdkMgr = SDKCorePlugin.getSDKManager(); if (HostOS.IS_WIN32){ diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/META-INF/MANIFEST.MF --- a/core/com.nokia.carbide.discovery.ui/META-INF/MANIFEST.MF Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.discovery.ui/META-INF/MANIFEST.MF Mon Sep 13 15:22:01 2010 -0500 @@ -8,6 +8,7 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.core.net;bundle-version="1.2.100", + org.eclipse.core.filesystem;bundle-version="1.3.0", org.eclipse.equinox.p2.discovery;bundle-version="1.0.0", org.eclipse.equinox.p2.discovery.compatibility;bundle-version="1.0.0", org.eclipse.equinox.p2.ui.discovery;bundle-version="1.0.0", @@ -17,6 +18,7 @@ org.eclipse.equinox.p2.metadata;bundle-version="2.0.0", org.eclipse.equinox.p2.repository;bundle-version="2.0.0", org.eclipse.equinox.p2.engine;bundle-version="2.0.0", + org.eclipse.equinox.p2.director;bundle-version="2.0.0", org.eclipse.jface.text, org.eclipse.ui.editors, org.eclipse.ui.forms;bundle-version="3.5.0", @@ -30,5 +32,6 @@ com.nokia.carbide.internal.discovery.ui.command;x-internal:=true, com.nokia.carbide.internal.discovery.ui.editor;x-internal:=true, com.nokia.carbide.internal.discovery.ui.extension;x-internal:=true, + com.nokia.carbide.internal.discovery.ui.p2;x-friends:="com.nokia.carbide.cpp.sdk.ui", com.nokia.carbide.internal.discovery.ui.view;x-internal:=true, com.nokia.carbide.internal.discovery.ui.wizard;x-friends:="com.nokia.carbide.cpp" diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/discovery/ui/Activator.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/discovery/ui/Activator.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/discovery/ui/Activator.java Mon Sep 13 15:22:01 2010 -0500 @@ -197,7 +197,10 @@ } public static IStatus makeErrorStatus(String message, Throwable t) { - return new Status(IStatus.ERROR, PLUGIN_ID, message, t); + return makeStatus(IStatus.ERROR, message, t); } + public static IStatus makeStatus(int severity, String message, Throwable t) { + return new Status(severity, PLUGIN_ID, message, t); + } } diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/DynamicP2Installer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/DynamicP2Installer.java Mon Sep 13 15:22:01 2010 -0500 @@ -0,0 +1,163 @@ +/* +* 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. +* +*/ + +package com.nokia.carbide.internal.discovery.ui.p2; + +import java.io.File; +import java.io.FileNotFoundException; +import java.net.URI; + +import org.eclipse.core.filesystem.URIUtil; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.equinox.internal.provisional.p2.director.IDirector; +import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; +import org.eclipse.equinox.p2.core.IProvisioningAgent; +import org.eclipse.equinox.p2.engine.IProfile; +import org.eclipse.equinox.p2.engine.IProfileRegistry; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.query.IQueryResult; +import org.eclipse.equinox.p2.query.QueryUtil; +import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager; +import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository; +import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager; +import org.eclipse.equinox.p2.ui.ProvisioningUI; + +import com.nokia.carbide.discovery.ui.Activator; + +/** + * Installer to install features from a p2 repository at a supplied URL or directory. + * + * The supplied directory should have as sub-directories features and plugins. These + * sub-directories in turn can contain any number of features and their corresponding + * plug-ins. + * + *

+ * e.g. + *

+ *

+ * <Feature Directory>
+ *               |
+ *               | --- artifacts.jar
+ *               | --- content.jar
+ *               |
+ *               ----<features>
+ *                   |
+ *                   |----<feature folder name>
+ *                        |
+ *                        |---features.xml file (contains list of feature jars)
+ *               ----<plugins>
+ *                        |
+ *                        ---jar files;
+ * 
+ */ + +@SuppressWarnings("restriction") +public class DynamicP2Installer { + + private IPath repositoryLocation; + private ProvisioningUI provisioningUI; + private IProvisioningAgent agent; + private IProfile profile; + + /** + * Performs the install. + * @param monitor An implementation of IProgressMonitor, usually showing the + * installation progress as a Progress Bar to the user. + */ + public static IStatus install(File repositoryDirectory, IProgressMonitor monitor) { + try { + DynamicP2Installer installer = new DynamicP2Installer(repositoryDirectory); + installer.doInstall(monitor); + return Status.OK_STATUS; + } catch (CoreException e) { + return e.getStatus(); + } catch (FileNotFoundException e) { + return Activator.makeErrorStatus(null, e); + } + } + + private DynamicP2Installer(File repositoryDirectory) throws FileNotFoundException { + checkRepository(repositoryDirectory); + repositoryLocation = new Path(repositoryDirectory.getAbsolutePath()); + provisioningUI = ProvisioningUI.getDefaultUI(); + agent = provisioningUI.getSession().getProvisioningAgent(); + profile = getProfile(); + } + + private void checkRepository(File repositoryDirectory) throws FileNotFoundException { + if (!repositoryDirectory.isDirectory()) { + throw new FileNotFoundException(repositoryDirectory + " is not a directory."); + } + if (!(new File(repositoryDirectory, "features").isDirectory())) { + throw new FileNotFoundException(repositoryDirectory + " missing \"features\" directory."); + } + if (!(new File(repositoryDirectory, "plugins").isDirectory())) { + throw new FileNotFoundException(repositoryDirectory + " missing \"plugins\" directory."); + } + if (!(new File(repositoryDirectory, "artifacts.jar").exists()) && !(new File(repositoryDirectory, "artifacts.xml").exists())) { + throw new FileNotFoundException(repositoryDirectory + " missing artifacts.jar."); + } + if (!(new File(repositoryDirectory, "content.jar").exists()) && !(new File(repositoryDirectory, "content.xml").exists())) { + throw new FileNotFoundException(repositoryDirectory + " missing content.jar."); + } + } + + private void doInstall(IProgressMonitor monitor) throws CoreException { + URI uri = URIUtil.toURI(repositoryLocation); + IMetadataRepositoryManager metadataRepoManager = + (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME); + IArtifactRepositoryManager artifactRepoManager = + (IArtifactRepositoryManager) agent.getService(IArtifactRepositoryManager.SERVICE_NAME); + try { + // add and load repository + metadataRepoManager.addRepository(uri); + IMetadataRepository metadataRepository = metadataRepoManager.loadRepository(uri, null); + artifactRepoManager.addRepository(uri); + artifactRepoManager.loadRepository(uri, null); + + // get IU from repository + IQueryResult units = metadataRepository.query(QueryUtil.createIUGroupQuery(), monitor); + if (units.isEmpty()) + throw new CoreException(Activator.makeErrorStatus("Could not find installable unit", null)); + + // check if installed + IQueryResult result = profile.query(QueryUtil.createIUQuery(units.iterator().next()), monitor); + if (!result.isEmpty()) + throw new CoreException(Activator.makeStatus(IStatus.CANCEL, null, null)); // already installed + + // do provisioning operation + ProfileChangeRequest request = new ProfileChangeRequest(profile); + request.addAll(units.toUnmodifiableSet()); + IDirector director = (IDirector) agent.getService(IDirector.SERVICE_NAME); + IStatus status = director.provision(request, null, monitor); + + if (!status.isOK()) + throw new CoreException(status); + } + finally { + metadataRepoManager.removeRepository(uri); + artifactRepoManager.removeRepository(uri); + } + } + + private IProfile getProfile() { + IProfileRegistry profileRegistry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME); + return profileRegistry.getProfile(provisioningUI.getProfileId()); + } + +} diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/FeatureInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/FeatureInfo.java Mon Sep 13 15:22:01 2010 -0500 @@ -0,0 +1,78 @@ +/* +* 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 org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.metadata.Version; + +public class FeatureInfo { + private String id; + private Version version; + + public FeatureInfo(IInstallableUnit iu) { + this(iu.getId(), iu.getVersion()); + } + + public FeatureInfo(String id, Version version) { + this.id = id; + this.version = version; + } + + public String getId() { + return id; + } + + public Version getVersion() { + return version; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((version == null) ? 0 : version.toString().hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + FeatureInfo other = (FeatureInfo) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (version == null) { + if (other.version != null) + return false; + } else if (!version.toString().equals(other.version.toString())) + return false; + return true; + } + + @Override + public String toString() { + return getId() + " " + getVersion().toString(); //$NON-NLS-1$ + } +} \ No newline at end of file diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/FeatureInstallOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/FeatureInstallOperation.java Mon Sep 13 15:22:01 2010 -0500 @@ -0,0 +1,163 @@ +/* + * 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 uris; + private Collection featureInfos; + private boolean wantVersions; + private ProvisioningUI provisioningUI; + private Collection repositories; + private Collection ius; + private Collection urisUsed; + + public FeatureInstallOperation(Collection uris, Collection 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 additions = operation.getProvisioningPlan().getAdditions(); + IQueryResult 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(); + 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(); + urisUsed = new HashSet(); + Set remainingInfos = new HashSet(featureInfos); + for (IMetadataRepository repository : repositories) { + checkIfCanceled(monitor); + IQueryResult iusInRepository = repository.query(QueryUtil.createIUGroupQuery(), monitor.newChild(1)); + for (FeatureInfo featureInfo : new HashSet(remainingInfos)) { + String id = featureInfo.getId(); + IQuery iuQuery = wantVersions ? + QueryUtil.createIUQuery(id, featureInfo.getVersion()) : + QueryUtil.createLatestQuery(QueryUtil.createIUQuery(id)); + IQueryResult 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(); + } + } +} diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/ImportExportData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/ImportExportData.java Mon Sep 13 15:22:01 2010 -0500 @@ -0,0 +1,47 @@ +package com.nokia.carbide.internal.discovery.ui.p2; + +import java.net.URI; +import java.util.Collection; +import java.util.HashSet; + + +public class ImportExportData { + private boolean wantsVersions; + private Collection uris; + private Collection featureInfos; + + public ImportExportData() { + uris = new HashSet(); + featureInfos = new HashSet(); + } + + public ImportExportData(boolean wantsVersions, Collection uris, Collection featureInfos) { + this.wantsVersions = wantsVersions; + this.uris = uris; + this.featureInfos = featureInfos; + } + + public void addURI(URI uri) { + uris.add(uri); + } + + public Collection getURIs() { + return uris; + } + + public void addFeatureInfo(FeatureInfo info) { + featureInfos.add(info); + } + + public Collection getFeatureInfos() { + return featureInfos; + } + + public void setWantsVersions(boolean wantsVersions) { + this.wantsVersions = wantsVersions; + } + + public boolean getWantsVersions() { + return wantsVersions; + } +} \ No newline at end of file diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/P2Utils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/P2Utils.java Mon Sep 13 15:22:01 2010 -0500 @@ -0,0 +1,99 @@ +/* +* 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.io.File; +import java.io.FileOutputStream; +import java.net.URI; +import java.net.URL; +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.equinox.p2.core.IProvisioningAgent; +import org.eclipse.equinox.p2.engine.IProfile; +import org.eclipse.equinox.p2.engine.IProfileRegistry; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.operations.ProvisioningSession; +import org.eclipse.equinox.p2.query.IQueryResult; +import org.eclipse.equinox.p2.query.QueryUtil; +import org.eclipse.equinox.p2.ui.ProvisioningUI; +import org.eclipse.osgi.service.datalocation.Location; + +import com.nokia.carbide.discovery.ui.Activator; +import com.nokia.carbide.discovery.ui.Messages; + +public class P2Utils { + + public static Collection getKnownRepositories() { + ProvisioningUI provisioningUI = ProvisioningUI.getDefaultUI(); + ProvisioningSession session = provisioningUI.getSession(); + URI[] uris = provisioningUI.getRepositoryTracker().getKnownRepositories(session); + return Arrays.asList(uris); + } + + public static Collection getInstalledFeatures(IProgressMonitor monitor) { + Set infos = new HashSet(); + ProvisioningUI provisioningUI = ProvisioningUI.getDefaultUI(); + ProvisioningSession session = provisioningUI.getSession(); + IProvisioningAgent agent = session.getProvisioningAgent(); + IProfileRegistry profileRegistry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME); + IProfile profile = null; + if (profileRegistry != null) { + profile = profileRegistry.getProfile(provisioningUI.getProfileId()); + if (profile != null) { + IQueryResult result = + profile.query(QueryUtil.createIUGroupQuery(), monitor); + for (Iterator iterator = result.iterator(); iterator.hasNext();) { + infos.add(new FeatureInfo((IInstallableUnit) iterator.next())); + } + } + } + return infos; + } + + public static void writeFeaturesToFile(File file) { + if (!file.exists()) { + Collection initialFeatures = P2Utils.getInstalledFeatures(new NullProgressMonitor()); + ImportExportData data = new ImportExportData(false, Collections.emptyList(), initialFeatures); + try { + Streamer.writeToXML(new FileOutputStream(file), data); + } catch (Exception e) { + Activator.logError(MessageFormat.format( + Messages.P2Utils_WriteInitialFeaturesFileError, file), e); + } + } + } + + public static File getInitialFeaturesFile() { + Location installLocation = Platform.getInstallLocation(); + URL url = installLocation.getURL(); + IPath path = new Path(url.getPath()); + path = path.append("configuration/initialFeatures.xml"); //$NON-NLS-1$ + File file = path.toFile(); + return file; + } +} diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/Streamer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/p2/Streamer.java Mon Sep 13 15:22:01 2010 -0500 @@ -0,0 +1,145 @@ +/* +* 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.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.text.MessageFormat; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.eclipse.equinox.p2.metadata.Version; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.nokia.carbide.discovery.ui.Activator; +import com.nokia.carbide.discovery.ui.Messages; + +/** + * Serializes feature infos and repository URIs into output stream as XML + * Example serialized single test connection: + * + *
+ *<featuresConfiguration version="1">
+ *	<autoImportOriginalVersions value="false"/>
+ *	<repository uri="http://cdn.symbian.org/carbide/updates/3.0/discovery"/>
+ *	<feature id="com.nokia.example.feature.group" version="1.0.0"/>
+ *</featuresConfiguration>
+ * 
+ */ +public class Streamer { + + private static final String CURRENT_VERSION = "1"; //$NON-NLS-1$ + + private static final String ROOT_ELEMENT = "featuresConfiguration"; //$NON-NLS-1$ + private static final String WANTS_VERSIONS_ELEMENT = "wantsOriginalVersions"; //$NON-NLS-1$ + private static final String REPOSITORY_ELEMENT = "repository"; //$NON-NLS-1$ + private static final String FEATURE_ELEMENT = "feature"; //$NON-NLS-1$ + + private static final String VERSION_ATTR = "version"; //$NON-NLS-1$ + private static final String VALUE_ATTR = "value"; //$NON-NLS-1$ + private static final String URI_ATTR = "uri"; //$NON-NLS-1$ + private static final String ID_ATTR = "id"; //$NON-NLS-1$ + + private static final String XML_HEADER = "\n\n"; //$NON-NLS-1$ + + private static final String ROOT_START = "<" + ROOT_ELEMENT + " " + VERSION_ATTR + "=\"" + CURRENT_VERSION + "\">\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + private static final String ROOT_END = "\n"; //$NON-NLS-1$ //$NON-NLS-2$ + + private static final String ORIGINAL_VERSION_FMT = "\t<" + WANTS_VERSIONS_ELEMENT + " " + VALUE_ATTR + "=\"{0}\"/>\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + private static final String REPOSITORY_FMT = "\t<" + REPOSITORY_ELEMENT + " " + URI_ATTR + "=\"{0}\"/>\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + private static final String FEATURE_FMT = "\t<" + FEATURE_ELEMENT + " " + ID_ATTR + "=\"{0}\" " + VERSION_ATTR + "=\"{1}\"/>\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + public static void writeToXML(OutputStream os, ImportExportData data) throws IOException { + os.write(XML_HEADER.getBytes()); + os.write(ROOT_START.getBytes()); + + // write auto-import original versions + String originalVersionElement = MessageFormat.format(ORIGINAL_VERSION_FMT, data.getWantsVersions()); + os.write(originalVersionElement.getBytes()); + + // write the repositories + for (URI uri : data.getURIs()) { + String repositoryElement = MessageFormat.format(REPOSITORY_FMT, uri); + os.write(repositoryElement.getBytes()); + } + + // write the featureInfos + for (FeatureInfo info : data.getFeatureInfos()) { + String featureElement = MessageFormat.format(FEATURE_FMT, info.getId(), info.getVersion()); + os.write(featureElement.getBytes()); + } + + os.write(ROOT_END.getBytes()); + os.close(); + } + + private static class ReadHandler extends DefaultHandler { + + private final ImportExportData data; + + public ReadHandler(ImportExportData data) { + this.data = data; + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (ROOT_ELEMENT.equals(qName)) { + String versionStr = attributes.getValue(VERSION_ATTR); + if (!CURRENT_VERSION.equals(versionStr)) + throw new IllegalArgumentException( + MessageFormat.format(Messages.Streamer_BadVersionError, CURRENT_VERSION, ROOT_ELEMENT)); + } + else if (WANTS_VERSIONS_ELEMENT.equals(qName)) { + String wantsVersions = attributes.getValue(VALUE_ATTR); + data.setWantsVersions(Boolean.parseBoolean(wantsVersions)); + } + else if (REPOSITORY_ELEMENT.equals(qName)) { + String uriStr = attributes.getValue(URI_ATTR); + try { + data.addURI(new URI(uriStr)); + } catch (URISyntaxException e) { + Activator.logError(MessageFormat.format(Messages.Streamer_BadURIError, uriStr), e); + } + } + else if (FEATURE_ELEMENT.equals(qName)) { + String id = attributes.getValue(ID_ATTR); + String versionStr = attributes.getValue(VERSION_ATTR); + try { + Version version = Version.create(versionStr); + data.addFeatureInfo(new FeatureInfo(id, version)); + } catch (IllegalArgumentException e) { + Activator.logError(MessageFormat.format(Messages.Streamer_VersionParseError, versionStr), e); + } + } + } + } + + public static ImportExportData readFromXML(InputStream is) throws SAXException, IOException, ParserConfigurationException { + SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); + ImportExportData data = new ImportExportData(); + parser.parse(is, new ReadHandler(data)); + return data; + } + +} diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/AbstractImportExportPage.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/AbstractImportExportPage.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/AbstractImportExportPage.java Mon Sep 13 15:22:01 2010 -0500 @@ -48,6 +48,7 @@ import com.nokia.carbide.discovery.ui.Activator; import com.nokia.carbide.discovery.ui.Messages; +import com.nokia.carbide.internal.discovery.ui.p2.FeatureInfo; /** * Abstract superclass of import and export page diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ExportPage.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ExportPage.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ExportPage.java Mon Sep 13 15:22:01 2010 -0500 @@ -38,6 +38,8 @@ import org.eclipse.ui.progress.UIJob; import com.nokia.carbide.discovery.ui.Messages; +import com.nokia.carbide.internal.discovery.ui.p2.FeatureInfo; +import com.nokia.carbide.internal.discovery.ui.p2.P2Utils; import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils; /** diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ExportWizard.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ExportWizard.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ExportWizard.java Mon Sep 13 15:22:01 2010 -0500 @@ -34,6 +34,10 @@ import com.nokia.carbide.discovery.ui.Activator; import com.nokia.carbide.discovery.ui.Messages; +import com.nokia.carbide.internal.discovery.ui.p2.FeatureInfo; +import com.nokia.carbide.internal.discovery.ui.p2.ImportExportData; +import com.nokia.carbide.internal.discovery.ui.p2.P2Utils; +import com.nokia.carbide.internal.discovery.ui.p2.Streamer; /** * Wizard for exporting installed features to a file diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/FeatureInfo.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/FeatureInfo.java Mon Sep 13 15:01:12 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* -* 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.wizard; - -import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.metadata.Version; - -class FeatureInfo { - private String id; - private Version version; - - public FeatureInfo(IInstallableUnit iu) { - this(iu.getId(), iu.getVersion()); - } - - public FeatureInfo(String id, Version version) { - this.id = id; - this.version = version; - } - - public String getId() { - return id; - } - - public Version getVersion() { - return version; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((version == null) ? 0 : version.toString().hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - FeatureInfo other = (FeatureInfo) obj; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; - if (version == null) { - if (other.version != null) - return false; - } else if (!version.toString().equals(other.version.toString())) - return false; - return true; - } - - @Override - public String toString() { - return getId() + " " + getVersion().toString(); //$NON-NLS-1$ - } -} \ No newline at end of file diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/FeatureInstallOperation.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/FeatureInstallOperation.java Mon Sep 13 15:01:12 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,163 +0,0 @@ -/* - * 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.wizard; - -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; - -class FeatureInstallOperation implements IRunnableWithProgress { - - private Collection uris; - private Collection featureInfos; - private boolean wantVersions; - private ProvisioningUI provisioningUI; - private Collection repositories; - private Collection ius; - private Collection urisUsed; - - public FeatureInstallOperation(Collection uris, Collection 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 additions = operation.getProvisioningPlan().getAdditions(); - IQueryResult 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(); - 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(); - urisUsed = new HashSet(); - Set remainingInfos = new HashSet(featureInfos); - for (IMetadataRepository repository : repositories) { - checkIfCanceled(monitor); - IQueryResult iusInRepository = repository.query(QueryUtil.createIUGroupQuery(), monitor.newChild(1)); - for (FeatureInfo featureInfo : new HashSet(remainingInfos)) { - String id = featureInfo.getId(); - IQuery iuQuery = wantVersions ? - QueryUtil.createIUQuery(id, featureInfo.getVersion()) : - QueryUtil.createLatestQuery(QueryUtil.createIUQuery(id)); - IQueryResult 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(); - } - } -} diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ImportExportData.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ImportExportData.java Mon Sep 13 15:01:12 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -package com.nokia.carbide.internal.discovery.ui.wizard; - -import java.net.URI; -import java.util.Collection; -import java.util.HashSet; - -class ImportExportData { - private boolean wantsVersions; - private Collection uris; - private Collection featureInfos; - - public ImportExportData() { - uris = new HashSet(); - featureInfos = new HashSet(); - } - - public ImportExportData(boolean wantsVersions, Collection uris, Collection featureInfos) { - this.wantsVersions = wantsVersions; - this.uris = uris; - this.featureInfos = featureInfos; - } - - public void addURI(URI uri) { - uris.add(uri); - } - - public Collection getURIs() { - return uris; - } - - public void addFeatureInfo(FeatureInfo info) { - featureInfos.add(info); - } - - public Collection getFeatureInfos() { - return featureInfos; - } - - public void setWantsVersions(boolean wantsVersions) { - this.wantsVersions = wantsVersions; - } - - public boolean getWantsVersions() { - return wantsVersions; - } -} \ No newline at end of file diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ImportPage.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ImportPage.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ImportPage.java Mon Sep 13 15:22:01 2010 -0500 @@ -44,6 +44,9 @@ import com.nokia.carbide.discovery.ui.Activator; import com.nokia.carbide.discovery.ui.Messages; +import com.nokia.carbide.internal.discovery.ui.p2.FeatureInfo; +import com.nokia.carbide.internal.discovery.ui.p2.ImportExportData; +import com.nokia.carbide.internal.discovery.ui.p2.Streamer; import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils; /** diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ImportWizard.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ImportWizard.java Mon Sep 13 15:01:12 2010 -0500 +++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/ImportWizard.java Mon Sep 13 15:22:01 2010 -0500 @@ -30,6 +30,7 @@ import com.nokia.carbide.discovery.ui.Activator; import com.nokia.carbide.discovery.ui.Messages; +import com.nokia.carbide.internal.discovery.ui.p2.FeatureInstallOperation; /** * Wizard for importing installed features from a file and install them diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/P2Utils.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/P2Utils.java Mon Sep 13 15:01:12 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -/* -* 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.wizard; - -import java.io.File; -import java.io.FileOutputStream; -import java.net.URI; -import java.net.URL; -import java.text.MessageFormat; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.equinox.p2.core.IProvisioningAgent; -import org.eclipse.equinox.p2.engine.IProfile; -import org.eclipse.equinox.p2.engine.IProfileRegistry; -import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.operations.ProvisioningSession; -import org.eclipse.equinox.p2.query.IQueryResult; -import org.eclipse.equinox.p2.query.QueryUtil; -import org.eclipse.equinox.p2.ui.ProvisioningUI; -import org.eclipse.osgi.service.datalocation.Location; - -import com.nokia.carbide.discovery.ui.Activator; -import com.nokia.carbide.discovery.ui.Messages; - -public class P2Utils { - - public static Collection getKnownRepositories() { - ProvisioningUI provisioningUI = ProvisioningUI.getDefaultUI(); - ProvisioningSession session = provisioningUI.getSession(); - URI[] uris = provisioningUI.getRepositoryTracker().getKnownRepositories(session); - return Arrays.asList(uris); - } - - public static Collection getInstalledFeatures(IProgressMonitor monitor) { - Set infos = new HashSet(); - ProvisioningUI provisioningUI = ProvisioningUI.getDefaultUI(); - ProvisioningSession session = provisioningUI.getSession(); - IProvisioningAgent agent = session.getProvisioningAgent(); - IProfileRegistry profileRegistry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME); - IProfile profile = null; - if (profileRegistry != null) { - profile = profileRegistry.getProfile(provisioningUI.getProfileId()); - if (profile != null) { - IQueryResult result = - profile.query(QueryUtil.createIUGroupQuery(), monitor); - for (Iterator iterator = result.iterator(); iterator.hasNext();) { - infos.add(new FeatureInfo((IInstallableUnit) iterator.next())); - } - } - } - return infos; - } - - public static void writeFeaturesToFile(File file) { - if (!file.exists()) { - Collection initialFeatures = P2Utils.getInstalledFeatures(new NullProgressMonitor()); - ImportExportData data = new ImportExportData(false, Collections.emptyList(), initialFeatures); - try { - Streamer.writeToXML(new FileOutputStream(file), data); - } catch (Exception e) { - Activator.logError(MessageFormat.format( - Messages.P2Utils_WriteInitialFeaturesFileError, file), e); - } - } - } - - public static File getInitialFeaturesFile() { - Location installLocation = Platform.getInstallLocation(); - URL url = installLocation.getURL(); - IPath path = new Path(url.getPath()); - path = path.append("configuration/initialFeatures.xml"); //$NON-NLS-1$ - File file = path.toFile(); - return file; - } -} diff -r 2288674e8199 -r e9be28ae423a core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/Streamer.java --- a/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/wizard/Streamer.java Mon Sep 13 15:01:12 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/* -* 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.wizard; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.text.MessageFormat; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.eclipse.equinox.p2.metadata.Version; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import com.nokia.carbide.discovery.ui.Activator; -import com.nokia.carbide.discovery.ui.Messages; - -/** - * Serializes feature infos and repository URIs into output stream as XML - * Example serialized single test connection: - * - *
- *<featuresConfiguration version="1">
- *	<autoImportOriginalVersions value="false"/>
- *	<repository uri="http://cdn.symbian.org/carbide/updates/3.0/discovery"/>
- *	<feature id="com.nokia.example.feature.group" version="1.0.0"/>
- *</featuresConfiguration>
- * 
- */ -class Streamer { - - private static final String CURRENT_VERSION = "1"; //$NON-NLS-1$ - - private static final String ROOT_ELEMENT = "featuresConfiguration"; //$NON-NLS-1$ - private static final String WANTS_VERSIONS_ELEMENT = "wantsOriginalVersions"; //$NON-NLS-1$ - private static final String REPOSITORY_ELEMENT = "repository"; //$NON-NLS-1$ - private static final String FEATURE_ELEMENT = "feature"; //$NON-NLS-1$ - - private static final String VERSION_ATTR = "version"; //$NON-NLS-1$ - private static final String VALUE_ATTR = "value"; //$NON-NLS-1$ - private static final String URI_ATTR = "uri"; //$NON-NLS-1$ - private static final String ID_ATTR = "id"; //$NON-NLS-1$ - - private static final String XML_HEADER = "\n\n"; //$NON-NLS-1$ - - private static final String ROOT_START = "<" + ROOT_ELEMENT + " " + VERSION_ATTR + "=\"" + CURRENT_VERSION + "\">\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - private static final String ROOT_END = "\n"; //$NON-NLS-1$ //$NON-NLS-2$ - - private static final String ORIGINAL_VERSION_FMT = "\t<" + WANTS_VERSIONS_ELEMENT + " " + VALUE_ATTR + "=\"{0}\"/>\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - private static final String REPOSITORY_FMT = "\t<" + REPOSITORY_ELEMENT + " " + URI_ATTR + "=\"{0}\"/>\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - private static final String FEATURE_FMT = "\t<" + FEATURE_ELEMENT + " " + ID_ATTR + "=\"{0}\" " + VERSION_ATTR + "=\"{1}\"/>\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - public static void writeToXML(OutputStream os, ImportExportData data) throws IOException { - os.write(XML_HEADER.getBytes()); - os.write(ROOT_START.getBytes()); - - // write auto-import original versions - String originalVersionElement = MessageFormat.format(ORIGINAL_VERSION_FMT, data.getWantsVersions()); - os.write(originalVersionElement.getBytes()); - - // write the repositories - for (URI uri : data.getURIs()) { - String repositoryElement = MessageFormat.format(REPOSITORY_FMT, uri); - os.write(repositoryElement.getBytes()); - } - - // write the featureInfos - for (FeatureInfo info : data.getFeatureInfos()) { - String featureElement = MessageFormat.format(FEATURE_FMT, info.getId(), info.getVersion()); - os.write(featureElement.getBytes()); - } - - os.write(ROOT_END.getBytes()); - os.close(); - } - - private static class ReadHandler extends DefaultHandler { - - private final ImportExportData data; - - public ReadHandler(ImportExportData data) { - this.data = data; - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if (ROOT_ELEMENT.equals(qName)) { - String versionStr = attributes.getValue(VERSION_ATTR); - if (!CURRENT_VERSION.equals(versionStr)) - throw new IllegalArgumentException( - MessageFormat.format(Messages.Streamer_BadVersionError, CURRENT_VERSION, ROOT_ELEMENT)); - } - else if (WANTS_VERSIONS_ELEMENT.equals(qName)) { - String wantsVersions = attributes.getValue(VALUE_ATTR); - data.setWantsVersions(Boolean.parseBoolean(wantsVersions)); - } - else if (REPOSITORY_ELEMENT.equals(qName)) { - String uriStr = attributes.getValue(URI_ATTR); - try { - data.addURI(new URI(uriStr)); - } catch (URISyntaxException e) { - Activator.logError(MessageFormat.format(Messages.Streamer_BadURIError, uriStr), e); - } - } - else if (FEATURE_ELEMENT.equals(qName)) { - String id = attributes.getValue(ID_ATTR); - String versionStr = attributes.getValue(VERSION_ATTR); - try { - Version version = Version.create(versionStr); - data.addFeatureInfo(new FeatureInfo(id, version)); - } catch (IllegalArgumentException e) { - Activator.logError(MessageFormat.format(Messages.Streamer_VersionParseError, versionStr), e); - } - } - } - } - - public static ImportExportData readFromXML(InputStream is) throws SAXException, IOException, ParserConfigurationException { - SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); - ImportExportData data = new ImportExportData(); - parser.parse(is, new ReadHandler(data)); - return data; - } - -}