diff options
author | Pascal Rapicault | 2010-01-13 17:29:41 +0000 |
---|---|---|
committer | Pascal Rapicault | 2010-01-13 17:29:41 +0000 |
commit | 18189f0d42f7375660762dc6c885cf31683ae562 (patch) | |
tree | 17775d847bed9a33f3c68b74db2df75a2139c0bc /examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate | |
parent | c363f2984a09b73c422e38f4556fd3b23eafe958 (diff) | |
download | rt.equinox.p2-18189f0d42f7375660762dc6c885cf31683ae562.tar.gz rt.equinox.p2-18189f0d42f7375660762dc6c885cf31683ae562.tar.xz rt.equinox.p2-18189f0d42f7375660762dc6c885cf31683ae562.zip |
Merging api branch back to HEADv20100113
Diffstat (limited to 'examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate')
4 files changed, 72 insertions, 196 deletions
diff --git a/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/.settings/org.eclipse.jdt.core.prefs index 337c4649f..92bb3f369 100644 --- a/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/.settings/org.eclipse.jdt.core.prefs +++ b/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,7 @@ #Mon Mar 16 12:12:08 PDT 2009 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=jsr14 org.eclipse.jdt.core.compiler.compliance=1.5 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error diff --git a/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/META-INF/MANIFEST.MF b/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/META-INF/MANIFEST.MF index 8f4e5b0d1..6ee61c3c6 100644 --- a/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/META-INF/MANIFEST.MF +++ b/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/META-INF/MANIFEST.MF @@ -6,15 +6,9 @@ Bundle-Version: 1.0.0.qualifier Bundle-Activator: org.eclipse.equinox.p2.examples.rcp.prestartupdate.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, - org.eclipse.equinox.p2.metadata;bundle-version="1.0.0", - org.eclipse.equinox.p2.metadata.repository;bundle-version="1.0.0", - org.eclipse.equinox.p2.artifact.repository;bundle-version="1.0.0", - org.eclipse.equinox.p2.repository;bundle-version="1.0.0", - org.eclipse.equinox.p2.extensionlocation;bundle-version="1.0.100", - org.eclipse.equinox.p2.updatesite;bundle-version="1.0.0", - org.eclipse.equinox.p2.director;bundle-version="1.0.100", - org.eclipse.equinox.p2.engine;bundle-version="1.0.100", - org.eclipse.equinox.p2.core;bundle-version="1.0.100", + org.eclipse.equinox.p2.core, + org.eclipse.equinox.p2.metadata, + org.eclipse.equinox.p2.operations, org.eclipse.ecf;bundle-version="3.0.0", org.eclipse.ecf.filetransfer;bundle-version="3.0.0", org.eclipse.ecf.identity;bundle-version="3.0.0", diff --git a/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/src/org/eclipse/equinox/p2/examples/rcp/prestartupdate/ApplicationWorkbenchAdvisor.java b/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/src/org/eclipse/equinox/p2/examples/rcp/prestartupdate/ApplicationWorkbenchAdvisor.java index c5f04b9b9..2ebb4ff39 100644 --- a/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/src/org/eclipse/equinox/p2/examples/rcp/prestartupdate/ApplicationWorkbenchAdvisor.java +++ b/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/src/org/eclipse/equinox/p2/examples/rcp/prestartupdate/ApplicationWorkbenchAdvisor.java @@ -1,33 +1,52 @@ package org.eclipse.equinox.p2.examples.rcp.prestartupdate; +import java.lang.reflect.InvocationTargetException; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchAdvisor; import org.eclipse.ui.application.WorkbenchWindowAdvisor; /** - * This workbench advisor creates the window advisor, and specifies - * the perspective id for the initial window. + * This workbench advisor creates the window advisor, and specifies the + * perspective id for the initial window. */ public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { - public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { - return new ApplicationWorkbenchWindowAdvisor(configurer); - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.application.WorkbenchAdvisor#preStartup() - */ - public void preStartup() { - // XXX check for updates before starting up. - // If an update is performed, restart. - if (P2Util.checkForUpdates()) - PlatformUI.getWorkbench().restart(); - } - + public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor( + IWorkbenchWindowConfigurer configurer) { + return new ApplicationWorkbenchWindowAdvisor(configurer); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.application.WorkbenchAdvisor#preStartup() + */ + public void preStartup() { + // XXX check for updates before starting up. + // If an update is performed, restart. + + IRunnableWithProgress runnable = new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InvocationTargetException, InterruptedException { + if (P2Util.checkForUpdates(monitor)) + PlatformUI.getWorkbench().restart(); + } + }; + try { + new ProgressMonitorDialog(null).run(true, true, runnable); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + } + } + public String getInitialWindowPerspectiveId() { return Perspective.ID; - } - + } + } diff --git a/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/src/org/eclipse/equinox/p2/examples/rcp/prestartupdate/P2Util.java b/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/src/org/eclipse/equinox/p2/examples/rcp/prestartupdate/P2Util.java index 7ba13903b..404e33eb8 100644 --- a/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/src/org/eclipse/equinox/p2/examples/rcp/prestartupdate/P2Util.java +++ b/examples/org.eclipse.equinox.p2.examples.rcp.prestartupdate/src/org/eclipse/equinox/p2/examples/rcp/prestartupdate/P2Util.java @@ -11,183 +11,46 @@ package org.eclipse.equinox.p2.examples.rcp.prestartupdate; -import java.lang.reflect.InvocationTargetException; -import java.net.URI; -import java.util.ArrayList; -import java.util.Iterator; - import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; -import org.eclipse.equinox.internal.provisional.p2.artifact.repository.IArtifactRepositoryManager; -import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; -import org.eclipse.equinox.internal.provisional.p2.director.IPlanner; -import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; -import org.eclipse.equinox.internal.provisional.p2.director.ProvisioningPlan; -import org.eclipse.equinox.internal.provisional.p2.engine.DefaultPhaseSet; -import org.eclipse.equinox.internal.provisional.p2.engine.IEngine; -import org.eclipse.equinox.internal.provisional.p2.engine.IProfile; -import org.eclipse.equinox.internal.provisional.p2.engine.IProfileRegistry; -import org.eclipse.equinox.internal.provisional.p2.engine.ProvisioningContext; -import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.internal.provisional.p2.metadata.query.Collector; -import org.eclipse.equinox.internal.provisional.p2.metadata.query.InstallableUnitQuery; -import org.eclipse.equinox.internal.provisional.p2.metadata.repository.IMetadataRepositoryManager; -import org.eclipse.equinox.internal.provisional.p2.repository.IRepositoryManager; -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.equinox.p2.core.IProvisioningAgent; +import org.eclipse.equinox.p2.operations.ProvisioningJob; +import org.eclipse.equinox.p2.operations.ProvisioningSession; +import org.eclipse.equinox.p2.operations.UpdateOperation; public class P2Util { // XXX Check for updates to this application and return true if // we have installed updates and need a restart. - // This method is intentionally long and ugly in order to provide - // "one-stop-shopping" for how to check for and perform an update. - static boolean checkForUpdates() { - // Before we show a progress dialog, at least find out that we have - // installed content and repos to check. - final IProfileRegistry profileRegistry = (IProfileRegistry) ServiceHelper - .getService(Activator.bundleContext, IProfileRegistry.class - .getName()); - if (profileRegistry == null) - return false; - final IProfile profile = profileRegistry - .getProfile(IProfileRegistry.SELF); - if (profile == null) - return false; - - // We are going to look for updates to all IU's in the profile. A - // different query could be used if we are looking for updates to - // a subset. For example, the p2 UI only looks for updates to those - // IU's marked with a special property. - final org.eclipse.equinox.internal.provisional.p2.metadata.query.Collector collector = profile.query(InstallableUnitQuery.ANY, - new Collector(), null); - if (collector.isEmpty()) - return false; - final IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper + static boolean checkForUpdates(IProgressMonitor monitor) { + IProvisioningAgent agent = (IProvisioningAgent) ServiceHelper .getService(Activator.bundleContext, - IMetadataRepositoryManager.class.getName()); - if (manager == null) - return false; - final URI[] reposToSearch = manager - .getKnownRepositories(IRepositoryManager.REPOSITORIES_ALL); - if (reposToSearch.length == 0) - return false; - final IPlanner planner = (IPlanner) ServiceHelper.getService( - Activator.bundleContext, IPlanner.class.getName()); - if (planner == null) - return false; - // Looking in all known repositories for updates for each IU in the profile - final boolean[] didWeUpdate = new boolean[1]; - didWeUpdate[0] = false; - IRunnableWithProgress runnable = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException { - // We'll break progress up into 4 steps. - // 1. Load repos - it is not strictly necessary to do this. - // The planner will do it for us. However, burying this - // in the planner's progress reporting will not - // show enough progress initially, so we do it manually. - // 2. Get update list - // 3. Build a profile change request and get a provisioning plan - // 4. Perform the provisioning plan. - SubMonitor sub = SubMonitor.convert(monitor, - "Checking for application updates...", 400); - // 1. Load repos - SubMonitor loadMonitor = sub.newChild(100, SubMonitor.SUPPRESS_ALL_LABELS); - for (int i=0; i<reposToSearch.length; i++) - try { - if (loadMonitor.isCanceled()) - throw new InterruptedException(); - manager.loadRepository(reposToSearch[i], loadMonitor.newChild(100/reposToSearch.length)); - } catch (ProvisionException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - loadMonitor.done(); - - // 2. Get update list. - // First we look for replacement IU's for each IU - ArrayList iusWithUpdates = new ArrayList(); - ArrayList replacementIUs = new ArrayList(); - Iterator iter = collector.iterator(); - ProvisioningContext pc = new ProvisioningContext(reposToSearch); - SubMonitor updateSearchMonitor = sub.newChild(100, SubMonitor.SUPPRESS_ALL_LABELS); - while (iter.hasNext()) { - if (updateSearchMonitor.isCanceled()) - throw new InterruptedException(); - IInstallableUnit iu = (IInstallableUnit) iter.next(); - IInstallableUnit[] replacements = planner.updatesFor(iu, - pc, updateSearchMonitor.newChild(100/collector.size())); - if (replacements.length > 0) { - iusWithUpdates.add(iu); - if (replacements.length == 1) - replacementIUs.add(replacements[0]); - else { - IInstallableUnit repl = replacements[0]; - for (int i = 1; i < replacements.length; i++) - if (replacements[i].getVersion().compareTo( - repl.getVersion()) > 0) - repl = replacements[i]; - replacementIUs.add(repl); - } - } - } - // Did we find any updates? - if (iusWithUpdates.size() == 0) { - sub.done(); - } else { - if (sub.isCanceled()) - throw new InterruptedException(); - // 3. Build a profile change request and get a provisioning plan - ProfileChangeRequest changeRequest = new ProfileChangeRequest( - profile); - changeRequest - .removeInstallableUnits((IInstallableUnit[]) iusWithUpdates - .toArray(new IInstallableUnit[iusWithUpdates - .size()])); - changeRequest - .addInstallableUnits((IInstallableUnit[]) replacementIUs - .toArray(new IInstallableUnit[replacementIUs - .size()])); - ProvisioningPlan plan = planner.getProvisioningPlan( - changeRequest, pc, sub.newChild(100, SubMonitor.SUPPRESS_ALL_LABELS)); - if (plan.getStatus().getSeverity() == IStatus.CANCEL) - throw new InterruptedException(); - if (plan.getStatus().getSeverity() != IStatus.ERROR) { - IEngine engine = (IEngine) ServiceHelper.getService( - Activator.bundleContext, IEngine.class - .getName()); - IArtifactRepositoryManager artifactMgr = (IArtifactRepositoryManager) ServiceHelper - .getService(Activator.bundleContext, - IArtifactRepositoryManager.class - .getName()); - if (engine != null && artifactMgr != null) { - // 4. Perform the provisioning plan - pc - .setArtifactRepositories(artifactMgr - .getKnownRepositories(IRepositoryManager.REPOSITORIES_ALL)); - IStatus status = engine.perform(profile, - new DefaultPhaseSet(), plan.getOperands(), - pc, sub.newChild(100, SubMonitor.SUPPRESS_ALL_LABELS)); - if (status.getSeverity() == IStatus.CANCEL) - throw new InterruptedException(); - if (status.getSeverity() != IStatus.ERROR) { - didWeUpdate[0] = true; - } - } - } - } + IProvisioningAgent.SERVICE_NAME); + if (agent == null) + return false; + ProvisioningSession session = new ProvisioningSession(agent); + // the default update operation looks for updates to the currently + // running profile, using the default profile root marker. To change + // which installable units are being updated, use the more detailed + // constructors. + UpdateOperation operation = new UpdateOperation(session); + + SubMonitor sub = SubMonitor.convert(monitor, + "Checking for application updates...", 200); + IStatus status = operation.resolveModal(sub.newChild(100)); + if (status.getSeverity() == IStatus.CANCEL) + throw new OperationCanceledException(); + if (status.getSeverity() != IStatus.ERROR) { + ProvisioningJob job = operation.getProvisioningJob(null); + status = job.runModal(sub.newChild(100)); + if (status.getSeverity() == IStatus.CANCEL) + throw new OperationCanceledException(); + if (status.getSeverity() != IStatus.ERROR) { + return true; } - }; - try { - new ProgressMonitorDialog(null).run(true, true, runnable); - } catch (InvocationTargetException e) { - e.printStackTrace(); - return false; - } catch (InterruptedException e) { - return false; } - return didWeUpdate[0]; + return false; } } |