diff options
author | Susan Franklin | 2007-10-11 19:06:39 +0000 |
---|---|---|
committer | Susan Franklin | 2007-10-11 19:06:39 +0000 |
commit | 89bae677ef23a6adad13735db6be7008ae160434 (patch) | |
tree | 4ac8b49b08e01da899eb776b243b25373383365f | |
parent | 48f2ea960be18897bca114495eddd0a7719fecf1 (diff) | |
download | rt.equinox.p2-89bae677ef23a6adad13735db6be7008ae160434.tar.gz rt.equinox.p2-89bae677ef23a6adad13735db6be7008ae160434.tar.xz rt.equinox.p2-89bae677ef23a6adad13735db6be7008ae160434.zip |
Bug 204823 - [prov] [ui] Confusing mixture of entry points and groups in end user UI
79 files changed, 1567 insertions, 1808 deletions
diff --git a/bundles/org.eclipse.equinox.p2.console/src/org/eclipse/equinox/internal/p2/console/ProvisioningHelper.java b/bundles/org.eclipse.equinox.p2.console/src/org/eclipse/equinox/internal/p2/console/ProvisioningHelper.java index 4ac477d69..8197091fd 100644 --- a/bundles/org.eclipse.equinox.p2.console/src/org/eclipse/equinox/internal/p2/console/ProvisioningHelper.java +++ b/bundles/org.eclipse.equinox.p2.console/src/org/eclipse/equinox/internal/p2/console/ProvisioningHelper.java @@ -227,14 +227,14 @@ public class ProvisioningHelper { throw new ProvisionException(error.toString()); } - IDirector2 director = (IDirector2) ServiceHelper.getService(Activator.getContext(), IDirector2.class.getName()); - if (director == null) - throw new ProvisionException("No director service found."); + IPlanner planner = (IPlanner) ServiceHelper.getService(Activator.getContext(), IPlanner.class.getName()); + if (planner == null) + throw new ProvisionException("No planner service found."); Engine engine = (Engine) ServiceHelper.getService(Activator.getContext(), Engine.class.getName()); if (engine == null) throw new ProvisionException("No director service found."); - DirectorResult result = director.install(new IInstallableUnit[] {toInstall}, profile, null, progress); + ProvisioningPlan result = planner.getInstallPlan(new IInstallableUnit[] {toInstall}, profile, progress); if (!result.getStatus().isOK()) return result.getStatus(); diff --git a/bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/Application.java b/bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/Application.java index a00ad7594..812fad4af 100644 --- a/bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/Application.java +++ b/bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/Application.java @@ -16,8 +16,7 @@ import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.equinox.internal.p2.console.ProvisioningHelper; import org.eclipse.equinox.p2.core.helpers.LogHelper; import org.eclipse.equinox.p2.core.helpers.ServiceHelper; -import org.eclipse.equinox.p2.director.DirectorResult; -import org.eclipse.equinox.p2.director.IDirector2; +import org.eclipse.equinox.p2.director.*; import org.eclipse.equinox.p2.engine.*; import org.eclipse.equinox.p2.engine.phases.SizingPhase; import org.eclipse.equinox.p2.metadata.IInstallableUnit; @@ -75,10 +74,14 @@ public class Application implements IApplication { if (currentFlavor != null && !currentFlavor.endsWith(flavor)) throw new RuntimeException("Install flavor not consistent with profile flavor"); - IDirector2 director = (IDirector2) ServiceHelper.getService(Activator.getContext(), IDirector2.class.getName()); + IDirector director = (IDirector) ServiceHelper.getService(Activator.getContext(), IDirector.class.getName()); if (director == null) throw new RuntimeException("Director could not be loaded"); + IPlanner planner = (IPlanner) ServiceHelper.getService(Activator.getContext(), IPlanner.class.getName()); + if (planner == null) + throw new RuntimeException("Planner could not be loaded"); + Engine engine = (Engine) ServiceHelper.getService(Activator.getContext(), Engine.class.getName()); if (engine == null) throw new RuntimeException("Engine could not be loaded"); @@ -86,13 +89,13 @@ public class Application implements IApplication { ProvisioningHelper.addArtifactRepository(artifactRepositoryLocation); IMetadataRepository metadataRepository = ProvisioningHelper.addMetadataRepository(metadataRepositoryLocation); IInstallableUnit[] roots = Query.query(new IQueryable[] {metadataRepository}, root, version == null ? null : new VersionRange(version, true, version, true), null, false, null); - DirectorResult result = null; + ProvisioningPlan result = null; IStatus operationStatus = null; if (roots.length > 0) { if (install) { - result = director.install(roots, profile, null, new NullProgressMonitor()); + result = planner.getInstallPlan(roots, profile, new NullProgressMonitor()); } else { - result = director.uninstall(roots, profile, new NullProgressMonitor()); + result = planner.getUninstallPlan(roots, profile, new NullProgressMonitor()); } if (!result.getStatus().isOK()) operationStatus = result.getStatus(); diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java index d23b63a31..a622c37de 100644 --- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java +++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java @@ -29,6 +29,7 @@ public class Messages extends NLS { public static String Director_Uninstall_Problems; public static String Director_Nothing_To_Uninstall; public static String Director_Cannot_Uninstall; + public static String Director_Already_Installed; public static String Director_Replace_Problems; public static String Director_Become_Problems; diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties index 795fa00db..b39b3ac20 100644 --- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties +++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties @@ -13,10 +13,11 @@ Director_Uninstall_Problems=Problems occurred while uninstalling. Director_Install_Problems=Problems occurred while installing. Director_Cannot_Uninstall=Can not uninstall {0} because others IUs depend on it. Director_Nothing_To_Uninstall=Nothing to uninstall. +Director_Already_Installed={0} is already installed. Director_Replace_Problems=Problems occurred while replacing. Director_Become_Problems=Problems occured while running become. Director_Unexpected_IU=The installable unit {0} can not be used here. -Director_Task_Installing=Installing {0} to {1} +Director_Task_Installing=Installing into {1} Director_Task_Uninstalling=Uninstalling Director_Task_Updating=Updating Director_Task_Resolving_Dependencies=Resolving dependencies diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/IDirector.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/IDirector.java index 4ad233379..e75535422 100644 --- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/IDirector.java +++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/IDirector.java @@ -29,11 +29,10 @@ public interface IDirector { * * @param toInstall The units to install * @param profile The profile to install into - * @param entryPoint The user visible name of the entry point. If <code>null</code> is being passed, no entry point gets created * @param monitor a progress monitor, or <code>null</code> if progress * reporting is not desired */ - public IStatus install(IInstallableUnit[] toInstall, Profile profile, String entryPoint, IProgressMonitor monitor); + public IStatus install(IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor); /** * Uninstalls the given units from the given profile. diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/IDirector2.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/IPlanner.java index a85fd4ff5..02ac5203d 100644 --- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/IDirector2.java +++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/IPlanner.java @@ -13,41 +13,37 @@ import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.IInstallableUnit; /** - * Directors are responsible for determining what should be done to a given + * Planners are responsible for determining what should be done to a given * profile to reshape it as requested. That is, given the current state of a * profile, a description of the desired end state of that profile and metadata - * describing the available IUs, a director produces a list of provisioning - * operations (e.g., install, update or uninstall) to perform on the related IUs. - * Directors are also able to validate profiles and assist in the diagnosis of - * configuration errors. Note that directors may range in complexity from - * very simple (e.g., reading a list of bundles from a static file) to very complex. + * describing the available IUs, a planner produces a plan that lists the + * provisioning operands that the engine should perform. */ -public interface IDirector2 { +public interface IPlanner { /** - * Installs the given units into the given profile. + * Provides a plan for installing the given units into the given profile. * * @param toInstall The units to install * @param profile The profile to install into - * @param entryPoint The user visible name of the entry point. If <code>null</code> is being passed, no entry point gets created * @param monitor a progress monitor, or <code>null</code> if progress * reporting is not desired */ - public DirectorResult install(IInstallableUnit[] toInstall, Profile profile, String entryPoint, IProgressMonitor monitor); + public ProvisioningPlan getInstallPlan(IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor); /** - * Uninstalls the given units from the given profile. + * Provides a plan for uninstalling the given units from the given profile. * * @param toUninstall The units to uninstall * @param profile The profile from which to uninstall * @param monitor a progress monitor, or <code>null</code> if progress * reporting is not desired */ - public DirectorResult uninstall(IInstallableUnit[] toUninstall, Profile profile, IProgressMonitor monitor); + public ProvisioningPlan getUninstallPlan(IInstallableUnit[] toUninstall, Profile profile, IProgressMonitor monitor); - public DirectorResult become(IInstallableUnit target, Profile profile, IProgressMonitor monitor); + public ProvisioningPlan getBecomePlan(IInstallableUnit target, Profile profile, IProgressMonitor monitor); - public DirectorResult replace(IInstallableUnit[] toUninstall, IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor); + public ProvisioningPlan getReplacePlan(IInstallableUnit[] toUninstall, IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor); - //TODO And many more operations for uninstallation and the rest ! See bug 179819 + public IInstallableUnit[] updatesFor(IInstallableUnit toUpdate); } diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/NewSimpleDirector.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/NewSimpleDirector.java deleted file mode 100644 index 715600543..000000000 --- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/NewSimpleDirector.java +++ /dev/null @@ -1,328 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 IBM Corporation and others. All rights reserved. This - * program and the accompanying materials are made available under the terms of - * the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: IBM Corporation - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.director; - -import java.net.URL; -import java.util.*; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.director.*; -import org.eclipse.equinox.internal.p2.rollback.FormerState; -import org.eclipse.equinox.p2.core.eventbus.ProvisioningEventBus; -import org.eclipse.equinox.p2.core.helpers.ServiceHelper; -import org.eclipse.equinox.p2.core.location.AgentLocation; -import org.eclipse.equinox.p2.core.repository.IRepository; -import org.eclipse.equinox.p2.engine.*; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.metadata.repository.IMetadataRepository; -import org.eclipse.equinox.p2.metadata.repository.IMetadataRepositoryManager; -import org.eclipse.equinox.p2.resolution.ResolutionHelper; -import org.eclipse.osgi.service.resolver.VersionRange; -import org.eclipse.osgi.util.NLS; -import org.osgi.framework.Version; - -public class NewSimpleDirector implements IDirector { - static final int ExpandWork = 10; - static final int OperationWork = 100; - private Engine engine; - - public static void tagAsImplementation(IMetadataRepository repository) { - if (repository != null && repository.getProperties().getProperty(IRepository.IMPLEMENTATION_ONLY_KEY) == null) { - if (repository.isModifiable()) - repository.getModifiableProperties().setProperty(IRepository.IMPLEMENTATION_ONLY_KEY, Boolean.valueOf(true).toString()); - } - } - - public NewSimpleDirector() { - URL rollbackLocation = null; - AgentLocation agentLocation = (AgentLocation) ServiceHelper.getService(DirectorActivator.context, AgentLocation.class.getName()); - rollbackLocation = agentLocation.getTouchpointDataArea("director"); - ProvisioningEventBus eventBus = (ProvisioningEventBus) ServiceHelper.getService(DirectorActivator.context, ProvisioningEventBus.class.getName()); - IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(DirectorActivator.context, IMetadataRepositoryManager.class.getName()); - IMetadataRepository rollbackRepo = manager.loadRepository(rollbackLocation, null); - if (rollbackRepo == null) - rollbackRepo = manager.createRepository(rollbackLocation, "Agent rollback repo", "org.eclipse.equinox.p2.metadata.repository.simpleRepository"); //$NON-NLS-1$//$NON-NLS-2$ - if (rollbackRepo == null) - throw new IllegalStateException("Unable to open or create Agent's rollback repository"); - tagAsImplementation(rollbackRepo); - new FormerState(eventBus, rollbackRepo); - engine = (Engine) ServiceHelper.getService(DirectorActivator.context, Engine.class.getName()); - } - - //TODO This is really gross!!!!! We need to make things uniform - private IInstallableUnit[] toArray(Iterator it) { - ArrayList result = new ArrayList(); - while (it.hasNext()) { - result.add(it.next()); - } - return (IInstallableUnit[]) result.toArray(new IInstallableUnit[result.size()]); - } - - protected IInstallableUnit[] createEntryPointHelper(String entryPointName, IInstallableUnit[] content) { - if (entryPointName == null) - return content; - return new IInstallableUnit[] {createEntryPoint(entryPointName, content)}; - } - - protected InstallableUnit createEntryPoint(String entryPointName, IInstallableUnit[] content) { - InstallableUnit result = new InstallableUnit(); - result.setId("entry point " + entryPointId(content)); //$NON-NLS-1$ - result.setVersion(new Version(0, 0, 0, Long.toString(System.currentTimeMillis()))); - result.setRequiredCapabilities(IUTransformationHelper.toRequirements(content, false)); - result.setProperty(IInstallableUnitConstants.ENTRYPOINT_IU_KEY, Boolean.TRUE.toString()); - result.setProperty(IInstallableUnitConstants.NAME, entryPointName); - return result; - } - - private String entryPointId(IInstallableUnit[] ius) { - StringBuffer result = new StringBuffer(); - for (int i = 0; i < ius.length; i++) { - result.append(ius[i].getId()); - if (i < ius.length - 1) - result.append(", "); //$NON-NLS-1$ - } - return result.toString(); - } - - public IStatus install(IInstallableUnit[] installRoots, Profile profile, String entryPointName, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, ExpandWork + OperationWork); - sub.setTaskName(Messages.Director_Task_Resolving_Dependencies); - try { - MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, Messages.Director_Install_Problems, null); - // Get the list of ius installed in the profile we are installing into - IInstallableUnit[] alreadyInstalled = toArray(profile.getInstallableUnits()); - //Compute the complete closure of things to install to successfully install the installRoots. - NewDependencyExpander expander = new NewDependencyExpander(createEntryPointHelper(entryPointName, installRoots), alreadyInstalled, gatherAvailableInstallableUnits(installRoots), profile, true); - // NewDependencyExpander expander = new NewDependencyExpander(installRoots, alreadyInstalled, gatherAvailableInstallableUnits(), profile, true); - IStatus expanderResult = expander.expand(sub.newChild(ExpandWork)); - if (!expanderResult.isOK()) { - result.merge(expanderResult); - return result; - } - - ResolutionHelper oldStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); - Collection oldState = oldStateHelper.attachCUs(Arrays.asList(alreadyInstalled)); - List oldStateOrder = oldStateHelper.getSorted(); - - ResolutionHelper newStateHelper = new ResolutionHelper(profile.getSelectionContext(), expander.getRecommendations()); - Collection newState = newStateHelper.attachCUs(expander.getAllInstallableUnits()); - List newStateOrder = newStateHelper.getSorted(); - - //TODO Here we need to sort the operations to ensure that the dependents will be treated first (see ensureDependencyOrder) - sub.setTaskName(NLS.bind(Messages.Director_Task_Installing, entryPointName, profile.getValue(Profile.PROP_INSTALL_FOLDER))); - IStatus engineResult = engine.perform(profile, new DefaultPhaseSet(), generateOperations(oldState, newState, oldStateOrder, newStateOrder), sub.newChild(OperationWork)); - if (!engineResult.isOK()) - result.merge(engineResult); - - return result.isOK() ? Status.OK_STATUS : result; - } finally { - sub.done(); - } - } - - private Operand[] generateOperations(Collection fromState, Collection toState, List fromStateOrder, List newStateOrder) { - return sortOperations(new OperationGenerator().generateOperation(fromState, toState), newStateOrder, fromStateOrder); - } - - private Operand[] sortOperations(Operand[] toSort, List installOrder, List uninstallOrder) { - List updateOp = new ArrayList(); - for (int i = 0; i < toSort.length; i++) { - Operand op = toSort[i]; - if (op.first() == null && op.second() != null) { - installOrder.set(installOrder.indexOf(op.second()), op); - continue; - } - if (op.first() != null && op.second() == null) { - uninstallOrder.set(uninstallOrder.indexOf(op.first()), op); - continue; - } - if (op.first() != null && op.second() != null) { - updateOp.add(op); - continue; - } - } - int i = 0; - for (Iterator iterator = installOrder.iterator(); iterator.hasNext();) { - Object elt = iterator.next(); - if (elt instanceof Operand) { - toSort[i++] = (Operand) elt; - } - } - for (Iterator iterator = uninstallOrder.iterator(); iterator.hasNext();) { - Object elt = iterator.next(); - if (elt instanceof Operand) { - toSort[i++] = (Operand) elt; - } - } - for (Iterator iterator = updateOp.iterator(); iterator.hasNext();) { - Object elt = iterator.next(); - if (elt instanceof Operand) { - toSort[i++] = (Operand) elt; - } - } - return toSort; - } - - public IStatus become(IInstallableUnit target, Profile profile, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, OperationWork + ExpandWork); - sub.setTaskName(Messages.Director_Task_Resolving_Dependencies); - try { - MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, Messages.Director_Become_Problems, null); - - if (!Boolean.valueOf(target.getProperty(IInstallableUnitConstants.PROFILE_IU_KEY)).booleanValue()) { - result.add(new Status(IStatus.ERROR, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Director_Unexpected_IU, target.getId()))); - return result; - } - - //TODO Here we need to deal with the change of properties between the two profiles - //Also if the profile changes (locations are being modified, etc), should not we do a full uninstall then an install? - //Maybe it depends on the kind of changes in a profile - //We need to get all the ius that were part of the profile and give that to be what to become - NewDependencyExpander toExpander = new NewDependencyExpander(new IInstallableUnit[] {target}, null, gatherAvailableInstallableUnits(new IInstallableUnit[] {target}), profile, true); - toExpander.expand(sub.newChild(ExpandWork)); - ResolutionHelper newStateHelper = new ResolutionHelper(profile.getSelectionContext(), toExpander.getRecommendations()); - Collection newState = newStateHelper.attachCUs(toExpander.getAllInstallableUnits()); - newState.remove(target); - - Iterator it = profile.getInstallableUnits(); - Collection oldIUs = new HashSet(); - for (; it.hasNext();) { - oldIUs.add(it.next()); - } - - ResolutionHelper oldStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); - Collection oldState = oldStateHelper.attachCUs(oldIUs); - sub.setTaskName(Messages.Director_Task_Updating); - IStatus engineResult = engine.perform(profile, new DefaultPhaseSet(), generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted()), sub.newChild(OperationWork)); - if (!engineResult.isOK()) - result.merge(engineResult); - - return result; - } finally { - sub.done(); - } - } - - private IInstallableUnit[] inProfile(IInstallableUnit[] toFind, Profile profile, boolean found, IProgressMonitor monitor) { - ArrayList result = new ArrayList(toFind.length); - for (int i = 0; i < toFind.length; i++) { - if (profile.query(toFind[i].getId(), new VersionRange(toFind[i].getVersion(), true, toFind[i].getVersion(), true), null, false, monitor).length > 0) { - if (found) - result.add(toFind[i]); - } else { - if (!found) - result.add(toFind[i]); - } - } - return (IInstallableUnit[]) result.toArray(new IInstallableUnit[result.size()]); - } - - public IStatus uninstall(IInstallableUnit[] uninstallRoots, Profile profile, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, OperationWork + ExpandWork); - sub.setTaskName(Messages.Director_Task_Resolving_Dependencies); - try { - IInstallableUnit[] toReallyUninstall = inProfile(uninstallRoots, profile, true, sub.newChild(0)); - if (toReallyUninstall.length == 0) { - return new Status(IStatus.OK, DirectorActivator.PI_DIRECTOR, Messages.Director_Nothing_To_Uninstall); - } else if (toReallyUninstall.length != uninstallRoots.length) { - uninstallRoots = toReallyUninstall; - } - - MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, Messages.Director_Uninstall_Problems, null); - - IInstallableUnit[] alreadyInstalled = toArray(profile.getInstallableUnits()); - ResolutionHelper oldStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); - Collection oldState = oldStateHelper.attachCUs(Arrays.asList(alreadyInstalled)); - - NewDependencyExpander expander = new NewDependencyExpander(uninstallRoots, new IInstallableUnit[0], alreadyInstalled, profile, true); - expander.expand(sub.newChild(ExpandWork / 2)); - Collection toUninstallClosure = new ResolutionHelper(profile.getSelectionContext(), null).attachCUs(expander.getAllInstallableUnits()); - - Collection remainingIUs = new HashSet(oldState); - remainingIUs.removeAll(toUninstallClosure); - NewDependencyExpander finalExpander = new NewDependencyExpander(null, (IInstallableUnit[]) remainingIUs.toArray(new IInstallableUnit[remainingIUs.size()]), gatherAvailableInstallableUnits(uninstallRoots), profile, true); - finalExpander.expand(sub.newChild(ExpandWork / 2)); - ResolutionHelper newStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); - Collection newState = newStateHelper.attachCUs(finalExpander.getAllInstallableUnits()); - - for (int i = 0; i < uninstallRoots.length; i++) { - if (newState.contains(uninstallRoots[i])) - result.add(new Status(IStatus.ERROR, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Director_Cannot_Uninstall, uninstallRoots[i]))); - } - if (!result.isOK()) - return result; - - sub.setTaskName(Messages.Director_Task_Uninstalling); - IStatus engineResult = engine.perform(profile, new DefaultPhaseSet(), generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted()), sub.newChild(OperationWork)); - if (!engineResult.isOK()) - result.merge(engineResult); - - return result.isOK() ? Status.OK_STATUS : result; - } finally { - sub.done(); - } - } - - protected IInstallableUnit[] gatherAvailableInstallableUnits(IInstallableUnit[] additionalSource) { - IMetadataRepositoryManager repoMgr = (IMetadataRepositoryManager) ServiceHelper.getService(DirectorActivator.context, IMetadataRepositoryManager.class.getName()); - IMetadataRepository[] repos = repoMgr.getKnownRepositories(); - List results = new ArrayList(); - if (additionalSource != null) { - for (int i = 0; i < additionalSource.length; i++) { - results.add(additionalSource[i]); - } - } - - for (int i = 0; i < repos.length; i++) { - results.addAll(Arrays.asList(repos[i].getInstallableUnits(null))); - } - return (IInstallableUnit[]) results.toArray(new IInstallableUnit[results.size()]); - } - - public IStatus replace(IInstallableUnit[] toUninstall, IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, OperationWork + ExpandWork); - sub.setTaskName(Messages.Director_Task_Resolving_Dependencies); - try { - MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, Messages.Director_Replace_Problems, null); - - //TODO Need to worry about the entry points - - //find the things being updated in the profile - IInstallableUnit[] alreadyInstalled = toArray(profile.getInstallableUnits()); - IInstallableUnit[] uninstallRoots = toUninstall; - - //compute the transitive closure and remove them. - ResolutionHelper oldStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); - Collection oldState = oldStateHelper.attachCUs(Arrays.asList(alreadyInstalled)); - - NewDependencyExpander expander = new NewDependencyExpander(uninstallRoots, new IInstallableUnit[0], alreadyInstalled, profile, true); - expander.expand(sub.newChild(ExpandWork / 2)); - Collection toUninstallClosure = new ResolutionHelper(profile.getSelectionContext(), null).attachCUs(expander.getAllInstallableUnits()); - - //add the new set. - Collection remainingIUs = new HashSet(oldState); - remainingIUs.removeAll(toUninstallClosure); - // for (int i = 0; i < updateRoots.length; i++) { - // remainingIUs.add(updateRoots[i]); - // } - NewDependencyExpander finalExpander = new NewDependencyExpander(toInstall, (IInstallableUnit[]) remainingIUs.toArray(new IInstallableUnit[remainingIUs.size()]), gatherAvailableInstallableUnits(null), profile, true); - finalExpander.expand(sub.newChild(ExpandWork / 2)); - ResolutionHelper newStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); - Collection newState = newStateHelper.attachCUs(finalExpander.getAllInstallableUnits()); - - sub.setTaskName(Messages.Director_Task_Updating); - IStatus engineResult = engine.perform(profile, new DefaultPhaseSet(), generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted()), sub.newChild(OperationWork)); - if (!engineResult.isOK()) - result.merge(engineResult); - - return result.isOK() ? Status.OK_STATUS : result; - } finally { - sub.done(); - } - } -} diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/Oracle.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/Oracle.java deleted file mode 100644 index 2954c855e..000000000 --- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/Oracle.java +++ /dev/null @@ -1,164 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 IBM Corporation and others. All rights reserved. This - * program and the accompanying materials are made available under the terms of - * the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: IBM Corporation - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.director; - -import java.util.*; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.director.DirectorActivator; -import org.eclipse.equinox.internal.p2.director.Messages; -import org.eclipse.equinox.p2.engine.Profile; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.resolution.ResolutionHelper; -import org.eclipse.osgi.service.resolver.VersionRange; - -//TODO The "extends" relationship with the director is a hack to get stuffs working -public class Oracle extends NewSimpleDirector { - public Object canInstall(IInstallableUnit[] toAdd, Profile profile, IProgressMonitor monitor) { - MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, "oracle", null); - SubMonitor sub = SubMonitor.convert(monitor, ExpandWork + OperationWork); - try { - IInstallableUnit[] alreadyInstalled = toArray(profile.getInstallableUnits()); - if (alreadyIn(alreadyInstalled, toAdd[0])) { - return Boolean.FALSE; - } - //Compute the complete closure of things to install to successfully install the installRoots. - NewDependencyExpander expander = new NewDependencyExpander(toAdd, alreadyInstalled, gatherAvailableInstallableUnits(toAdd), profile, true); - IStatus expanderResult = expander.expand(sub); - sub.worked(ExpandWork); - if (expanderResult.isOK()) { - return Boolean.TRUE; - } - Collection resolved = expander.getAllInstallableUnits(); - Collection entryPoints = new HashSet(); - for (Iterator iterator = resolved.iterator(); iterator.hasNext();) { - IInstallableUnit iu = (IInstallableUnit) iterator.next(); - // if ("true".equals(iu.getProperty("entryPoint"))) { - entryPoints.add(iu); - // } - } - Collection initialEntryPoints = new HashSet(); - for (int i = 0; i < alreadyInstalled.length; i++) { - // if ("true".equals(alreadyInstalled[i].getProperty("entryPoint"))) { - initialEntryPoints.add(alreadyInstalled[i]); - // } - } - initialEntryPoints.removeAll(entryPoints); - if (initialEntryPoints.size() != 0) { - return initialEntryPoints; - } - return Boolean.FALSE; - } finally { - sub.done(); - } - } - - public boolean canInstall(IInstallableUnit[] toAdd, IInstallableUnit[] toUpdate, Profile profile, IProgressMonitor monitor) { - IInstallableUnit[] replacements = new IInstallableUnit[toUpdate.length + toAdd.length]; - for (int i = 0; i < toUpdate.length; i++) { - replacements[i] = containsUpdate(toUpdate[i]); - //TODO We need to be able to deal with multiple updates and even where is none - if (replacements[i] == null) - return false; - } - System.arraycopy(toAdd, 0, replacements, toUpdate.length, toAdd.length); - - MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, Messages.Director_Uninstall_Problems, null); - SubMonitor sub = SubMonitor.convert(monitor, OperationWork); - - IInstallableUnit[] alreadyInstalled = toArray(profile.getInstallableUnits()); - Collection oldState = new ResolutionHelper(profile.getSelectionContext(), null).attachCUs(Arrays.asList(alreadyInstalled)); - - NewDependencyExpander expander = new NewDependencyExpander(toUpdate, new IInstallableUnit[0], alreadyInstalled, profile, true); - expander.expand(sub); - Collection toUninstallClosure = new ResolutionHelper(profile.getSelectionContext(), null).attachCUs(expander.getAllInstallableUnits()); - - Collection remainingIUs = new HashSet(oldState); - remainingIUs.removeAll(toUninstallClosure); - NewDependencyExpander finalExpander = new NewDependencyExpander(replacements, (IInstallableUnit[]) remainingIUs.toArray(new IInstallableUnit[remainingIUs.size()]), gatherAvailableInstallableUnits(toAdd), profile, true); - finalExpander.expand(sub); - Collection newState = new ResolutionHelper(profile.getSelectionContext(), null).attachCUs(finalExpander.getAllInstallableUnits()); - - return true; - } - - private IInstallableUnit containsUpdate(IInstallableUnit iu) { - IInstallableUnit[] candidates = gatherAvailableInstallableUnits(null); - for (int i = 0; i < candidates.length; i++) { - if (iu.getId().equals(candidates[i].getProperty(IInstallableUnitConstants.UPDATE_FROM))) { - if (iu.equals(candidates[i])) - continue; - VersionRange range = new VersionRange(candidates[i].getProperty(IInstallableUnitConstants.UPDATE_RANGE)); - if (range.isIncluded(iu.getVersion()) && candidates[i].getVersion().compareTo(iu.getVersion()) > 0) - return candidates[i]; - } - } - return null; - } - - private boolean alreadyIn(IInstallableUnit[] ius, IInstallableUnit id) { - for (int i = 0; i < ius.length; i++) { - if (ius[i].equals(id)) - return true; - } - return false; - } - - private IInstallableUnit[] toArray(Iterator it) { - ArrayList result = new ArrayList(); - while (it.hasNext()) { - result.add(it.next()); - } - return (IInstallableUnit[]) result.toArray(new IInstallableUnit[result.size()]); - } - - public Collection hasUpdate(IInstallableUnit toUpdate) { - if (toUpdate.getProperty(IInstallableUnitConstants.ENTRYPOINT_IU_KEY) != null) - return entryPointProcessing(toUpdate); - IInstallableUnit[] allius = gatherAvailableInstallableUnits(null); - Set updates = new HashSet(); - for (int i = 0; i < allius.length; i++) { - if (toUpdate.getId().equals(allius[i].getProperty(IInstallableUnitConstants.UPDATE_FROM))) { - if (toUpdate.getVersion().compareTo(allius[i].getVersion()) < 0 && new VersionRange(allius[i].getProperty(IInstallableUnitConstants.UPDATE_RANGE)).isIncluded(toUpdate.getVersion())) - updates.add(allius[i]); - } - } - return updates; - } - - private Collection entryPointProcessing(IInstallableUnit entryPoint) { - ArrayList updates = new ArrayList(); - RequiredCapability[] entries = entryPoint.getRequiredCapabilities(); - for (int i = 0; i < entries.length; i++) { - if (!IInstallableUnit.IU_NAMESPACE.equals(entries[i].getNamespace())) - continue; - IInstallableUnit[] allius = gatherAvailableInstallableUnits(null); - IInstallableUnit match = null; - for (int j = 0; j < allius.length; j++) { - if (entries[i].getName().equals(allius[j].getProperty(IInstallableUnitConstants.UPDATE_FROM))) { - if (new VersionRange(allius[j].getProperty(IInstallableUnitConstants.UPDATE_RANGE)).isIncluded(entries[i].getRange().getMinimum()) && allius[j].getVersion().compareTo(entries[i].getRange().getMinimum()) > 0) { - if (match == null || allius[j].getVersion().compareTo(match.getVersion()) > 0) - match = allius[j]; - } - } - } - if (match != null) - updates.add(match); - } - if (updates.size() == 0) - return updates; - String entryPointName = entryPoint.getProperty(IInstallableUnitConstants.NAME); - if (entryPointName == null) - entryPointName = entryPoint.getId(); - InstallableUnit newEntryPoint = createEntryPoint(entryPointName, (IInstallableUnit[]) updates.toArray(new IInstallableUnit[updates.size()])); - newEntryPoint.setProperty(IInstallableUnitConstants.UPDATE_FROM, entryPoint.getId()); - ArrayList result = new ArrayList(); - result.add(newEntryPoint); - return result; - } -} diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/DirectorResult.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/ProvisioningPlan.java index 3d37220c8..ef70bf67d 100644 --- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/DirectorResult.java +++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/ProvisioningPlan.java @@ -11,15 +11,15 @@ package org.eclipse.equinox.p2.director; import org.eclipse.core.runtime.IStatus; import org.eclipse.equinox.p2.engine.Operand; -public class DirectorResult { +public class ProvisioningPlan { private IStatus status; private Operand[] operands; - public DirectorResult(IStatus status) { + public ProvisioningPlan(IStatus status) { this(status, null); } - public DirectorResult(IStatus status, Operand[] operands) { + public ProvisioningPlan(IStatus status, Operand[] operands) { this.status = status; this.operands = operands; } diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/SimpleDirector.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/SimpleDirector.java new file mode 100644 index 000000000..6217e2dbe --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/SimpleDirector.java @@ -0,0 +1,119 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. All rights reserved. This + * program and the accompanying materials are made available under the terms of + * the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: IBM Corporation - initial API and implementation + ******************************************************************************/ +package org.eclipse.equinox.p2.director; + +import java.net.URL; +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.internal.p2.director.DirectorActivator; +import org.eclipse.equinox.internal.p2.director.Messages; +import org.eclipse.equinox.internal.p2.rollback.FormerState; +import org.eclipse.equinox.p2.core.eventbus.ProvisioningEventBus; +import org.eclipse.equinox.p2.core.helpers.ServiceHelper; +import org.eclipse.equinox.p2.core.location.AgentLocation; +import org.eclipse.equinox.p2.core.repository.IRepository; +import org.eclipse.equinox.p2.engine.*; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; +import org.eclipse.equinox.p2.metadata.repository.IMetadataRepository; +import org.eclipse.equinox.p2.metadata.repository.IMetadataRepositoryManager; +import org.eclipse.osgi.util.NLS; + +public class SimpleDirector implements IDirector { + static final int OperationWork = 100; + private Engine engine; + private IPlanner planner; + + public static void tagAsImplementation(IMetadataRepository repository) { + if (repository != null && repository.getProperties().getProperty(IRepository.IMPLEMENTATION_ONLY_KEY) == null) { + if (repository.isModifiable()) + repository.getModifiableProperties().setProperty(IRepository.IMPLEMENTATION_ONLY_KEY, Boolean.valueOf(true).toString()); + } + } + + public SimpleDirector() { + URL rollbackLocation = null; + AgentLocation agentLocation = (AgentLocation) ServiceHelper.getService(DirectorActivator.context, AgentLocation.class.getName()); + rollbackLocation = agentLocation.getTouchpointDataArea("director"); + ProvisioningEventBus eventBus = (ProvisioningEventBus) ServiceHelper.getService(DirectorActivator.context, ProvisioningEventBus.class.getName()); + IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(DirectorActivator.context, IMetadataRepositoryManager.class.getName()); + IMetadataRepository rollbackRepo = manager.loadRepository(rollbackLocation, null); + if (rollbackRepo == null) + rollbackRepo = manager.createRepository(rollbackLocation, "Agent rollback repo", "org.eclipse.equinox.p2.metadata.repository.simpleRepository"); //$NON-NLS-1$//$NON-NLS-2$ + if (rollbackRepo == null) + throw new IllegalStateException("Unable to open or create Agent's rollback repository"); + tagAsImplementation(rollbackRepo); + new FormerState(eventBus, rollbackRepo); + engine = (Engine) ServiceHelper.getService(DirectorActivator.context, Engine.class.getName()); + if (engine == null) + throw new IllegalStateException("Provisioning engine is not registered"); + planner = (IPlanner) ServiceHelper.getService(DirectorActivator.context, IPlanner.class.getName()); + if (planner == null) + throw new IllegalStateException("Unable to find provisioning planner"); + } + + public IStatus install(IInstallableUnit[] installRoots, Profile profile, IProgressMonitor monitor) { + ProvisioningPlan plan = planner.getInstallPlan(installRoots, profile, monitor); + if (!plan.getStatus().isOK()) + return plan.getStatus(); + SubMonitor sub = SubMonitor.convert(monitor, OperationWork); + sub.setTaskName(NLS.bind(Messages.Director_Task_Installing, profile.getValue(Profile.PROP_INSTALL_FOLDER))); + try { + IStatus engineResult = engine.perform(profile, new DefaultPhaseSet(), plan.getOperands(), sub.newChild(OperationWork)); + if (!engineResult.isOK()) + return engineResult; + // mark the roots as such + for (int i = 0; i < installRoots.length; i++) + profile.setInstallableUnitProfileProperty(installRoots[i], IInstallableUnitConstants.PROFILE_ROOT_IU, Boolean.toString(true)); + + return engineResult; + } finally { + sub.done(); + } + } + + public IStatus become(IInstallableUnit target, Profile profile, IProgressMonitor monitor) { + ProvisioningPlan plan = planner.getBecomePlan(target, profile, monitor); + if (!plan.getStatus().isOK()) + return plan.getStatus(); + SubMonitor sub = SubMonitor.convert(monitor, OperationWork); + sub.setTaskName(Messages.Director_Task_Updating); + try { + return engine.perform(profile, new DefaultPhaseSet(), plan.getOperands(), sub.newChild(OperationWork)); + } finally { + sub.done(); + } + } + + public IStatus uninstall(IInstallableUnit[] uninstallRoots, Profile profile, IProgressMonitor monitor) { + ProvisioningPlan plan = planner.getUninstallPlan(uninstallRoots, profile, monitor); + if (!plan.getStatus().isOK()) + return plan.getStatus(); + SubMonitor sub = SubMonitor.convert(monitor, OperationWork); + sub.setTaskName(Messages.Director_Task_Uninstalling); + try { + return engine.perform(profile, new DefaultPhaseSet(), plan.getOperands(), sub.newChild(OperationWork)); + } finally { + sub.done(); + } + } + + public IStatus replace(IInstallableUnit[] toUninstall, IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor) { + ProvisioningPlan plan = planner.getReplacePlan(toUninstall, toInstall, profile, monitor); + if (!plan.getStatus().isOK()) + return plan.getStatus(); + SubMonitor sub = SubMonitor.convert(monitor, OperationWork); + sub.setTaskName(Messages.Director_Task_Updating); + try { + return engine.perform(profile, new DefaultPhaseSet(), plan.getOperands(), sub.newChild(OperationWork)); + } finally { + sub.done(); + } + } + +} diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/SimpleDirector2.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/SimplePlanner.java index c76b1419b..56990566c 100644 --- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/SimpleDirector2.java +++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/p2/director/SimplePlanner.java @@ -8,100 +8,48 @@ ******************************************************************************/ package org.eclipse.equinox.p2.director; -import java.net.URL; import java.util.*; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.director.*; -import org.eclipse.equinox.internal.p2.rollback.FormerState; -import org.eclipse.equinox.p2.core.eventbus.ProvisioningEventBus; import org.eclipse.equinox.p2.core.helpers.ServiceHelper; -import org.eclipse.equinox.p2.core.location.AgentLocation; -import org.eclipse.equinox.p2.core.repository.IRepository; import org.eclipse.equinox.p2.engine.Operand; import org.eclipse.equinox.p2.engine.Profile; -import org.eclipse.equinox.p2.metadata.*; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; import org.eclipse.equinox.p2.metadata.repository.IMetadataRepository; import org.eclipse.equinox.p2.metadata.repository.IMetadataRepositoryManager; import org.eclipse.equinox.p2.resolution.ResolutionHelper; import org.eclipse.osgi.service.resolver.VersionRange; import org.eclipse.osgi.util.NLS; -import org.osgi.framework.Version; -public class SimpleDirector2 implements IDirector2 { +public class SimplePlanner implements IPlanner { static final int ExpandWork = 10; - static final int OperationWork = 100; - public static void tagAsImplementation(IMetadataRepository repository) { - if (repository != null && repository.getProperties().getProperty(IRepository.IMPLEMENTATION_ONLY_KEY) == null) { - if (repository.isModifiable()) - repository.getModifiableProperties().setProperty(IRepository.IMPLEMENTATION_ONLY_KEY, Boolean.valueOf(true).toString()); - } - } - - public SimpleDirector2() { - URL rollbackLocation = null; - AgentLocation agentLocation = (AgentLocation) ServiceHelper.getService(DirectorActivator.context, AgentLocation.class.getName()); - rollbackLocation = agentLocation.getTouchpointDataArea("director"); - ProvisioningEventBus eventBus = (ProvisioningEventBus) ServiceHelper.getService(DirectorActivator.context, ProvisioningEventBus.class.getName()); - IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(DirectorActivator.context, IMetadataRepositoryManager.class.getName()); - IMetadataRepository rollbackRepo = manager.loadRepository(rollbackLocation, null); - if (rollbackRepo == null) - rollbackRepo = manager.createRepository(rollbackLocation, "Agent rollback repo", "org.eclipse.equinox.p2.metadata.repository.simpleRepository"); //$NON-NLS-1$//$NON-NLS-2$ - if (rollbackRepo == null) - throw new IllegalStateException("Unable to open or create Agent's rollback repository"); - tagAsImplementation(rollbackRepo); - new FormerState(eventBus, rollbackRepo); - } - - //TODO This is really gross!!!!! We need to make things uniform - private IInstallableUnit[] toArray(Iterator it) { - ArrayList result = new ArrayList(); - while (it.hasNext()) { - result.add(it.next()); - } - return (IInstallableUnit[]) result.toArray(new IInstallableUnit[result.size()]); - } - - protected IInstallableUnit[] createEntryPointHelper(String entryPointName, IInstallableUnit[] content) { - if (entryPointName == null) - return content; - return new IInstallableUnit[] {createEntryPoint(entryPointName, content)}; - } - - protected InstallableUnit createEntryPoint(String entryPointName, IInstallableUnit[] content) { - InstallableUnit result = new InstallableUnit(); - result.setId("entry point " + entryPointId(content)); //$NON-NLS-1$ - result.setVersion(new Version(0, 0, 0, Long.toString(System.currentTimeMillis()))); - result.setRequiredCapabilities(IUTransformationHelper.toRequirements(content, false)); - result.setProperty(IInstallableUnitConstants.ENTRYPOINT_IU_KEY, Boolean.TRUE.toString()); - result.setProperty(IInstallableUnitConstants.NAME, entryPointName); - return result; - } - - private String entryPointId(IInstallableUnit[] ius) { - StringBuffer result = new StringBuffer(); - for (int i = 0; i < ius.length; i++) { - result.append(ius[i].getId()); - if (i < ius.length - 1) - result.append(", "); //$NON-NLS-1$ - } - return result.toString(); - } - - public DirectorResult install(IInstallableUnit[] installRoots, Profile profile, String entryPointName, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, ExpandWork + OperationWork); + public ProvisioningPlan getInstallPlan(IInstallableUnit[] installRoots, Profile profile, IProgressMonitor monitor) { + SubMonitor sub = SubMonitor.convert(monitor, ExpandWork); sub.setTaskName(Messages.Director_Task_Resolving_Dependencies); try { MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, Messages.Director_Install_Problems, null); // Get the list of ius installed in the profile we are installing into IInstallableUnit[] alreadyInstalled = toArray(profile.getInstallableUnits()); + + // If any of these are already installed, return a warning status + // specifying that they are already installed. + for (int i = 0; i < installRoots.length; i++) + for (int j = 0; j < alreadyInstalled.length; j++) + if (installRoots[i].equals(alreadyInstalled[j])) + result.merge(new Status(IStatus.WARNING, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Director_Already_Installed, installRoots[i].getId()))); + + if (!result.isOK()) { + return new ProvisioningPlan(result); + } //Compute the complete closure of things to install to successfully install the installRoots. - NewDependencyExpander expander = new NewDependencyExpander(createEntryPointHelper(entryPointName, installRoots), alreadyInstalled, gatherAvailableInstallableUnits(installRoots), profile, true); + NewDependencyExpander expander = new NewDependencyExpander(installRoots, alreadyInstalled, gatherAvailableInstallableUnits(installRoots), profile, true); // NewDependencyExpander expander = new NewDependencyExpander(installRoots, alreadyInstalled, gatherAvailableInstallableUnits(), profile, true); IStatus expanderResult = expander.expand(sub.newChild(ExpandWork)); if (!expanderResult.isOK()) { result.merge(expanderResult); - return new DirectorResult(result); + return new ProvisioningPlan(result); } ResolutionHelper oldStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); @@ -111,10 +59,7 @@ public class SimpleDirector2 implements IDirector2 { ResolutionHelper newStateHelper = new ResolutionHelper(profile.getSelectionContext(), expander.getRecommendations()); Collection newState = newStateHelper.attachCUs(expander.getAllInstallableUnits()); List newStateOrder = newStateHelper.getSorted(); - - //TODO Here we need to sort the operations to ensure that the dependents will be treated first (see ensureDependencyOrder) - sub.setTaskName(NLS.bind(Messages.Director_Task_Installing, entryPointName, profile.getValue(Profile.PROP_INSTALL_FOLDER))); - return new DirectorResult(Status.OK_STATUS, generateOperations(oldState, newState, oldStateOrder, newStateOrder)); + return new ProvisioningPlan(Status.OK_STATUS, generateOperations(oldState, newState, oldStateOrder, newStateOrder)); } finally { sub.done(); } @@ -163,15 +108,15 @@ public class SimpleDirector2 implements IDirector2 { return toSort; } - public DirectorResult become(IInstallableUnit target, Profile profile, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, OperationWork + ExpandWork); + public ProvisioningPlan getBecomePlan(IInstallableUnit target, Profile profile, IProgressMonitor monitor) { + SubMonitor sub = SubMonitor.convert(monitor, ExpandWork); sub.setTaskName(Messages.Director_Task_Resolving_Dependencies); try { MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, Messages.Director_Become_Problems, null); if (!Boolean.valueOf(target.getProperty(IInstallableUnitConstants.PROFILE_IU_KEY)).booleanValue()) { result.add(new Status(IStatus.ERROR, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Director_Unexpected_IU, target.getId()))); - return new DirectorResult(result); + return new ProvisioningPlan(result); } //TODO Here we need to deal with the change of properties between the two profiles @@ -192,8 +137,7 @@ public class SimpleDirector2 implements IDirector2 { ResolutionHelper oldStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); Collection oldState = oldStateHelper.attachCUs(oldIUs); - sub.setTaskName(Messages.Director_Task_Updating); - return new DirectorResult(Status.OK_STATUS, generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted())); + return new ProvisioningPlan(Status.OK_STATUS, generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted())); } finally { sub.done(); } @@ -213,13 +157,13 @@ public class SimpleDirector2 implements IDirector2 { return (IInstallableUnit[]) result.toArray(new IInstallableUnit[result.size()]); } - public DirectorResult uninstall(IInstallableUnit[] uninstallRoots, Profile profile, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, OperationWork + ExpandWork); + public ProvisioningPlan getUninstallPlan(IInstallableUnit[] uninstallRoots, Profile profile, IProgressMonitor monitor) { + SubMonitor sub = SubMonitor.convert(monitor, ExpandWork); sub.setTaskName(Messages.Director_Task_Resolving_Dependencies); try { IInstallableUnit[] toReallyUninstall = inProfile(uninstallRoots, profile, true, sub.newChild(0)); if (toReallyUninstall.length == 0) { - return new DirectorResult(new Status(IStatus.OK, DirectorActivator.PI_DIRECTOR, Messages.Director_Nothing_To_Uninstall)); + return new ProvisioningPlan(new Status(IStatus.OK, DirectorActivator.PI_DIRECTOR, Messages.Director_Nothing_To_Uninstall)); } else if (toReallyUninstall.length != uninstallRoots.length) { uninstallRoots = toReallyUninstall; } @@ -246,10 +190,9 @@ public class SimpleDirector2 implements IDirector2 { result.add(new Status(IStatus.ERROR, DirectorActivator.PI_DIRECTOR, NLS.bind(Messages.Director_Cannot_Uninstall, uninstallRoots[i]))); } if (!result.isOK()) - return new DirectorResult(result); + return new ProvisioningPlan(result); - sub.setTaskName(Messages.Director_Task_Uninstalling); - return new DirectorResult(Status.OK_STATUS, generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted())); + return new ProvisioningPlan(Status.OK_STATUS, generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted())); } finally { sub.done(); } @@ -271,14 +214,10 @@ public class SimpleDirector2 implements IDirector2 { return (IInstallableUnit[]) results.toArray(new IInstallableUnit[results.size()]); } - public DirectorResult replace(IInstallableUnit[] toUninstall, IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor) { - SubMonitor sub = SubMonitor.convert(monitor, OperationWork + ExpandWork); + public ProvisioningPlan getReplacePlan(IInstallableUnit[] toUninstall, IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor) { + SubMonitor sub = SubMonitor.convert(monitor, ExpandWork); sub.setTaskName(Messages.Director_Task_Resolving_Dependencies); try { - MultiStatus result = new MultiStatus(DirectorActivator.PI_DIRECTOR, 1, Messages.Director_Replace_Problems, null); - - //TODO Need to worry about the entry points - //find the things being updated in the profile IInstallableUnit[] alreadyInstalled = toArray(profile.getInstallableUnits()); IInstallableUnit[] uninstallRoots = toUninstall; @@ -302,10 +241,30 @@ public class SimpleDirector2 implements IDirector2 { ResolutionHelper newStateHelper = new ResolutionHelper(profile.getSelectionContext(), null); Collection newState = newStateHelper.attachCUs(finalExpander.getAllInstallableUnits()); - sub.setTaskName(Messages.Director_Task_Updating); - return new DirectorResult(Status.OK_STATUS, generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted())); + return new ProvisioningPlan(Status.OK_STATUS, generateOperations(oldState, newState, oldStateHelper.getSorted(), newStateHelper.getSorted())); } finally { sub.done(); } } + + public IInstallableUnit[] updatesFor(IInstallableUnit toUpdate) { + IInstallableUnit[] allius = gatherAvailableInstallableUnits(null); + Set updates = new HashSet(); + for (int i = 0; i < allius.length; i++) { + if (toUpdate.getId().equals(allius[i].getProperty(IInstallableUnitConstants.UPDATE_FROM))) { + if (toUpdate.getVersion().compareTo(allius[i].getVersion()) < 0 && new VersionRange(allius[i].getProperty(IInstallableUnitConstants.UPDATE_RANGE)).isIncluded(toUpdate.getVersion())) + updates.add(allius[i]); + } + } + return (IInstallableUnit[]) updates.toArray(new IInstallableUnit[updates.size()]); + } + + //TODO This is really gross!!!!! We need to make things uniform + private IInstallableUnit[] toArray(Iterator it) { + ArrayList result = new ArrayList(); + while (it.hasNext()) { + result.add(it.next()); + } + return (IInstallableUnit[]) result.toArray(new IInstallableUnit[result.size()]); + } } diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/Profile.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/Profile.java index d0325db93..8196f72b0 100644 --- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/Profile.java +++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/Profile.java @@ -139,4 +139,24 @@ public class Profile implements IQueryable { public Iterator getInstallableUnits() { return Arrays.asList(getAllInstallableUnits()).iterator(); } + + public String getInstallableUnitProfileProperty(IInstallableUnit iu, String key) { + IInstallRegistry registry = (IInstallRegistry) ServiceHelper.getService(EngineActivator.getContext(), IInstallRegistry.class.getName()); + if (registry == null) + return null; + IProfileInstallRegistry profile = registry.getProfileInstallRegistry(this); + if (profile == null) + return null; + return profile.getInstallableUnitProfileProperty(iu, key); + } + + public String setInstallableUnitProfileProperty(IInstallableUnit iu, String key, String value) { + IInstallRegistry registry = (IInstallRegistry) ServiceHelper.getService(EngineActivator.getContext(), IInstallRegistry.class.getName()); + if (registry == null) + return null; + IProfileInstallRegistry profile = registry.getProfileInstallRegistry(this); + if (profile == null) + return null; + return profile.setInstallableUnitProfileProperty(iu, key, value); + } } diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/installregistry/IProfileInstallRegistry.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/installregistry/IProfileInstallRegistry.java index f740cc842..e0b778af3 100644 --- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/installregistry/IProfileInstallRegistry.java +++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/installregistry/IProfileInstallRegistry.java @@ -14,14 +14,18 @@ import org.eclipse.equinox.p2.metadata.IInstallableUnit; public interface IProfileInstallRegistry { - public abstract IInstallableUnit[] getInstallableUnits(); + public IInstallableUnit[] getInstallableUnits(); - public abstract IInstallableUnit getInstallableUnit(String id, String version); + public IInstallableUnit getInstallableUnit(String id, String version); - public abstract void addInstallableUnits(IInstallableUnit toAdd); + public void addInstallableUnits(IInstallableUnit toAdd); - public abstract void removeInstallableUnits(IInstallableUnit toRemove); + public void removeInstallableUnits(IInstallableUnit toRemove); - public abstract String getProfileId(); + public String getProfileId(); + + public String getInstallableUnitProfileProperty(IInstallableUnit iu, String key); + + public String setInstallableUnitProfileProperty(IInstallableUnit iu, String key, String value); }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/installregistry/InstallRegistry.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/installregistry/InstallRegistry.java index cffdfb0eb..f723721e6 100644 --- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/installregistry/InstallRegistry.java +++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/installregistry/InstallRegistry.java @@ -17,10 +17,12 @@ import java.util.*; import org.eclipse.equinox.internal.p2.engine.EngineActivator; import org.eclipse.equinox.p2.core.eventbus.ProvisioningEventBus; import org.eclipse.equinox.p2.core.eventbus.SynchronousProvisioningListener; +import org.eclipse.equinox.p2.core.helpers.OrderedProperties; import org.eclipse.equinox.p2.core.helpers.ServiceHelper; import org.eclipse.equinox.p2.core.location.AgentLocation; import org.eclipse.equinox.p2.engine.*; import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; import org.eclipse.osgi.service.datalocation.Location; import org.osgi.framework.ServiceReference; import org.osgi.framework.Version; @@ -54,7 +56,18 @@ public class InstallRegistry implements IInstallRegistry { if (event.isInstall() && event.getOperand().second() != null) { registry.addInstallableUnits(event.getOperand().second().getOriginal()); } else if (event.isUninstall() && event.getOperand().first() != null) { - registry.removeInstallableUnits(event.getOperand().first().getOriginal()); + IInstallableUnit original = event.getOperand().first().getOriginal(); + String value = registry.getInstallableUnitProfileProperty(original, IInstallableUnitConstants.PROFILE_ROOT_IU); + boolean isRoot = value != null && value.equals(Boolean.toString(true)); + registry.removeInstallableUnits(original); + // TODO this is odd because I'm setting up a property for something + // not yet installed in the registry. The implementation allows it and + // the assumption is that the second operand will get installed or else + // this change will never be committed. The alternative is to remember + // a transitory root value that we set when the install is received. + if (isRoot && event.getOperand().second() != null) { + registry.setInstallableUnitProfileProperty(event.getOperand().second().getOriginal(), IInstallableUnitConstants.PROFILE_ROOT_IU, Boolean.toString(true)); + } } } else if (o instanceof CommitOperationEvent) { persist(); @@ -145,10 +158,12 @@ public class InstallRegistry implements IInstallRegistry { public class ProfileInstallRegistry implements IProfileInstallRegistry { private String profileId; // id profile this data applies to private Set installableUnits; //id + private Map iuPropertiesMap; // iu->OrderedProperties ProfileInstallRegistry(String profileId) { this.profileId = profileId; this.installableUnits = new HashSet(); + this.iuPropertiesMap = new HashMap(); } public IInstallableUnit[] getInstallableUnits() { @@ -162,6 +177,7 @@ public class InstallRegistry implements IInstallRegistry { public void removeInstallableUnits(IInstallableUnit toRemove) { installableUnits.remove(toRemove); + iuPropertiesMap.remove(toRemove); } public String getProfileId() { @@ -176,5 +192,25 @@ public class InstallRegistry implements IInstallRegistry { } return null; } + + public String getInstallableUnitProfileProperty(IInstallableUnit toGet, String key) { + OrderedProperties properties = getInstallableUnitProfileProperties(toGet); + return properties.getProperty(key); + } + + public String setInstallableUnitProfileProperty(IInstallableUnit toSet, String key, String value) { + OrderedProperties properties = getInstallableUnitProfileProperties(toSet); + return (String) properties.setProperty(key, value); + } + + private OrderedProperties getInstallableUnitProfileProperties(IInstallableUnit toGet) { + OrderedProperties properties = (OrderedProperties) iuPropertiesMap.get(toGet); + if (properties == null) { + properties = new OrderedProperties(); + iuPropertiesMap.put(toGet, properties); + } + return properties; + } + } } diff --git a/bundles/org.eclipse.equinox.p2.exemplarysetup/src/org/eclipse/equinox/internal/p2/exemplarysetup/Activator.java b/bundles/org.eclipse.equinox.p2.exemplarysetup/src/org/eclipse/equinox/internal/p2/exemplarysetup/Activator.java index 66d4010eb..4d9863ca6 100644 --- a/bundles/org.eclipse.equinox.p2.exemplarysetup/src/org/eclipse/equinox/internal/p2/exemplarysetup/Activator.java +++ b/bundles/org.eclipse.equinox.p2.exemplarysetup/src/org/eclipse/equinox/internal/p2/exemplarysetup/Activator.java @@ -44,8 +44,8 @@ public class Activator implements BundleActivator { private IDirector director; private ServiceRegistration registrationDirector; - private IDirector2 director2; - private ServiceRegistration registrationDirector2; + private IPlanner planner; + private ServiceRegistration registrationPlanner; public void start(BundleContext context) throws Exception { //Need to do the configuration of all the bits and pieces: @@ -58,7 +58,9 @@ public class Activator implements BundleActivator { registerDefaultMetadataRepoManager(); registerInstallRegistry(); - //create the director + //create the director and planner. The planner must be + //registered first because the director finds it in its constructor. + registerPlanner(); registerDirector(); //create artifact repositories @@ -68,6 +70,7 @@ public class Activator implements BundleActivator { public void stop(BundleContext context) throws Exception { unregisterDefaultArtifactRepoManager(); unregisterDirector(); + unregisterPlanner(); unregisterInstallRegistry(); unregisterDefaultMetadataRepoManager(); unregisterProfileRegistry(); @@ -77,19 +80,23 @@ public class Activator implements BundleActivator { } private void registerDirector() { - director = new NewSimpleDirector(); + director = new SimpleDirector(); registrationDirector = context.registerService(IDirector.class.getName(), director, null); - - director2 = new SimpleDirector2(); - registrationDirector2 = context.registerService(IDirector2.class.getName(), director2, null); } private void unregisterDirector() { registrationDirector.unregister(); director = null; + } + + private void registerPlanner() { + planner = new SimplePlanner(); + registrationPlanner = context.registerService(IPlanner.class.getName(), planner, null); + } - registrationDirector2.unregister(); - director2 = null; + private void unregisterPlanner() { + registrationPlanner.unregister(); + planner = null; } private void registerProfileRegistry() { diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IInstallableUnitConstants.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IInstallableUnitConstants.java index 56cc9c871..99b577468 100644 --- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IInstallableUnitConstants.java +++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IInstallableUnitConstants.java @@ -30,7 +30,6 @@ public interface IInstallableUnitConstants { public String UPDATE_RANGE = "equinox.p2.update.range"; //$NON-NLS-1$ //TODO This is not the ideal location for these constants - public String ENTRYPOINT_IU_KEY = "entryPoint"; //$NON-NLS-1$ public static final String PROFILE_IU_KEY = "profileIU"; //$NON-NLS-1$ - + public static final String PROFILE_ROOT_IU = "profileRootIU"; //$NON-NLS-1$ } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java index 6a84a8965..b5536cceb 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java @@ -14,6 +14,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.equinox.p2.core.helpers.ServiceHelper; import org.eclipse.equinox.p2.director.IDirector; +import org.eclipse.equinox.p2.director.IPlanner; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.metadata.RequiredCapability; @@ -122,6 +123,10 @@ public class AbstractProvisioningTest extends TestCase { return (IDirector) ServiceHelper.getService(TestActivator.getContext(), IDirector.class.getName()); } + public IPlanner createPlanner() { + return (IPlanner) ServiceHelper.getService(TestActivator.getContext(), IPlanner.class.getName()); + } + public void printProfile(Profile toPrint) { boolean containsIU = false; for (Iterator iterator = toPrint.getInstallableUnits(); iterator.hasNext();) { diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/AllTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/AllTests.java index feced95bd..92e5a385a 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/AllTests.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/AllTests.java @@ -28,8 +28,7 @@ public class AllTests extends TestCase { suite.addTestSuite(RollbackTest.class); suite.addTestSuite(SingletonTest.class); suite.addTestSuite(UninstallTest.class); - suite.addTestSuite(UpdateTestWithoutEntryPoint.class); - suite.addTestSuite(UpdateTestWithEntryPoint.class); + suite.addTestSuite(UpdateTest.class); return suite; } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/AutomatedDirectorTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/AutomatedDirectorTest.java index 593b504dc..11c84e5f7 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/AutomatedDirectorTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/AutomatedDirectorTest.java @@ -63,7 +63,7 @@ public class AutomatedDirectorTest extends AbstractProvisioningTest { //Install into a profile in which the filter is satisfied Profile satisfied = new Profile("Satisfied." + getName()); satisfied.setValue(Profile.PROP_ENVIRONMENTS, "FilterKey=true"); - IStatus result = director.install(toInstallArray, satisfied, null, null); + IStatus result = director.install(toInstallArray, satisfied, null); assertTrue("1.0", result.isOK()); assertProfileContains("1.1", satisfied, allUnits); @@ -97,7 +97,7 @@ public class AutomatedDirectorTest extends AbstractProvisioningTest { Profile profile = new Profile("TestProfile." + getName()); IDirector director = createDirector(); - IStatus result = director.install(toInstallArray, profile, null, null); + IStatus result = director.install(toInstallArray, profile, null); if (!result.isOK()) LogHelper.log(result); assertTrue("1.0", result.isOK()); @@ -121,7 +121,7 @@ public class AutomatedDirectorTest extends AbstractProvisioningTest { Profile profile = new Profile("TestProfile." + getName()); IDirector director = createDirector(); - IStatus result = director.install(allUnits, profile, null, null); + IStatus result = director.install(allUnits, profile, null); if (!result.isOK()) LogHelper.log(result); assertTrue("1.0", result.isOK()); @@ -152,12 +152,12 @@ public class AutomatedDirectorTest extends AbstractProvisioningTest { Profile profile = new Profile("TestProfile." + getName()); IDirector director = createDirector(); - IStatus result = director.install(toInstallArray, profile, null, null); + IStatus result = director.install(toInstallArray, profile, null); assertTrue("1.0", !result.isOK()); //try again with the filter satisfied profile.setValue(Profile.PROP_ENVIRONMENTS, "osgi.os=blort"); - result = director.install(toInstallArray, profile, null, null); + result = director.install(toInstallArray, profile, null); assertTrue("2.0", result.isOK()); } @@ -185,7 +185,7 @@ public class AutomatedDirectorTest extends AbstractProvisioningTest { Profile profile = new Profile("TestProfile." + getName()); IDirector director = createDirector(); - IStatus result = director.install(toInstallArray, profile, null, null); + IStatus result = director.install(toInstallArray, profile, null); if (!result.isOK()) LogHelper.log(result); assertTrue("1.0", result.isOK()); @@ -215,7 +215,7 @@ public class AutomatedDirectorTest extends AbstractProvisioningTest { Profile profile = new Profile("TestProfile." + getName()); IDirector director = createDirector(); - IStatus result = director.install(toInstallArray, profile, null, null); + IStatus result = director.install(toInstallArray, profile, null); if (!result.isOK()) LogHelper.log(result); assertTrue("1.0", result.isOK()); @@ -246,7 +246,7 @@ public class AutomatedDirectorTest extends AbstractProvisioningTest { Profile profile = new Profile("TestProfile." + getName()); IDirector director = createDirector(); - IStatus result = director.install(toInstallArray, profile, null, null); + IStatus result = director.install(toInstallArray, profile, null); if (!result.isOK()) LogHelper.log(result); assertTrue("1.0", result.isOK()); diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/OracleTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/OracleTest.java index a658f6728..a9e9a369f 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/OracleTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/OracleTest.java @@ -65,10 +65,10 @@ public class OracleTest extends AbstractProvisioningTest { } public void testInstallA1() { - assertEquals(director.install(new IInstallableUnit[] {a1}, profile, null, null).getSeverity(), IStatus.OK); + assertEquals(director.install(new IInstallableUnit[] {a1}, profile, null).getSeverity(), IStatus.OK); createTestMetdataRepository(new IInstallableUnit[] {d2}); // assertEquals(new Oracle().canInstall(new IInstallableUnit[] {b1}, profile, null), true); - assertEquals(director.install(new IInstallableUnit[] {b1}, profile, null, null).getSeverity(), IStatus.OK); + assertEquals(director.install(new IInstallableUnit[] {b1}, profile, null).getSeverity(), IStatus.OK); } } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/OracleTest2.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/OracleTest2.java index e595615b0..70174635a 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/OracleTest2.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/OracleTest2.java @@ -8,10 +8,8 @@ ******************************************************************************/ package org.eclipse.equinox.p2.tests.director; -import java.util.Collection; import org.eclipse.core.runtime.IStatus; import org.eclipse.equinox.p2.director.IDirector; -import org.eclipse.equinox.p2.director.Oracle; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.*; import org.eclipse.equinox.p2.tests.AbstractProvisioningTest; @@ -68,11 +66,11 @@ public class OracleTest2 extends AbstractProvisioningTest { } - /* - * TODO Currently this test throws ClassCastException - */ - public void _testInstallA1() { - assertEquals(director.install(new IInstallableUnit[] {a1}, profile, null, null).getSeverity(), IStatus.OK); + /* I'm not sure what this test should look like now + * + + public void testInstallA1() { + assertEquals(director.install(new IInstallableUnit[] {a1}, profile, null).getSeverity(), IStatus.OK); createTestMetdataRepository(new IInstallableUnit[] {a2, c2, b1}); Collection brokenEntryPoint = (Collection) new Oracle().canInstall(new IInstallableUnit[] {b1}, profile, null); @@ -81,12 +79,13 @@ public class OracleTest2 extends AbstractProvisioningTest { new Oracle().hasUpdate(a1); System.out.println(new Oracle().canInstall(new IInstallableUnit[] {b1}, (IInstallableUnit[]) brokenEntryPoint.toArray(new IInstallableUnit[brokenEntryPoint.size()]), profile, null)); } + */ public void testInstallA1bis() { profile = new Profile("testInstallA1bis." + getName()); director = createDirector(); createTestMetdataRepository(new IInstallableUnit[] {a1, a2, c1, c2, b1}); - assertEquals(director.install(new IInstallableUnit[] {a1}, profile, null, null).getSeverity(), IStatus.OK); + assertEquals(director.install(new IInstallableUnit[] {a1}, profile, null).getSeverity(), IStatus.OK); } } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/RollbackTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/RollbackTest.java index 91cdd46eb..27efb8aed 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/RollbackTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/RollbackTest.java @@ -40,7 +40,7 @@ public class RollbackTest extends AbstractProvisioningTest { } public void test() { - System.out.println(director.install(new IInstallableUnit[] {a1}, profile, null, new NullProgressMonitor())); + System.out.println(director.install(new IInstallableUnit[] {a1}, profile, new NullProgressMonitor())); printProfile(profile); IMetadataRepositoryManager repoMan = (IMetadataRepositoryManager) ServiceHelper.getService(TestActivator.getContext(), IMetadataRepositoryManager.class.getName()); IMetadataRepository repo = null; diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/SingletonTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/SingletonTest.java index 1522e9baa..87f0f595e 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/SingletonTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/SingletonTest.java @@ -66,16 +66,16 @@ public class SingletonTest extends AbstractProvisioningTest { public void testMultipleVersionNonSingleton() { //The installation of junit38 and junit 40 together should succeed - assertEquals(director.install(new IInstallableUnit[] {junit38, junit40}, profile, null, new NullProgressMonitor()).getSeverity(), IStatus.OK); + assertEquals(director.install(new IInstallableUnit[] {junit38, junit40}, profile, new NullProgressMonitor()).getSeverity(), IStatus.OK); } public void testMultipleVersionSingleton() { //The installation of junit38 and junit 40 together should succeed - assertEquals(director.install(new IInstallableUnit[] {f1, f1_1}, profile, null, new NullProgressMonitor()).getSeverity(), IStatus.ERROR); + assertEquals(director.install(new IInstallableUnit[] {f1, f1_1}, profile, new NullProgressMonitor()).getSeverity(), IStatus.ERROR); } public void testMultipleVersionSingleton2() { //The installation of junit38 and junit 40 together should succeed - assertEquals(director.install(new IInstallableUnit[] {f2, f2_1}, profile, null, new NullProgressMonitor()).getSeverity(), IStatus.ERROR); + assertEquals(director.install(new IInstallableUnit[] {f2, f2_1}, profile, new NullProgressMonitor()).getSeverity(), IStatus.ERROR); } } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UninstallTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UninstallTest.java index 65efb55b7..0a844dc30 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UninstallTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UninstallTest.java @@ -31,7 +31,7 @@ public class UninstallTest extends AbstractProvisioningTest { } public void testUninstall() { - System.out.println(director.install(new IInstallableUnit[] {a1}, profile, null, null)); + System.out.println(director.install(new IInstallableUnit[] {a1}, profile, null)); director.uninstall(new IInstallableUnit[] {a1}, profile, null); assertEmptyProfile(profile); } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UpdateTestWithoutEntryPoint.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UpdateTest.java index 2bef12e17..84090be12 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UpdateTestWithoutEntryPoint.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UpdateTest.java @@ -19,7 +19,7 @@ import org.eclipse.equinox.p2.tests.AbstractProvisioningTest; import org.eclipse.osgi.service.resolver.VersionRange; import org.osgi.framework.Version; -public class UpdateTestWithoutEntryPoint extends AbstractProvisioningTest { +public class UpdateTest extends AbstractProvisioningTest { InstallableUnit f1; InstallableUnit f1_1; InstallableUnit f1_4; @@ -59,18 +59,18 @@ public class UpdateTestWithoutEntryPoint extends AbstractProvisioningTest { profile = new Profile("TestProfile." + getName()); director = createDirector(); - director.install(new IInstallableUnit[] {fa}, profile, null, null); + director.install(new IInstallableUnit[] {fa}, profile, null); createTestMetdataRepository(new IInstallableUnit[] {f1_1, f1_4}); } public void testInstall() { - assertEquals(director.install(new IInstallableUnit[] {f1_1}, profile, null, new NullProgressMonitor()).getSeverity(), IStatus.OK); + assertEquals(director.install(new IInstallableUnit[] {f1_1}, profile, new NullProgressMonitor()).getSeverity(), IStatus.OK); for (Iterator iterator = profile.getInstallableUnits(); iterator.hasNext();) { System.out.println(iterator.next()); } - assertEquals(director.install(new IInstallableUnit[] {f1_4}, profile, null, new NullProgressMonitor()).getSeverity(), IStatus.ERROR); + assertEquals(director.install(new IInstallableUnit[] {f1_4}, profile, new NullProgressMonitor()).getSeverity(), IStatus.ERROR); // director.replace(new IInstallableUnit[] {fap}, profile, new NullProgressMonitor()); } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UpdateTestWithEntryPoint.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UpdateTestWithEntryPoint.java deleted file mode 100644 index 41319e31d..000000000 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/UpdateTestWithEntryPoint.java +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 IBM Corporation and others. All rights reserved. This - * program and the accompanying materials are made available under the terms of - * the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: IBM Corporation - initial API and implementation - ******************************************************************************/ -package org.eclipse.equinox.p2.tests.director; - -import java.util.Collection; -import java.util.Iterator; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.equinox.p2.director.IDirector; -import org.eclipse.equinox.p2.director.Oracle; -import org.eclipse.equinox.p2.engine.Profile; -import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.tests.AbstractProvisioningTest; -import org.osgi.framework.Version; - -public class UpdateTestWithEntryPoint extends AbstractProvisioningTest { - InstallableUnit f1; - InstallableUnit f1_1; - - IDirector director; - Profile profile; - - protected void setUp() throws Exception { - f1 = new InstallableUnit(); - f1.setId("f1"); - f1.setVersion(new Version(1, 0, 0)); - f1.setSingleton(true); - - f1_1 = new InstallableUnit(); - f1_1.setId("f1"); - f1_1.setVersion(new Version(1, 1, 0)); - f1_1.setSingleton(true); - f1_1.setProperty(IInstallableUnitConstants.UPDATE_FROM, "f1"); - f1_1.setProperty(IInstallableUnitConstants.UPDATE_RANGE, "[1.0.0, 2.0.0)"); - - profile = new Profile("TestProfile." + getName()); - director = createDirector(); - createTestMetdataRepository(new IInstallableUnit[] {f1_1, f1}); - } - - public void testInstall() { - //TODO Currently this test is failing - if (true) - return; - - String entryPointName = "e1"; - assertEquals(director.install(new IInstallableUnit[] {f1}, profile, entryPointName, new NullProgressMonitor()).getSeverity(), IStatus.OK); - for (Iterator iterator = profile.getInstallableUnits(); iterator.hasNext();) { - System.out.println(iterator.next()); - - } - - //TODO This should return an error because we are trying to update something that would cause the entry point to be unsatisfied - //director.update(new IInstallableUnit[] {f1_1}, profile, new NullProgressMonitor()); - - IInstallableUnit toReplace = get(entryPointName, profile); - Collection updates = new Oracle().hasUpdate(toReplace); - - director.replace(new IInstallableUnit[] {toReplace}, (IInstallableUnit[]) updates.toArray(new IInstallableUnit[updates.size()]), profile, new NullProgressMonitor()); - - //TODO Add a test to verify that we are not going down in the version - //TODO Add a test to verify that we respect the ranges - - } - - private IInstallableUnit get(String id, Profile p) { - Iterator it = profile.getInstallableUnits(); - while (it.hasNext()) { - IInstallableUnit o = (IInstallableUnit) it.next(); - if (o.getId().equals(id)) - return o; - } - return null; - } -} diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/DirectorTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/DirectorTest.java index 00ac1a06c..a3bcf38bf 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/DirectorTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/DirectorTest.java @@ -97,7 +97,7 @@ public class DirectorTest extends TestCase { if (allJobs.size() != 0) { allRoots[0] = (IInstallableUnit) allJobs.iterator().next(); if (!doUninstall) { - operationStatus = director.install(allRoots, p, null, new NullProgressMonitor()); + operationStatus = director.install(allRoots, p, new NullProgressMonitor()); } else { operationStatus = director.uninstall(allRoots, p, new NullProgressMonitor()); } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest.java index 639d26c9a..e5c3cb354 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest.java @@ -13,11 +13,10 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.equinox.p2.core.helpers.ServiceHelper; import org.eclipse.equinox.p2.director.IDirector; -import org.eclipse.equinox.p2.director.Oracle; +import org.eclipse.equinox.p2.director.IPlanner; import org.eclipse.equinox.p2.engine.IProfileRegistry; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; import org.eclipse.equinox.p2.metadata.repository.IMetadataRepository; import org.eclipse.equinox.p2.metadata.repository.IMetadataRepositoryManager; import org.eclipse.equinox.p2.tests.AbstractProvisioningTest; @@ -31,6 +30,7 @@ public class End2EndTest extends AbstractProvisioningTest { private IMetadataRepository[] repos; private IDirector director; + private IPlanner planner; protected void setUp() throws Exception { ServiceReference sr = TestActivator.context.getServiceReference(IDirector.class.getName()); @@ -38,6 +38,7 @@ public class End2EndTest extends AbstractProvisioningTest { throw new RuntimeException("Director service not available"); } director = createDirector(); + planner = createPlanner(); ServiceReference sr2 = TestActivator.context.getServiceReference(IMetadataRepositoryManager.class.getName()); IMetadataRepositoryManager mgr = (IMetadataRepositoryManager) TestActivator.context.getService(sr2); if (mgr == null) { @@ -82,91 +83,10 @@ public class End2EndTest extends AbstractProvisioningTest { return profile1; } - private Collection extractIUs(Profile p) { - Collection result = new HashSet(); - Iterator it = p.getInstallableUnits(); - while (it.hasNext()) { - result.add(it.next()); - } - return result; - } - - public void testInstallSDKWithEntryPoint() { - Profile profile1 = createProfile("profile1"); - //First we install the sdk - IStatus s = director.install(new IInstallableUnit[] {getIU("sdk", new Version("3.3.0"))}, profile1, "entryPoint1", new NullProgressMonitor()); - assertOK(s); - Collection iusInstalled = extractIUs(profile1); - IInstallableUnit firstSnapshot = getIU("profile1"); //This should represent the empty profile - assertNotNull(firstSnapshot); - assertNotNull(firstSnapshot.getProperty("profileIU")); - IInstallableUnit firstEntryPoint = null; - try { - firstEntryPoint = getIU(IInstallableUnitConstants.ENTRYPOINT_IU_KEY, "true")[0]; - } catch (ArrayIndexOutOfBoundsException e) { - fail("We expect to find an entry point"); - } - - //The uninstallation should not work since there is an entyr point - s = director.uninstall(new IInstallableUnit[] {getIU("sdk", new Version("3.3.0"))}, profile1, new NullProgressMonitor()); - assertNotOK(s); - - //The uninstallation of the entry point should lead to an empty profile - s = director.uninstall(new IInstallableUnit[] {firstEntryPoint}, profile1, new NullProgressMonitor()); - assertOK(s); - - assertEmptyProfile(profile1); - IInstallableUnit[] snapshots = getIUs("profile1"); - assertEquals(2, snapshots.length); - assertEquals(false, profile1.getIterator("sdk", VersionRange.emptyRange, null, false).hasNext()); - - // Now test the rollback to a previous state, in this case we reinstall the SDK - s = director.become(snapshots[0].equals(firstSnapshot) ? snapshots[1] : snapshots[0], profile1, new NullProgressMonitor()); - if (!s.isOK()) - fail("The become operation failed"); - - assertNotNull(getIU("sdk")); - assertEquals(firstEntryPoint, getIU(firstEntryPoint.getId())); - Collection afterRollback = extractIUs(profile1); - - //Verify that the rollback brought back everything we had - Collection iusInstalledCopy = new HashSet(iusInstalled); - iusInstalled.removeAll(afterRollback); - afterRollback.removeAll(iusInstalledCopy); - assertEquals(0, iusInstalled.size()); - assertEquals(0, afterRollback.size()); - - //Now update for the SDK itself - Collection snapshotsBeforeUpdate = Arrays.asList(getIUs("profile1")); - assertEquals(1, new Oracle().hasUpdate(getIU("sdk", new Version("3.3.0"))).size()); - s = director.replace(new IInstallableUnit[] {firstEntryPoint}, new IInstallableUnit[] {(IInstallableUnit) new Oracle().hasUpdate(getIU("sdk", new Version("3.3.0"))).iterator().next()}, profile1, new NullProgressMonitor()); - assertOK(s); - assertProfileContainsAll("", profile1, new IInstallableUnit[] {getIU("sdk", new Version("3.4.0"))}); - Collection snapsshotsAfterUpdate = new ArrayList(Arrays.asList(getIUs("profile1"))); - snapsshotsAfterUpdate.removeAll(snapshotsBeforeUpdate); - IInstallableUnit former = (IInstallableUnit) snapsshotsAfterUpdate.iterator().next(); - - //Now come back to a 3.3 install - s = director.become(former, profile1, new NullProgressMonitor()); - assertOK(s); - - //Test replace the sdk 3.3 entry point with 3.4 - assertEquals(1, new Oracle().hasUpdate(firstEntryPoint).size()); - s = director.replace(new IInstallableUnit[] {firstEntryPoint}, new IInstallableUnit[] {(IInstallableUnit) new Oracle().hasUpdate(firstEntryPoint).iterator().next()}, profile1, new NullProgressMonitor()); - assertOK(s); - assertProfileContainsAll("", profile1, new IInstallableUnit[] {getIU("sdk", new Version("3.4.0"))}); - assertNotIUs(new IInstallableUnit[] {getIU("sdk", new Version("3.3.0"))}, profile1.getInstallableUnits()); - - //Remove everything from the profile by becoming an empty profile - s = director.become(firstSnapshot, profile1, new NullProgressMonitor()); - assertOK(s); - // assertEmptyProfile(profile1); - } - public void testInstallSDK() { Profile profile2 = createProfile("profile2"); //First we install the sdk - IStatus s = director.install(new IInstallableUnit[] {getIU("sdk", new Version("3.3.0"))}, profile2, null, new NullProgressMonitor()); + IStatus s = director.install(new IInstallableUnit[] {getIU("sdk", new Version("3.3.0"))}, profile2, new NullProgressMonitor()); if (!s.isOK()) fail("Installation failed"); IInstallableUnit firstSnapshot = getIU("profile2"); //This should represent the empty profile @@ -191,7 +111,7 @@ public class End2EndTest extends AbstractProvisioningTest { assertNotNull(getIU("sdk")); //Test replace - s = director.replace(new IInstallableUnit[] {getIU("sdk", new Version("3.3.0"))}, new IInstallableUnit[] {getIU("sdk", new Version("3.4.0"))}, profile2, new NullProgressMonitor()); + s = director.replace(new IInstallableUnit[] {getIU("sdk", new Version("3.3.0"))}, planner.updatesFor(getIU("sdk", new Version("3.3.0"))), profile2, new NullProgressMonitor()); assertOK(s); assertProfileContainsAll("", profile2, new IInstallableUnit[] {getIU("sdk", new Version("3.4.0"))}); assertNotIUs(new IInstallableUnit[] {getIU("sdk", new Version("3.3.0"))}, profile2.getInstallableUnits()); diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/plugin.properties b/bundles/org.eclipse.equinox.p2.ui.admin/plugin.properties index 422c4cd5d..92c0d0098 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/plugin.properties +++ b/bundles/org.eclipse.equinox.p2.ui.admin/plugin.properties @@ -22,4 +22,5 @@ Profiles.name=Profiles Provisioning.title=Provisioning Profile.name=Profile IU.name=Installable Unit +InstalledIU.name=IU Profile Properties Repository.name=Repository
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/plugin.xml b/bundles/org.eclipse.equinox.p2.ui.admin/plugin.xml index 579b97bf8..f5a5261db 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/plugin.xml +++ b/bundles/org.eclipse.equinox.p2.ui.admin/plugin.xml @@ -87,6 +87,17 @@ </or> </enabledWhen> </page> + <page + name="%InstalledIU.name" + class="org.eclipse.equinox.internal.p2.ui.admin.dialogs.InstalledIUPropertyPage" + id="org.eclipse.equinox.internal.p2.ui.admin.dialogs.InstalledIUPropertyPage"> + <enabledWhen> + <instanceof + value="org.eclipse.equinox.p2.ui.model.InstalledIUElement"> + </instanceof> + </enabledWhen> + </page> + <page name="%Repository.name" diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/MetadataRepositoriesView.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/MetadataRepositoriesView.java index abc9c10b7..066645797 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/MetadataRepositoriesView.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/MetadataRepositoriesView.java @@ -15,8 +15,6 @@ import org.eclipse.core.commands.operations.IUndoableOperation; import org.eclipse.equinox.internal.p2.ui.admin.dialogs.AddMetadataRepositoryDialog; import org.eclipse.equinox.internal.p2.ui.admin.dialogs.AddProfileDialog; import org.eclipse.equinox.p2.engine.Profile; -import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; import org.eclipse.equinox.p2.metadata.repository.IMetadataRepository; import org.eclipse.equinox.p2.ui.IProfileChooser; import org.eclipse.equinox.p2.ui.actions.BecomeAction; @@ -27,7 +25,8 @@ import org.eclipse.equinox.p2.ui.viewers.IUDragAdapter; import org.eclipse.equinox.p2.ui.viewers.ProvElementLabelProvider; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; -import org.eclipse.jface.viewers.*; +import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.dnd.*; import org.eclipse.swt.widgets.Shell; @@ -91,9 +90,8 @@ public class MetadataRepositoriesView extends RepositoriesView { protected void makeActions() { super.makeActions(); - installAction = new InstallAction(ProvAdminUIMessages.InstallIUCommandLabel, viewer, null, null, getProfileChooser(), getShell()); - installAction.setEntryPointStrategy(InstallAction.ENTRYPOINT_OPTIONAL); - becomeAction = new BecomeAction(ProvAdminUIMessages.BecomeIUCommandLabel, viewer, null, null, getProfileChooser(), getShell()); + installAction = new InstallAction(viewer, null, getProfileChooser(), getShell()); + becomeAction = new BecomeAction(viewer, null, getProfileChooser(), getShell()); } private IProfileChooser getProfileChooser() { @@ -130,28 +128,6 @@ public class MetadataRepositoriesView extends RepositoriesView { }; } - protected void selectionChanged(IStructuredSelection selection) { - super.selectionChanged(selection); - if (selection.size() < 1) { - installAction.setEnabled(false); - becomeAction.setEnabled(false); - } - Object[] selectionArray = selection.toArray(); - if (selectionArray.length == 1 && selectionArray[0] instanceof IInstallableUnit) { - IInstallableUnit iu = (IInstallableUnit) selectionArray[0]; - becomeAction.setEnabled(Boolean.valueOf(iu.getProperty(IInstallableUnitConstants.PROFILE_IU_KEY)).booleanValue()); - } else { - becomeAction.setEnabled(false); - } - for (int i = 0; i < selectionArray.length; i++) { - if (!(selectionArray[i] instanceof IInstallableUnit)) { - installAction.setEnabled(false); - return; - } - } - installAction.setEnabled(true); - } - protected void fillContextMenu(IMenuManager manager) { if (installAction.isEnabled()) { manager.add(new Separator()); diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProfilesView.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProfilesView.java index 24d7edf49..0a0a6aadb 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProfilesView.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProfilesView.java @@ -13,29 +13,22 @@ package org.eclipse.equinox.internal.p2.ui.admin; import java.util.ArrayList; import java.util.List; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.commands.operations.IUndoableOperation; import org.eclipse.core.runtime.IStatus; import org.eclipse.equinox.internal.p2.ui.admin.dialogs.AddProfileDialog; import org.eclipse.equinox.internal.p2.ui.admin.dialogs.UpdateAndInstallDialog; -import org.eclipse.equinox.internal.p2.ui.admin.preferences.PreferenceConstants; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.ui.*; -import org.eclipse.equinox.p2.ui.actions.*; -import org.eclipse.equinox.p2.ui.admin.ProvAdminUIActivator; +import org.eclipse.equinox.p2.ui.actions.UninstallAction; +import org.eclipse.equinox.p2.ui.actions.UpdateAction; import org.eclipse.equinox.p2.ui.model.*; -import org.eclipse.equinox.p2.ui.operations.*; +import org.eclipse.equinox.p2.ui.operations.ProfileOperation; +import org.eclipse.equinox.p2.ui.operations.RemoveProfilesOperation; import org.eclipse.equinox.p2.ui.viewers.InstallIUDropAdapter; import org.eclipse.equinox.p2.ui.viewers.StructuredViewerProvisioningListener; import org.eclipse.jface.action.*; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.MessageDialogWithToggle; -import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.*; -import org.eclipse.jface.window.Window; -import org.eclipse.osgi.util.NLS; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; @@ -69,10 +62,9 @@ public class ProfilesView extends ProvView { profilesOnly.add(element); } } - IUndoableOperation op = new RemoveProfilesOperation(ProvAdminUIMessages.Ops_RemoveProfileOperationLabel, (Profile[]) profilesOnly.toArray(new Profile[profilesOnly.size()])); + ProfileOperation op = new RemoveProfilesOperation(ProvAdminUIMessages.Ops_RemoveProfileOperationLabel, (Profile[]) profilesOnly.toArray(new Profile[profilesOnly.size()])); try { - // TODO hook into platform progress service - IStatus status = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory().execute(op, null, ProvUI.getUIInfoAdapter(ProfilesView.this.getShell())); + IStatus status = op.execute(null, ProvUI.getUIInfoAdapter(ProfilesView.this.getShell())); if (status.isOK()) { viewer.refresh(); } @@ -97,8 +89,8 @@ public class ProfilesView extends ProvView { private class InstallIntoProfileAction extends Action { InstallIntoProfileAction() { - setText(ProvAdminUIMessages.InstallIUCommandLabel); - setToolTipText(ProvAdminUIMessages.InstallIUCommandTooltip); + setText(ProvUI.INSTALL_COMMAND_LABEL); + setToolTipText(ProvUI.INSTALL_COMMAND_TOOLTIP); } public void run() { @@ -128,9 +120,8 @@ public class ProfilesView extends ProvView { protected void configureViewer(TreeViewer treeViewer) { super.configureViewer(treeViewer); treeViewer.setInput(new AllProfiles()); - InstallIUDropAdapter adapter = new InstallIUDropAdapter(treeViewer, getOperationConfirmer()); + InstallIUDropAdapter adapter = new InstallIUDropAdapter(treeViewer); adapter.setFeedbackEnabled(false); - adapter.setEntryPointStrategy(InstallAction.ENTRYPOINT_OPTIONAL); Transfer[] transfers = new Transfer[] {org.eclipse.jface.util.LocalSelectionTransfer.getTransfer()}; treeViewer.addDropSupport(DND.DROP_COPY, transfers, adapter); } @@ -174,10 +165,8 @@ public class ProfilesView extends ProvView { super.makeActions(); addProfileAction = new AddProfileAction(); removeProfileAction = new RemoveProfileAction(); - uninstallAction = new UninstallAction(ProvAdminUIMessages.UninstallIUCommandLabel, viewer, getOperationConfirmer(), null, getProfileChooser(), getShell()); - uninstallAction.setToolTipText(ProvAdminUIMessages.UninstallIUCommandTooltip); - updateAction = new UpdateAction(ProvAdminUIMessages.UpdateIUCommandLabel, viewer, getOperationConfirmer(), null, getProfileChooser(), getShell()); - updateAction.setToolTipText(ProvAdminUIMessages.UpdateIUCommandTooltip); + uninstallAction = new UninstallAction(viewer, null, getProfileChooser(), getShell()); + updateAction = new UpdateAction(viewer, null, getProfileChooser(), getShell()); propertiesAction = new PropertyDialogAction(this.getSite(), viewer); installAction = new InstallIntoProfileAction(); @@ -196,52 +185,21 @@ public class ProfilesView extends ProvView { protected void selectionChanged(IStructuredSelection ss) { super.selectionChanged(ss); if (ss.size() == 1) { - propertiesAction.setEnabled(true); if (ss.getFirstElement() instanceof Profile) installAction.setEnabled(true); else installAction.setEnabled(false); - } else { - propertiesAction.setEnabled(false); } Object[] selectionArray = ss.toArray(); - Object parent = null; if (selectionArray.length > 0) { - uninstallAction.setEnabled(true); - updateAction.setEnabled(true); removeProfileAction.setEnabled(true); - for (int i = 0; i < selectionArray.length; i++) { - if (selectionArray[i] instanceof InstalledIUElement) { - InstalledIUElement element = (InstalledIUElement) selectionArray[i]; - if (parent == null) { - parent = element.getParent(null); - } else if (parent != element.getParent(null)) { - uninstallAction.setEnabled(false); - updateAction.setEnabled(false); - break; - } - } else { - uninstallAction.setEnabled(false); - updateAction.setEnabled(false); + if (!(selectionArray[i] instanceof Profile)) { + removeProfileAction.setEnabled(false); break; } } - // If the selections weren't all IU's, see if they are all - // profiles - if (!uninstallAction.isEnabled()) { - for (int i = 0; i < selectionArray.length; i++) { - if (!(selectionArray[i] instanceof Profile)) { - removeProfileAction.setEnabled(false); - break; - } - } - } else { - removeProfileAction.setEnabled(false); - } } else { - uninstallAction.setEnabled(false); - updateAction.setEnabled(false); removeProfileAction.setEnabled(false); } } @@ -276,35 +234,4 @@ public class ProfilesView extends ProvView { } }; } - - private IOperationConfirmer getOperationConfirmer() { - return new IOperationConfirmer() { - - public boolean continuePerformingOperation(ProvisioningOperation op, Shell shell) { - String confirmMessage; - if (op instanceof InstallOperation) { - confirmMessage = NLS.bind(ProvAdminUIMessages.Ops_ConfirmIUInstall, ((InstallOperation) op).getProfileId()); - } else if (op instanceof UninstallOperation) { - confirmMessage = ProvAdminUIMessages.ProfilesView_ConfirmUninstallMessage; - } else { - return true; - } - boolean proceed = true; - IPreferenceStore store = ProvAdminUIActivator.getDefault().getPreferenceStore(); - if (store.getBoolean(PreferenceConstants.PREF_CONFIRM_SELECTION_INSTALL)) { - MessageDialogWithToggle dlg = MessageDialogWithToggle.openYesNoCancelQuestion(shell, op.getLabel(), confirmMessage, ProvAdminUIMessages.ProfilesView_AlwaysConfirmSelectionInstallOps, true, null, null); - int ret = dlg.getReturnCode(); - if (!(ret == Window.CANCEL || ret == -1)) { // return - // code of -1 corresponds with ESC - // even if no was pressed, we still want to store - // the toggle state. - store.setValue(PreferenceConstants.PREF_CONFIRM_SELECTION_INSTALL, dlg.getToggleState()); - } - proceed = dlg.getReturnCode() == IDialogConstants.YES_ID; - } - return proceed; - } - }; - } - }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProvAdminUIMessages.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProvAdminUIMessages.java index f700e42f8..f05a6a005 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProvAdminUIMessages.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProvAdminUIMessages.java @@ -42,33 +42,24 @@ public class ProvAdminUIMessages extends NLS { public static String ArtifactRepositoriesView_RemoveRepositoryOperationLabel; public static String ProfilesView_AddProfileTooltip; public static String ProfilesView_AddProfileLabel; - public static String ProfilesView_ConfirmUninstallMessage; public static String ProfilesView_RemoveProfileLabel; public static String ProfilesView_RemoveProfileTooltip; // Preferences public static String ProvisioningPrefPage_ConfirmSelectionInstallOps; + public static String InstalledIUPropertyPage_NoInfoAvailable; public static String ProvisioningPrefPage_HideInternalRepos; public static String ProvisioningPrefPage_ShowGroupsOnly; public static String ProvisioningPrefPage_Description; public static String Ops_RemoveProfileOperationLabel; - public static String Ops_ConfirmIUInstall; public static String AddProfileDialog_OperationLabel; public static String AddProfileDialog_DuplicateProfileID; public static String UpdateAndInstallDialog_AvailableIUsPageLabel; public static String UpdateAndInstallDialog_InstalledIUsPageLabel; + public static String UpdateAndInstallDialog_Title; - public static String Ops_InstallIUOperationLabel; - public static String Ops_UninstallIUOperationLabel; - public static String Ops_UpdateIUOperationLabel; - - public static String InstallIUCommandLabel; - public static String BecomeIUCommandLabel; - public static String InstallIUCommandTooltip; - public static String UninstallIUCommandLabel; - public static String UninstallIUCommandTooltip; - public static String UpdateIUCommandLabel; - public static String UpdateIUCommandTooltip; public static String ProvView_RefreshCommandLabel; public static String ProvView_RefreshCommandTooltip; + + public static String ProfileRootPropertyName; } diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProvView.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProvView.java index 5203a5d9e..d00aa9641 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProvView.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/ProvView.java @@ -58,7 +58,7 @@ abstract class ProvView extends ViewPart { viewer.getTree().setHeaderVisible(true); viewer.setContentProvider(getContentProvider()); viewer.setInput(getInput()); - viewer.setLabelProvider(new ProvElementLabelProvider()); + viewer.setLabelProvider(getLabelProvider()); viewer.setComparator(new ViewerComparator()); configureViewer(viewer); addListeners(); @@ -217,4 +217,8 @@ abstract class ProvView extends ViewPart { tc.setWidth(600); tc.setResizable(true); } + + protected ILabelProvider getLabelProvider() { + return new ProvElementLabelProvider(); + } } diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/AddProfileDialog.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/AddProfileDialog.java index 45ea4a529..83447c3ae 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/AddProfileDialog.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/AddProfileDialog.java @@ -11,7 +11,6 @@ package org.eclipse.equinox.internal.p2.ui.admin.dialogs; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.commands.operations.IUndoableOperation; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.equinox.internal.p2.ui.admin.ProvAdminUIMessages; @@ -20,12 +19,12 @@ import org.eclipse.equinox.p2.ui.ProvUI; import org.eclipse.equinox.p2.ui.admin.ProvAdminUIActivator; import org.eclipse.equinox.p2.ui.dialogs.ProfileGroup; import org.eclipse.equinox.p2.ui.operations.AddProfileOperation; +import org.eclipse.equinox.p2.ui.operations.ProfileOperation; import org.eclipse.jface.dialogs.*; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.*; -import org.eclipse.ui.PlatformUI; /** * Dialog that allows a profile to be defined and added. @@ -77,10 +76,9 @@ public class AddProfileDialog extends StatusDialog { if (addedProfile == null) { return false; } - IUndoableOperation op = new AddProfileOperation(ProvAdminUIMessages.AddProfileDialog_OperationLabel, addedProfile); + ProfileOperation op = new AddProfileOperation(ProvAdminUIMessages.AddProfileDialog_OperationLabel, addedProfile); try { - // TODO hook into platform progress service - PlatformUI.getWorkbench().getOperationSupport().getOperationHistory().execute(op, null, ProvUI.getUIInfoAdapter(getShell())); + op.execute(null, ProvUI.getUIInfoAdapter(getShell())); } catch (ExecutionException e) { ProvUI.handleException(e.getCause(), null); return false; diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/IUProfilePropertiesGroup.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/IUProfilePropertiesGroup.java new file mode 100644 index 000000000..d3884f072 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/IUProfilePropertiesGroup.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.internal.p2.ui.admin.dialogs; + +import org.eclipse.equinox.internal.p2.ui.admin.ProvAdminUIMessages; +import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; +import org.eclipse.equinox.p2.ui.dialogs.IUGroup; +import org.eclipse.equinox.p2.ui.model.InstalledIUElement; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.*; + +/** + * An IUPropertiesGroup is a reusable UI component that displays and edits the + * user-oriented properties of an IU. It can be used in + * different dialogs that manipulate or define IU's. + * + * @since 3.4 + */ +public class IUProfilePropertiesGroup extends IUGroup { + + private Table propertiesTable; + + public IUProfilePropertiesGroup(final Composite parent, InstalledIUElement iuElement, ModifyListener listener) { + super(parent, iuElement, listener); + } + + protected Composite createGroupComposite(Composite parent, ModifyListener listener) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + composite.setLayout(layout); + GridData data = new GridData(); + data.widthHint = 400; + composite.setLayoutData(data); + + propertiesTable = new Table(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); + data = new GridData(GridData.FILL_BOTH); + data.grabExcessVerticalSpace = true; + propertiesTable.setLayoutData(data); + propertiesTable.setHeaderVisible(true); + TableColumn nameColumn = new TableColumn(propertiesTable, SWT.NONE); + nameColumn.setResizable(true); + nameColumn.setWidth(200); + TableColumn valueColumn = new TableColumn(propertiesTable, SWT.NONE); + valueColumn.setResizable(true); + valueColumn.setWidth(250); + initializeFields(); + return composite; + } + + private void initializeFields() { + if (iuElement == null || !(iuElement instanceof InstalledIUElement)) { + return; + } + String[] propNames = new String[] {IInstallableUnitConstants.PROFILE_ROOT_IU}; + String[] userPropNames = new String[] {ProvAdminUIMessages.ProfileRootPropertyName}; + for (int i = 0; i < propNames.length; i++) { + TableItem item = new TableItem(propertiesTable, SWT.NULL); + String value = ((InstalledIUElement) iuElement).getProfile().getInstallableUnitProfileProperty(getIU(), propNames[i]); + if (value != null) + item.setText(new String[] {userPropNames[i], value}); + } + } +} diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/InstalledIUPropertyPage.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/InstalledIUPropertyPage.java new file mode 100644 index 000000000..4a1fa07fc --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/InstalledIUPropertyPage.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.internal.p2.ui.admin.dialogs; + +import org.eclipse.equinox.internal.p2.ui.admin.ProvAdminUIMessages; +import org.eclipse.equinox.p2.ui.model.InstalledIUElement; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.widgets.*; +import org.eclipse.ui.dialogs.PropertyPage; + +/** + * PropertyPage that shows an IU's properties + * + * @since 3.4 + */ +public class InstalledIUPropertyPage extends PropertyPage { + + private IUProfilePropertiesGroup iuGroup; + + protected Control createContents(Composite parent) { + Object element = getElement(); + if (!(element instanceof InstalledIUElement)) { + Label label = new Label(parent, SWT.DEFAULT); + label.setText(ProvAdminUIMessages.InstalledIUPropertyPage_NoInfoAvailable); + return label; + } + iuGroup = new IUProfilePropertiesGroup(parent, (InstalledIUElement) element, new ModifyListener() { + public void modifyText(ModifyEvent event) { + // not editable + } + }); + Dialog.applyDialogFont(iuGroup.getComposite()); + return iuGroup.getComposite(); + } + + public boolean performOk() { + return true; + } +} diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/UpdateAndInstallDialog.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/UpdateAndInstallDialog.java index d7e8bc2f5..b4c288c6c 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/UpdateAndInstallDialog.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/dialogs/UpdateAndInstallDialog.java @@ -46,7 +46,7 @@ public class UpdateAndInstallDialog extends TrayDialog { } protected void configureShell(Shell shell) { - shell.setText(ProvAdminUIMessages.Ops_InstallIUOperationLabel); + shell.setText(ProvAdminUIMessages.UpdateAndInstallDialog_Title); super.configureShell(shell); } diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/messages.properties b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/messages.properties index cfa8be90e..42eff327a 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/messages.properties +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/messages.properties @@ -12,6 +12,7 @@ ProvisioningPrefPage_Description=Provisioning ProvisioningPrefPage_ConfirmSelectionInstallOps=&Confirm install and uninstall operations ProvisioningPrefPage_ShowGroupsOnly=Show only &group IU's +InstalledIUPropertyPage_NoInfoAvailable=No profile-specific properties are available. ProvisioningPrefPage_HideInternalRepos=Hide internal repositories in repository views AddRepositoryDialog_InvalidURL=Invalid URL AddProfileDialog_Title=Add Profile @@ -35,20 +36,10 @@ ProfilesView_AddProfileLabel=Add a new profile ProvView_RefreshCommandLabel=Refresh ProfilesView_RemoveProfileLabel=Remove ProfilesView_RemoveProfileTooltip=Remove the selected profiles -ProfilesView_ConfirmUninstallMessage=Uninstall selected IU's? AddProfileDialog_DuplicateProfileID=The profile ID is already in use. Ops_RemoveProfileOperationLabel=Remove Profiles -Ops_ConfirmIUInstall=Install selected IUs into {0}? ProfilesView_AlwaysConfirmSelectionInstallOps=Always confirm install and uninstall operations UpdateAndInstallDialog_InstalledIUsPageLabel=Installed IUs UpdateAndInstallDialog_AvailableIUsPageLabel=Available IUs -Ops_InstallIUOperationLabel=Install -InstallIUCommandLabel=&Install... -InstallIUCommandTooltip=Install the selected IUs -BecomeIUCommandLabel=&Become... -Ops_UninstallIUOperationLabel=Uninstall -UninstallIUCommandLabel=&Uninstall... -UninstallIUCommandTooltip=Uninstall the selected IUs -Ops_UpdateIUOperationLabel=Update -UpdateIUCommandLabel=Check for u&pdates... -UpdateIUCommandTooltip=See if updates are available for the selected IUs +UpdateAndInstallDialog_Title=Install/Update +ProfileRootPropertyName=Profile Root diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/PreferenceConstants.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/PreferenceConstants.java index 605b994d1..6d80dacf7 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/PreferenceConstants.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/PreferenceConstants.java @@ -15,7 +15,6 @@ package org.eclipse.equinox.internal.p2.ui.admin.preferences; */ public class PreferenceConstants { - public static final String PREF_CONFIRM_SELECTION_INSTALL = "org.eclipse.equinox.p2.ui.admin.confirmDragInstall"; //$NON-NLS-1$ public static final String PREF_SHOW_GROUPS_ONLY = "org.eclipse.equinox.p2.ui.admin.showGroupsOnly"; //$NON-NLS-1$ public static final String PREF_HIDE_IMPLEMENTATION_REPOS = "org.eclipse.equinox.p2.ui.admin.hideImplementationRepos"; //$NON-NLS-1$ } diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/ProvUIPreferenceInitializer.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/ProvUIPreferenceInitializer.java index 2f2e35a52..52748f29f 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/ProvUIPreferenceInitializer.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/ProvUIPreferenceInitializer.java @@ -28,7 +28,6 @@ public class ProvUIPreferenceInitializer extends AbstractPreferenceInitializer { */ public void initializeDefaultPreferences() { IPreferenceStore store = ProvAdminUIActivator.getDefault().getPreferenceStore(); - store.setDefault(PreferenceConstants.PREF_CONFIRM_SELECTION_INSTALL, true); store.setDefault(PreferenceConstants.PREF_SHOW_GROUPS_ONLY, true); store.setDefault(PreferenceConstants.PREF_HIDE_IMPLEMENTATION_REPOS, true); } diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/ProvisioningPrefPage.java b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/ProvisioningPrefPage.java index a19173222..77ed1660d 100644 --- a/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/ProvisioningPrefPage.java +++ b/bundles/org.eclipse.equinox.p2.ui.admin/src/org/eclipse/equinox/internal/p2/ui/admin/preferences/ProvisioningPrefPage.java @@ -36,7 +36,6 @@ public class ProvisioningPrefPage extends FieldEditorPreferencePage implements I * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors() */ public void createFieldEditors() { - addField(new BooleanFieldEditor(PreferenceConstants.PREF_CONFIRM_SELECTION_INSTALL, ProvAdminUIMessages.ProvisioningPrefPage_ConfirmSelectionInstallOps, getFieldEditorParent())); addField(new BooleanFieldEditor(PreferenceConstants.PREF_SHOW_GROUPS_ONLY, ProvAdminUIMessages.ProvisioningPrefPage_ShowGroupsOnly, getFieldEditorParent())); addField(new BooleanFieldEditor(PreferenceConstants.PREF_HIDE_IMPLEMENTATION_REPOS, ProvAdminUIMessages.ProvisioningPrefPage_HideInternalRepos, getFieldEditorParent())); } diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/UpdateAndInstallDialog.java b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/UpdateAndInstallDialog.java index 79fdfd2e7..18a37db8f 100644 --- a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/UpdateAndInstallDialog.java +++ b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/UpdateAndInstallDialog.java @@ -15,7 +15,7 @@ import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; import org.eclipse.equinox.p2.ui.IRepositoryManipulator; import org.eclipse.equinox.p2.ui.dialogs.UpdateAndInstallGroup; import org.eclipse.equinox.p2.ui.viewers.IUGroupFilter; -import org.eclipse.equinox.p2.ui.viewers.IUPropertyFilter; +import org.eclipse.equinox.p2.ui.viewers.IUProfilePropertyFilter; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.resource.JFaceResources; @@ -55,7 +55,7 @@ public class UpdateAndInstallDialog extends TrayDialog { FontMetrics fontMetrics = gc.getFontMetrics(); gc.dispose(); - ViewerFilter filter = new IUPropertyFilter(IInstallableUnitConstants.ENTRYPOINT_IU_KEY, Boolean.toString(true)); + ViewerFilter filter = new IUProfilePropertyFilter(IInstallableUnitConstants.PROFILE_ROOT_IU, Boolean.toString(true)); UpdateAndInstallGroup group = new UpdateAndInstallGroup(parent, profile, new ViewerFilter[] {filter}, new ViewerFilter[] {new IUGroupFilter()}, ProvSDKMessages.UpdateAndInstallDialog_InstalledFeatures, ProvSDKMessages.UpdateAndInstallDialog_AvailableFeatures, getRepositoryManipulator(), null, TAB_WIDTH_IN_DLUS, TAB_HEIGHT_IN_DLUS, fontMetrics); Dialog.applyDialogFont(group.getControl()); return group.getControl(); diff --git a/bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF index de5fac301..9c65d5451 100644 --- a/bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF @@ -14,6 +14,7 @@ Import-Package: org.eclipse.equinox.configurator, org.eclipse.equinox.p2.core.repository, org.eclipse.equinox.p2.director, org.eclipse.equinox.p2.engine, + org.eclipse.equinox.p2.engine.phases, org.eclipse.equinox.p2.metadata, org.eclipse.equinox.p2.metadata.repository, org.eclipse.equinox.p2.query, diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/InstallDialog.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/InstallDialog.java new file mode 100644 index 000000000..41e108f56 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/InstallDialog.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.internal.p2.ui; + +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.director.ProvisioningPlan; +import org.eclipse.equinox.p2.engine.Profile; +import org.eclipse.equinox.p2.engine.phases.SizingPhase; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.ui.ProvUI; +import org.eclipse.equinox.p2.ui.ProvisioningUtil; +import org.eclipse.equinox.p2.ui.model.AvailableIUElement; +import org.eclipse.equinox.p2.ui.operations.InstallOperation; +import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; +import org.eclipse.equinox.p2.ui.viewers.IUColumnConfig; +import org.eclipse.swt.widgets.Shell; + +public class InstallDialog extends ProfileModificationDialog { + + public InstallDialog(Shell parentShell, IInstallableUnit[] ius, Profile profile) { + super(parentShell, ius, profile, ProvUIMessages.InstallIUOperationLabel, ProvUIMessages.InstallDialog_InstallSelectionMessage); + } + + protected ProfileModificationOperation createProfileModificationOperation(Object[] selectedElements, IProgressMonitor monitor, IAdaptable uiInfo) { + try { + IInstallableUnit[] selectedIUs = elementsToIUs(selectedElements); + ProvisioningPlan plan = ProvisioningUtil.getInstallPlan(selectedIUs, profile, monitor, uiInfo); + IStatus status = plan.getStatus(); + if (status.isOK()) + return new InstallOperation(ProvUIMessages.InstallIUOperationLabel, profile.getProfileId(), plan, selectedIUs); + ProvUI.reportStatus(status); + } catch (ProvisionException e) { + ProvUI.handleException(e, null); + } + return null; + } + + protected String getOkButtonString() { + return ProvUIMessages.InstallIUOperationLabel; + } + + protected IUColumnConfig[] getColumnConfig() { + return new IUColumnConfig[] {new IUColumnConfig(ProvUIMessages.ProvUI_NameColumnTitle, IUColumnConfig.COLUMN_ID), new IUColumnConfig(ProvUIMessages.ProvUI_VersionColumnTitle, IUColumnConfig.COLUMN_VERSION), new IUColumnConfig(ProvUIMessages.ProvUI_SizeColumnTitle, IUColumnConfig.COLUMN_SIZE)}; + } + + protected long getSize(IInstallableUnit iu) { + long size; + try { + ProvisioningPlan plan = ProvisioningUtil.getInstallPlan(new IInstallableUnit[] {iu}, profile, new NullProgressMonitor(), ProvUI.getUIInfoAdapter(getShell())); + SizingPhase info = ProvisioningUtil.getSizeInfo(plan, profile, new NullProgressMonitor(), ProvUI.getUIInfoAdapter(getShell())); + size = info.getDlSize(); + } catch (ProvisionException e) { + size = AvailableIUElement.SIZE_UNKNOWN; + } + return size; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProfileModificationDialog.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProfileModificationDialog.java new file mode 100644 index 000000000..2b9147d77 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProfileModificationDialog.java @@ -0,0 +1,178 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.internal.p2.ui; + +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.p2.engine.Profile; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.ui.ProvUI; +import org.eclipse.equinox.p2.ui.model.AvailableIUElement; +import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; +import org.eclipse.equinox.p2.ui.viewers.IUColumnConfig; +import org.eclipse.equinox.p2.ui.viewers.IUDetailsLabelProvider; +import org.eclipse.jface.dialogs.*; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.*; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.*; + +abstract class ProfileModificationDialog extends TrayDialog { + private static final int DEFAULT_HEIGHT = 250; + private static final int DEFAULT_WIDTH = 600; + private static final int DEFAULT_COLUMN_WIDTH = 200; + private String title; + private String message; + private IInstallableUnit[] ius; + Profile profile; + CheckboxTableViewer listViewer; + StaticContentProvider contentProvider; + private ProfileModificationOperation resultOperation; + + ProfileModificationDialog(Shell parentShell, IInstallableUnit[] ius, Profile profile, String title, String message) { + super(parentShell); + this.title = title; + this.message = message; + this.ius = ius; + this.profile = profile; + } + + protected Control createDialogArea(Composite parent) { + Composite composite = (Composite) super.createDialogArea(parent); + initializeDialogUnits(composite); + + // Create message area; + Label label = new Label(composite, SWT.NONE); + if (message != null) { + label.setText(message); + } + listViewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER | SWT.FULL_SELECTION); + GridData data = new GridData(GridData.FILL_BOTH); + data.heightHint = DEFAULT_HEIGHT; + data.widthHint = DEFAULT_WIDTH; + Table table = listViewer.getTable(); + table.setLayoutData(data); + table.setHeaderVisible(true); + IUColumnConfig[] columns = getColumnConfig(); + for (int i = 0; i < columns.length; i++) { + TableColumn tc = new TableColumn(table, SWT.LEFT, i); + tc.setWidth(DEFAULT_COLUMN_WIDTH); + tc.setResizable(true); + tc.setText(columns[i].columnTitle); + tc.setWidth(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH)); + } + contentProvider = new StaticContentProvider(makeElements(ius)); + listViewer.setContentProvider(contentProvider); + listViewer.setInput(new Object()); + listViewer.setLabelProvider(new IUDetailsLabelProvider(getColumnConfig())); + listViewer.setAllChecked(true); + + addSelectionButtons(composite); + Dialog.applyDialogFont(composite); + return composite; + } + + protected AvailableIUElement[] makeElements(IInstallableUnit[] iusToShow) { + AvailableIUElement[] elements = new AvailableIUElement[iusToShow.length]; + for (int i = 0; i < iusToShow.length; i++) { + elements[i] = new AvailableIUElement(iusToShow[i], getSize(iusToShow[i])); + } + return elements; + } + + /* + * (non-Javadoc) Method declared in Window. + */ + protected void configureShell(Shell shell) { + super.configureShell(shell); + if (title != null) { + shell.setText(title); + } + } + + /* + * (non-Javadoc) Method declared on Dialog. + */ + protected void createButtonsForButtonBar(Composite parent) { + createButton(parent, IDialogConstants.OK_ID, getOkButtonString(), true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + } + + /** + * Add the selection and deselection buttons to the dialog. + * @param composite org.eclipse.swt.widgets.Composite + */ + private void addSelectionButtons(Composite composite) { + Composite buttonComposite = new Composite(composite, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 0; + layout.marginWidth = 0; + layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); + buttonComposite.setLayout(layout); + buttonComposite.setLayoutData(new GridData(SWT.END, SWT.TOP, true, false)); + + Button selectButton = createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, ProvUIMessages.UpdateAndInstallSelectionDialog_SelectAllLabel, false); + + SelectionListener listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + listViewer.setAllChecked(true); + } + }; + selectButton.addSelectionListener(listener); + + Button deselectButton = createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, ProvUIMessages.UpdateAndInstallSelectionDialog_DeselectAllLabel, false); + + listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + listViewer.setAllChecked(false); + } + }; + deselectButton.addSelectionListener(listener); + } + + protected void okPressed() { + resultOperation = null; + // TODO may need progress monitor + IProgressMonitor monitor = new NullProgressMonitor(); + resultOperation = createProfileModificationOperation(getSelectedElements(), monitor, ProvUI.getUIInfoAdapter(getShell())); + super.okPressed(); + } + + public ProfileModificationOperation getOperation() { + return resultOperation; + } + + private Object[] getSelectedElements() { + return listViewer.getCheckedElements(); + } + + protected IInstallableUnit[] elementsToIUs(Object[] elements) { + IInstallableUnit[] theIUs = new IInstallableUnit[elements.length]; + for (int i = 0; i < elements.length; i++) { + theIUs[i] = (IInstallableUnit) ((IAdaptable) elements[i]).getAdapter(IInstallableUnit.class); + } + return theIUs; + } + + protected abstract ProfileModificationOperation createProfileModificationOperation(Object[] selectedElements, IProgressMonitor monitor, IAdaptable uiInfo); + + protected abstract String getOkButtonString(); + + protected IUColumnConfig[] getColumnConfig() { + return ProvUI.getIUColumnConfig(); + } + + protected long getSize(IInstallableUnit iu) { + return AvailableIUElement.SIZE_UNKNOWN; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java index 56d4beb8f..83b88af23 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java @@ -32,27 +32,24 @@ public class ProvUIMessages extends NLS { public static String ColocatedRepositoryManipulatorGroup_LocationColumnHeader; public static String ColocatedRepositoryManipulatorGroup_NameColumnHeader; public static String ColocatedRepositoryManipulatorGroup_Remove; - public static String InstallAction_EntryPointNameRequired; - public static String InstallAction_InstallConfirmTitle; - public static String InstallAction_InstallInfoTitle; - public static String InstallAction_InstallNotPermitted; - public static String InstallAction_NameEntryPointMessage; - public static String InstallOperation_CannotInstall; + public static String InstallDialog_InstallSelectionMessage; public static String IUPropertiesGroup_CopyrightProperty; public static String IUPropertiesGroup_DescriptionProperty; public static String IUPropertiesGroup_LicenseProperty; + public static String IUDetailsLabelProvider_Unknown; public static String IUPropertiesGroup_NameProperty; public static String IUPropertiesGroup_ProviderProperty; public static String ProfileGroup_Cache; public static String ProfileGroup_SelectBundlePoolCache; + public static String ProvisioningUtil_InstallProgressName; // utility error messages public static String ProvisioningUtil_NoRepositoryManager; public static String ProvisioningUtil_AddRepositoryFailure; public static String ProvisioningUtil_RepoNotWritable; public static String ProvisioningUtil_RepositoryNotFound; public static String ProvisioningUtil_NoProfileRegistryFound; - public static String ProvisioningUtil_NoDirectorFound; - public static String ProvisioningUtil_NoOracleFound; + public static String ProvisioningUtil_NoPlannerFound; + public static String ProvisioningUtil_NoEngineFound; public static String ProvisioningUtil_NoIUFound; public static String ProvisioningUtil_NoInstallRegistryFound; public static String ProvisioningUtil_NoProfileInstallRegistryFound; @@ -67,10 +64,19 @@ public class ProvUIMessages extends NLS { public static String ProvisioningOperation_ExecuteErrorTitle; public static String ProvisioningOperation_RedoErrorTitle; public static String ProvisioningOperation_UndoErrorTitle; - public static String Ops_InstallIUOperationLabel; - public static String Ops_UninstallIUOperationLabel; - public static String Ops_UpdateIUOperationLabel; - public static String Ops_BecomeIUOperationLabel; + public static String InstallIUOperationLabel; + public static String InstallIUCommandLabel; + public static String InstallIUCommandTooltip; + public static String UninstallDialog_UninstallMessage; + public static String UninstallIUOperationLabel; + public static String UninstallIUCommandLabel; + public static String UninstallIUCommandTooltip; + public static String UpdateIUOperationLabel; + public static String UpdateIUCommandLabel; + public static String UpdateIUCommandTooltip; + public static String BecomeIUOperationLabel; + public static String BecomeIUCommandLabel; + public static String BecomeIUCommandTooltip; // Property pages public static String ProfilePropertyPage_NoProfileSelected; @@ -115,16 +121,16 @@ public class ProvUIMessages extends NLS { public static String UpdateAction_UpdatesAvailableTitle; public static String PlatformUpdateTitle; public static String PlatformRestartMessage; + public static String ProvUI_NameColumnTitle; + public static String ProvUI_SizeColumnTitle; + public static String ProvUI_VersionColumnTitle; public static String OptionalPlatformRestartMessage; // Operations - public static String UpdateAndInstallGroup_Install; public static String UpdateAndInstallGroup_Properties; + public static String UpdateAndInstallSelectionDialog_DeselectAllLabel; + public static String UpdateAndInstallSelectionDialog_SelectAllLabel; public static String UpdateAndInstallGroup_Refresh; - public static String UpdateAndInstallGroup_Uninstall; - public static String UpdateAndInstallGroup_Update; public static String UpdateOperation_NothingToUpdate; - // TODO - public final static String IUDetailsLabelProvider_Unknown = "FIXME"; } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/UninstallDialog.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/UninstallDialog.java new file mode 100644 index 000000000..c570cb9e8 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/UninstallDialog.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.internal.p2.ui; + +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.director.ProvisioningPlan; +import org.eclipse.equinox.p2.engine.Profile; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.ui.ProvUI; +import org.eclipse.equinox.p2.ui.ProvisioningUtil; +import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; +import org.eclipse.swt.widgets.Shell; + +public class UninstallDialog extends ProfileModificationDialog { + + public UninstallDialog(Shell parentShell, IInstallableUnit[] ius, Profile profile) { + super(parentShell, ius, profile, ProvUIMessages.UninstallIUOperationLabel, ProvUIMessages.UninstallDialog_UninstallMessage); + } + + protected ProfileModificationOperation createProfileModificationOperation(Object[] selectedElements, IProgressMonitor monitor, IAdaptable uiInfo) { + try { + ProvisioningPlan plan = ProvisioningUtil.getUninstallPlan(elementsToIUs(selectedElements), profile, monitor, uiInfo); + IStatus status = plan.getStatus(); + if (status.isOK()) + return new ProfileModificationOperation(ProvUIMessages.UninstallIUOperationLabel, profile.getProfileId(), plan); + ProvUI.reportStatus(status); + } catch (ProvisionException e) { + ProvUI.handleException(e, null); + } + return null; + } + + protected String getOkButtonString() { + return ProvUIMessages.UninstallIUOperationLabel; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/UpdateDialog.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/UpdateDialog.java new file mode 100644 index 000000000..fcadb817b --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/UpdateDialog.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.internal.p2.ui; + +import java.util.*; +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.director.ProvisioningPlan; +import org.eclipse.equinox.p2.engine.Profile; +import org.eclipse.equinox.p2.engine.phases.SizingPhase; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.ui.ProvUI; +import org.eclipse.equinox.p2.ui.ProvisioningUtil; +import org.eclipse.equinox.p2.ui.model.AvailableIUElement; +import org.eclipse.equinox.p2.ui.model.AvailableUpdateElement; +import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; +import org.eclipse.equinox.p2.ui.viewers.IUColumnConfig; +import org.eclipse.swt.widgets.Shell; + +public class UpdateDialog extends ProfileModificationDialog { + + public UpdateDialog(Shell parentShell, IInstallableUnit[] ius, Profile profile) { + super(parentShell, ius, profile, ProvUIMessages.UpdateAction_UpdatesAvailableTitle, ProvUIMessages.UpdateAction_UpdatesAvailableMessage); + } + + protected ProfileModificationOperation createProfileModificationOperation(Object[] selectedElements, IProgressMonitor monitor, IAdaptable uiInfo) { + try { + ProvisioningPlan plan = ProvisioningUtil.getReplacePlan(getIUsToReplace(selectedElements), elementsToIUs(selectedElements), profile, monitor, uiInfo); + IStatus status = plan.getStatus(); + if (status.isOK()) + return new ProfileModificationOperation(ProvUIMessages.UpdateIUOperationLabel, profile.getProfileId(), plan); + ProvUI.reportStatus(status); + } catch (ProvisionException e) { + ProvUI.handleException(e, null); + } + return null; + } + + protected String getOkButtonString() { + return ProvUIMessages.UpdateIUOperationLabel; + } + + protected IUColumnConfig[] getColumnConfig() { + return new IUColumnConfig[] {new IUColumnConfig(ProvUIMessages.ProvUI_NameColumnTitle, IUColumnConfig.COLUMN_ID), new IUColumnConfig(ProvUIMessages.ProvUI_VersionColumnTitle, IUColumnConfig.COLUMN_VERSION), new IUColumnConfig(ProvUIMessages.ProvUI_SizeColumnTitle, IUColumnConfig.COLUMN_SIZE)}; + } + + protected AvailableIUElement[] makeElements(IInstallableUnit[] ius) { + List elements = new ArrayList(); + for (int i = 0; i < ius.length; i++) { + try { + IInstallableUnit[] replacementIUs = ProvisioningUtil.updatesFor(new IInstallableUnit[] {ius[i]}, profile, null, ProvUI.getUIInfoAdapter(getShell())); + for (int j = 0; j < replacementIUs.length; j++) { + elements.add(new AvailableUpdateElement(replacementIUs[j], getSize(ius[i], replacementIUs[j]), ius[i])); + } + } catch (ProvisionException e) { + break; + } + } + return (AvailableIUElement[]) elements.toArray(new AvailableIUElement[elements.size()]); + } + + private IInstallableUnit[] getIUsToReplace(Object[] replacementElements) { + Set iusToReplace = new HashSet(); + for (int i = 0; i < replacementElements.length; i++) { + if (replacementElements[i] instanceof AvailableUpdateElement) { + iusToReplace.add(((AvailableUpdateElement) replacementElements[i]).getIUToBeUpdated()); + } + } + return (IInstallableUnit[]) iusToReplace.toArray(new IInstallableUnit[iusToReplace.size()]); + } + + protected long getSize(IInstallableUnit iuToRemove, IInstallableUnit iuToAdd) { + long size; + try { + ProvisioningPlan plan = ProvisioningUtil.getReplacePlan(new IInstallableUnit[] {iuToRemove}, new IInstallableUnit[] {iuToAdd}, profile, new NullProgressMonitor(), ProvUI.getUIInfoAdapter(getShell())); + SizingPhase info = ProvisioningUtil.getSizeInfo(plan, profile, new NullProgressMonitor(), ProvUI.getUIInfoAdapter(getShell())); + size = info.getDlSize(); + } catch (ProvisionException e) { + size = AvailableIUElement.SIZE_UNKNOWN; + } + return size; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties index 80932b4a2..d9cf5e1dc 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties @@ -9,13 +9,14 @@ # IBM Corporation - initial API and implementation ############################################################################### +ProvisioningUtil_InstallProgressName=Installing... ProvisioningUtil_NoRepositoryManager=No repository manager was found ProvisioningUtil_AddRepositoryFailure=Unable to add repository {0} ProvisioningUtil_RepositoryNotFound=Could not find repository {0} ProvisioningUtil_RepoNotWritable=Repository is not writable ProvisioningUtil_NoProfileRegistryFound=No profile registry was found -ProvisioningUtil_NoDirectorFound=No director was found -ProvisioningUtil_NoOracleFound=No oracle was found +ProvisioningUtil_NoPlannerFound=No provisioning planner was found +ProvisioningUtil_NoEngineFound=No provisioning engine was found ProvisioningUtil_NoIUFound=Could not find installable unit {0}:{1} ProvisioningUtil_NoInstallRegistryFound=No install registry was found ProvisioningUtil_NoProfileInstallRegistryFound=No profile install registry was found @@ -24,10 +25,19 @@ ProvisioningUtil_RepositoriesSearched=The following repositories were searched: ProvisioningOperation_ExecuteErrorTitle=Error while executing the "{0}" operation ProvisioningOperation_RedoErrorTitle=Error while redoing the "{0}" operation ProvisioningOperation_UndoErrorTitle=Error while undoing the "{0}" operation -Ops_InstallIUOperationLabel=Install -Ops_UninstallIUOperationLabel=Uninstall -Ops_UpdateIUOperationLabel=Update -Ops_BecomeIUOperationLabel=Become +InstallIUOperationLabel=Install +InstallIUCommandLabel=&Install... +InstallIUCommandTooltip=Install the selected items +UninstallDialog_UninstallMessage=The following items will be uninstalled. +UninstallIUOperationLabel=Uninstall +UninstallIUCommandLabel=&Uninstall... +UninstallIUCommandTooltip=Uninstall the selected items +UpdateIUOperationLabel=Update +UpdateIUCommandLabel=&Check for updates... +UpdateIUCommandTooltip=See if updates are available for the selected items +BecomeIUOperationLabel=Rollback +BecomeIUCommandLabel=&Rollback... +BecomeIUCommandTooltip=Roll back to a previously installed configuration ProvDropAdapter_NoIUsToDrop=No IUs were available to be dropped ProvDropAdapter_InvalidDropTarget=Invalid drop target @@ -35,6 +45,7 @@ ProvDropAdapter_UnsupportedDropOperation=Unsupported drop operation ProfilePropertyPage_NoProfileSelected=There was no profile selected IUPropertyPage_NoIUSelected=There was no IU selected +IUDetailsLabelProvider_Unknown=Unknown IUPropertiesGroup_NameProperty=Name IUPropertiesGroup_ProviderProperty=Provider IUPropertiesGroup_LicenseProperty=License @@ -76,21 +87,15 @@ AddRepositoryDialog_DuplicateURL=Duplicate URL UpdateAndInstallGroup_Properties=Properties... +UpdateAndInstallSelectionDialog_DeselectAllLabel=&Deselect All +UpdateAndInstallSelectionDialog_SelectAllLabel=&Select All UpdateAction_UpdateInformationTitle=Update Information -UpdateAction_UpdatesAvailableMessage=Updates are available for the following items. Select the items you wish to update. +UpdateAction_UpdatesAvailableMessage=Select the updates you wish to install. UpdateAction_UpdatesAvailableTitle=Available Updates -UpdateAndInstallGroup_Uninstall=Uninstall... UpdateOperation_NothingToUpdate=There is nothing to update. -UpdateAndInstallGroup_Install=Install... UpdateAndInstallGroup_Refresh=Refresh -UpdateAndInstallGroup_Update=Check for updates... ChooseProfileDialog_DefaultDialogTitle=Select a profile -InstallOperation_CannotInstall=The specified IU's cannot be installed. -InstallAction_InstallInfoTitle=Install Information -InstallAction_InstallNotPermitted=The install is not valid for the current configuration. (And I can't explain further given the current API). -InstallAction_InstallConfirmTitle=Confirm Install -InstallAction_NameEntryPointMessage=Enter a name for the installed software. -InstallAction_EntryPointNameRequired=A name must be supplied. +InstallDialog_InstallSelectionMessage=Select the items you wish to install. AddColocatedRepositoryDialog_InvalidURL=The URL is not valid. ColocatedRepositoryManipulatorGroup_Add=Add... ColocatedRepositoryManipulatorGroup_Remove=Remove @@ -102,6 +107,9 @@ IUPropertiesGroup_CopyrightProperty=Copyright PlatformUpdateTitle = Software Updates PlatformRestartMessage = You will need to restart the system for the changes to take effect. \ Would you like to restart now? +ProvUI_NameColumnTitle=Name +ProvUI_SizeColumnTitle=Download Size +ProvUI_VersionColumnTitle=Version OptionalPlatformRestartMessage = It is recommended you restart the system for the changes to take effect, \ but it may be possible to apply the changes you have made without restarting. \ diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvUI.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvUI.java index b3bcb8c0e..cb576ea16 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvUI.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvUI.java @@ -12,7 +12,8 @@ package org.eclipse.equinox.p2.ui; import org.eclipse.core.runtime.*; -import org.eclipse.equinox.p2.ui.viewers.IUDetailsLabelProvider; +import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; +import org.eclipse.equinox.p2.ui.viewers.IUColumnConfig; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; @@ -26,7 +27,17 @@ import org.eclipse.ui.statushandlers.StatusManager; */ public class ProvUI { - private static int[] iuColumnConfig = new int[] {IUDetailsLabelProvider.COLUMN_ID, IUDetailsLabelProvider.COLUMN_VERSION}; + // Public constants for common command and tooltip names + public static final String INSTALL_COMMAND_LABEL = ProvUIMessages.InstallIUCommandLabel; + public static final String INSTALL_COMMAND_TOOLTIP = ProvUIMessages.InstallIUCommandTooltip; + public static final String UNINSTALL_COMMAND_LABEL = ProvUIMessages.UninstallIUCommandLabel; + public static final String UNINSTALL_COMMAND_TOOLTIP = ProvUIMessages.UninstallIUCommandTooltip; + public static final String UPDATE_COMMAND_LABEL = ProvUIMessages.UpdateIUCommandLabel; + public static final String UPDATE_COMMAND_TOOLTIP = ProvUIMessages.UpdateIUCommandTooltip; + public static final String ROLLBACK_COMMAND_LABEL = ProvUIMessages.BecomeIUCommandLabel; + public static final String ROLLBACK_COMMAND_TOOLTIP = ProvUIMessages.BecomeIUCommandTooltip; + + private static IUColumnConfig[] iuColumnConfig = new IUColumnConfig[] {new IUColumnConfig(ProvUIMessages.ProvUI_NameColumnTitle, IUColumnConfig.COLUMN_ID), new IUColumnConfig(ProvUIMessages.ProvUI_VersionColumnTitle, IUColumnConfig.COLUMN_VERSION)}; /** * Make an <code>IAdaptable</code> that adapts to the specified shell, @@ -86,11 +97,11 @@ public class ProvUI { StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG); } - public static int[] getIUDetailsColumns() { + public static IUColumnConfig[] getIUColumnConfig() { return iuColumnConfig; } - public static void setIUDetailsColumns(int[] columnConfig) { + public static void setIUColumnConfig(IUColumnConfig[] columnConfig) { iuColumnConfig = columnConfig; } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvisioningUtil.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvisioningUtil.java index 7bcab9d89..b5c7f2c20 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvisioningUtil.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/ProvisioningUtil.java @@ -13,7 +13,8 @@ package org.eclipse.equinox.p2.ui; import java.io.IOException; import java.net.URL; -import java.util.*; +import java.util.ArrayList; +import java.util.Iterator; import org.eclipse.core.runtime.*; import org.eclipse.equinox.configurator.Configurator; import org.eclipse.equinox.internal.p2.ui.ApplyProfileChangesDialog; @@ -23,11 +24,12 @@ import org.eclipse.equinox.p2.artifact.repository.IArtifactRepositoryManager; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.core.helpers.ServiceHelper; import org.eclipse.equinox.p2.core.repository.IRepository; -import org.eclipse.equinox.p2.director.IDirector; -import org.eclipse.equinox.p2.director.Oracle; -import org.eclipse.equinox.p2.engine.IProfileRegistry; -import org.eclipse.equinox.p2.engine.Profile; +import org.eclipse.equinox.p2.director.IPlanner; +import org.eclipse.equinox.p2.director.ProvisioningPlan; +import org.eclipse.equinox.p2.engine.*; +import org.eclipse.equinox.p2.engine.phases.SizingPhase; import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; import org.eclipse.equinox.p2.metadata.repository.IMetadataRepository; import org.eclipse.equinox.p2.metadata.repository.IMetadataRepositoryManager; import org.eclipse.equinox.p2.query.CompoundIterator; @@ -43,6 +45,19 @@ import org.eclipse.ui.PlatformUI; * @since 3.4 */ public class ProvisioningUtil { + + private static final class SizingPhaseSet extends PhaseSet { + static SizingPhase sizingPhase; + + SizingPhaseSet() { + super(new Phase[] {sizingPhase = new SizingPhase(100, "Compute sizes")}); //$NON-NLS-1$ + } + + SizingPhase getSizingPhase() { + return sizingPhase; + } + } + public static IMetadataRepository addMetadataRepository(URL location, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(ProvUIActivator.getContext(), IMetadataRepositoryManager.class.getName()); if (manager == null) @@ -220,19 +235,22 @@ public class ProvisioningUtil { } /* - * See if the specified IU's can be installed in the profile + * Get the plan for the specified install operation */ - public static boolean canInstall(IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { + public static ProvisioningPlan getInstallPlan(IInstallableUnit[] toInstall, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { Assert.isNotNull(profile); Assert.isNotNull(toInstall); + return getPlanner().getInstallPlan(toInstall, profile, monitor); + } - // TODO should I be getting an Oracle from a service helper? - // Oracle oracle = (Oracle) ServiceHelper.getService(ProvUIActivator.getContext(), Oracle.class.getName()); - Oracle oracle = new Oracle(); - if (oracle == null) { - throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoOracleFound); - } - return oracle.canInstall(toInstall, profile, monitor).equals(Boolean.TRUE); + /* + * Get the plan for the specified update operation + */ + public static ProvisioningPlan getReplacePlan(IInstallableUnit[] toUninstall, IInstallableUnit[] replacements, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { + Assert.isNotNull(profile); + Assert.isNotNull(toUninstall); + Assert.isNotNull(replacements); + return getPlanner().getReplacePlan(toUninstall, replacements, profile, monitor); } /* @@ -240,91 +258,56 @@ public class ProvisioningUtil { * Useful when checking for updates and letting the user decide * which IU's to update. */ - public static Collection updatesFor(IInstallableUnit toUpdate, IProgressMonitor monitor) throws ProvisionException { + public static IInstallableUnit[] updatesFor(IInstallableUnit toUpdate, IProgressMonitor monitor) throws ProvisionException { Assert.isNotNull(toUpdate); - - // TODO should I be getting an Oracle from a service helper? - // Oracle oracle = (Oracle) ServiceHelper.getService(ProvUIActivator.getContext(), Oracle.class.getName()); - Oracle oracle = new Oracle(); - if (oracle == null) { - throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoOracleFound); - } - return oracle.hasUpdate(toUpdate); + return getPlanner().updatesFor(toUpdate); } /* * See what updates might be available for the specified IU's. - * Useful for bulk update that can be directly passed to the update helper. + * Useful for bulk update that can be directly passed to the engine. */ public static IInstallableUnit[] updatesFor(IInstallableUnit[] toUpdate, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { Assert.isNotNull(profile); Assert.isNotNull(toUpdate); - // TODO should I be getting an Oracle from a service helper? - // Oracle oracle = (Oracle) ServiceHelper.getService(ProvUIActivator.getContext(), Oracle.class.getName()); - Oracle oracle = new Oracle(); - if (oracle == null) { - throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoOracleFound); - } + IPlanner planner = getPlanner(); ArrayList allUpdates = new ArrayList(); for (int i = 0; i < toUpdate.length; i++) { - allUpdates.addAll(oracle.hasUpdate(toUpdate[i])); + IInstallableUnit[] updates = planner.updatesFor(toUpdate[i]); + for (int j = 0; j < updates.length; j++) + allUpdates.add(updates[j]); } return (IInstallableUnit[]) allUpdates.toArray(new IInstallableUnit[allUpdates.size()]); } /* - * Install the specified IU's + * Get a plan for becoming */ - public static IStatus install(IInstallableUnit[] toInstall, String entryPointName, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - Assert.isNotNull(profile); - Assert.isNotNull(toInstall); - - IDirector director = (IDirector) ServiceHelper.getService(ProvUIActivator.getContext(), IDirector.class.getName()); - if (director == null) { - throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoDirectorFound); - } - return director.install(toInstall, profile, entryPointName, monitor); - } - - public static IStatus become(IInstallableUnit toBecome, Profile profile, IProgressMonitor monitor) throws ProvisionException { + public static ProvisioningPlan getBecomePlan(IInstallableUnit toBecome, Profile profile, IProgressMonitor monitor) throws ProvisionException { Assert.isNotNull(profile); Assert.isNotNull(toBecome); - - IDirector director = (IDirector) ServiceHelper.getService(ProvUIActivator.getContext(), IDirector.class.getName()); - if (director == null) { - throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoDirectorFound); - } - return director.become(toBecome, profile, monitor); + return getPlanner().getBecomePlan(toBecome, profile, monitor); } /* - * Uninstall the specified IU's + * Get the plan to uninstall the specified IU's */ - public static IStatus uninstall(IInstallableUnit[] toUninstall, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { + public static ProvisioningPlan getUninstallPlan(IInstallableUnit[] toUninstall, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { Assert.isNotNull(profile); Assert.isNotNull(toUninstall); - - IDirector director = (IDirector) ServiceHelper.getService(ProvUIActivator.getContext(), IDirector.class.getName()); - if (director == null) { - throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoDirectorFound); - } - return director.uninstall(toUninstall, profile, monitor); + return getPlanner().getUninstallPlan(toUninstall, profile, monitor); } /* - * Uninstall the specified IU's + * Get sizing info for the specified IU's */ - public static IStatus update(IInstallableUnit[] toUninstall, IInstallableUnit[] replacements, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - Assert.isNotNull(profile); - Assert.isNotNull(toUninstall); - Assert.isNotNull(replacements); - - IDirector director = (IDirector) ServiceHelper.getService(ProvUIActivator.getContext(), IDirector.class.getName()); - if (director == null) { - throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoDirectorFound); - } - return director.replace(toUninstall, replacements, profile, monitor); + public static SizingPhase getSizeInfo(ProvisioningPlan plan, Profile profile, IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { + SizingPhaseSet set = new SizingPhaseSet(); + IStatus status = getEngine().perform(profile, set, plan.getOperands(), monitor); + if (status.isOK()) + return set.getSizingPhase(); + return null; } // TODO This method is only in the util class so that I can generate an @@ -354,7 +337,37 @@ public class ProvisioningUtil { } } + public static IStatus performInstall(ProvisioningPlan plan, Profile profile, IInstallableUnit[] installRoots, IProgressMonitor monitor) throws ProvisionException { + IStatus engineResult = performProvisioningPlan(plan, profile, monitor); + if (engineResult.isOK()) { + // mark the roots as such + for (int i = 0; i < installRoots.length; i++) + profile.setInstallableUnitProfileProperty(installRoots[i], IInstallableUnitConstants.PROFILE_ROOT_IU, Boolean.toString(true)); + } + return engineResult; + } + + public static IStatus performProvisioningPlan(ProvisioningPlan plan, Profile profile, IProgressMonitor monitor) throws ProvisionException { + return getEngine().perform(profile, new DefaultPhaseSet(), plan.getOperands(), monitor); + } + private static IStatus error(String message) { return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, message); } + + private static Engine getEngine() throws ProvisionException { + Engine engine = (Engine) ServiceHelper.getService(ProvUIActivator.getContext(), Engine.class.getName()); + if (engine == null) { + throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoEngineFound); + } + return engine; + } + + private static IPlanner getPlanner() throws ProvisionException { + IPlanner planner = (IPlanner) ServiceHelper.getService(ProvUIActivator.getContext(), IPlanner.class.getName()); + if (planner == null) { + throw new ProvisionException(ProvUIMessages.ProvisioningUtil_NoPlannerFound); + } + return planner; + } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/BecomeAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/BecomeAction.java index dd15a5070..7f8eb19f6 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/BecomeAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/BecomeAction.java @@ -11,27 +11,55 @@ package org.eclipse.equinox.p2.ui.actions; -import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; +import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.director.ProvisioningPlan; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.ui.IProfileChooser; -import org.eclipse.equinox.p2.ui.operations.*; +import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; +import org.eclipse.equinox.p2.ui.*; +import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Shell; public class BecomeAction extends ProfileModificationAction { - public static final int ENTRYPOINT_FORCE = 1; - public static final int ENTRYPOINT_OPTIONAL = 2; - public static final int ENTRYPOINT_NEVER = 3; - int entryPointStrategy = ENTRYPOINT_NEVER; - public BecomeAction(String text, ISelectionProvider selectionProvider, IOperationConfirmer confirmer, Profile profile, IProfileChooser chooser, Shell shell) { - super(text, selectionProvider, confirmer, profile, chooser, shell); + public BecomeAction(ISelectionProvider selectionProvider, Profile profile, IProfileChooser chooser, Shell shell) { + super(ProvUI.ROLLBACK_COMMAND_LABEL, selectionProvider, profile, chooser, shell); + setToolTipText(ProvUI.ROLLBACK_COMMAND_TOOLTIP); } - protected ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] toBecome, Profile targetProfile, IProgressMonitor monitor) { - return new BecomeOperation(ProvUIMessages.Ops_BecomeIUOperationLabel, targetProfile.getProfileId(), toBecome[0]); + protected ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] toBecome, Profile targetProfile, IProgressMonitor monitor, IAdaptable uiInfo) { + if (toBecome.length == 1) { + try { + ProvisioningPlan plan = ProvisioningUtil.getBecomePlan(toBecome[0], targetProfile, monitor); + IStatus planStatus = plan.getStatus(); + if (planStatus.isOK()) + return new ProfileModificationOperation(ProvUIMessages.BecomeIUOperationLabel, targetProfile.getProfileId(), plan); + ProvUI.reportStatus(planStatus); + } catch (ProvisionException e) { + ProvUI.handleException(e, null); + // fall through and return null + } + } + return null; } + /* + * (non-Javadoc) + * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection) + * + * Overridden to enable only on single selections with a profile IU. + */ + public void selectionChanged(IStructuredSelection selection) { + Object[] selectionArray = selection.toArray(); + if (selectionArray.length == 1 && selectionArray[0] instanceof IInstallableUnit) { + IInstallableUnit iu = (IInstallableUnit) selectionArray[0]; + setEnabled(Boolean.valueOf(iu.getProperty(IInstallableUnitConstants.PROFILE_IU_KEY)).booleanValue()); + } else { + setEnabled(false); + } + } }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/InstallAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/InstallAction.java index 111ba8418..a89096a88 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/InstallAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/InstallAction.java @@ -11,78 +11,62 @@ package org.eclipse.equinox.p2.ui.actions; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.internal.p2.ui.InstallDialog; import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.director.ProvisioningPlan; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.ui.*; -import org.eclipse.equinox.p2.ui.operations.*; -import org.eclipse.jface.dialogs.*; +import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.window.Window; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Shell; public class InstallAction extends ProfileModificationAction { - public static final int ENTRYPOINT_FORCE = 1; - public static final int ENTRYPOINT_OPTIONAL = 2; - public static final int ENTRYPOINT_NEVER = 3; - int entryPointStrategy = ENTRYPOINT_FORCE; - public InstallAction(String text, ISelectionProvider selectionProvider, IOperationConfirmer confirmer, Profile profile, IProfileChooser chooser, Shell shell) { - super(text, selectionProvider, confirmer, profile, chooser, shell); + public InstallAction(ISelectionProvider selectionProvider, Profile profile, IProfileChooser chooser, Shell shell) { + super(ProvUI.INSTALL_COMMAND_LABEL, selectionProvider, profile, chooser, shell); + setToolTipText(ProvUI.INSTALL_COMMAND_TOOLTIP); } - protected ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] ius, Profile targetProfile, IProgressMonitor monitor) { + protected ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] ius, Profile targetProfile, IProgressMonitor monitor, IAdaptable uiInfo) { // First validate whether the install can happen try { - if (ProvisioningUtil.canInstall(ius, targetProfile, monitor, ProvUI.getUIInfoAdapter(getShell()))) { - // Get a name for the entry point - // TODO eventually this should be a specialized dialog for confirming an install, showing size, etc. - String entryPointName = null; - if (entryPointStrategy != ENTRYPOINT_NEVER) { - entryPointName = getDefaultEntryPointName(ius); - InputDialog dialog = new InputDialog(getShell(), ProvUIMessages.InstallAction_InstallConfirmTitle, ProvUIMessages.InstallAction_NameEntryPointMessage, entryPointName, new IInputValidator() { - public String isValid(String string) { - if (string.length() > 0 || entryPointStrategy == ENTRYPOINT_OPTIONAL) - return null; - return ProvUIMessages.InstallAction_EntryPointNameRequired; - } - }); - if (dialog.open() == Window.CANCEL) - return null; - entryPointName = dialog.getValue(); - if (entryPointName.length() == 0) { - entryPointName = null; - } - } - if (entryPointName == null) { - if (entryPointStrategy == ENTRYPOINT_FORCE) { - // shouldn't happen, but just in case - return null; - } - } - return new InstallOperation(ProvUIMessages.Ops_InstallIUOperationLabel, targetProfile.getProfileId(), ius, entryPointName); + ProvisioningPlan plan = ProvisioningUtil.getInstallPlan(ius, targetProfile, monitor, uiInfo); + IStatus status = plan.getStatus(); + if (status.isOK()) { + InstallDialog dialog = new InstallDialog(getShell(), ius, targetProfile); + dialog.open(); + return dialog.getOperation(); } - MessageDialog.openInformation(getShell(), ProvUIMessages.InstallAction_InstallInfoTitle, ProvUIMessages.InstallAction_InstallNotPermitted); + ProvUI.reportStatus(status); } catch (ProvisionException e) { + ProvUI.handleException(e, null); // fall through and return null } return null; } - private String getDefaultEntryPointName(IInstallableUnit[] ius) { - StringBuffer result = new StringBuffer(); - for (int i = 0; i < ius.length; i++) { - result.append(ius[i].getId()); - if (i < ius.length - 1) - result.append(", "); //$NON-NLS-1$ + /* + * (non-Javadoc) + * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection) + * + * Overridden to enable only on selections with IU's. Does not validate + * whether the IU is already installed in a particular profile. + */ + public void selectionChanged(IStructuredSelection selection) { + Object[] selectionArray = selection.toArray(); + if (selectionArray.length < 1) { + setEnabled(false); + } else { + for (int i = 0; i < selectionArray.length; i++) { + if (!(selectionArray[i] instanceof IInstallableUnit)) { + setEnabled(false); + return; + } + } + setEnabled(true); } - return result.toString(); - - } - - public void setEntryPointStrategy(int strategy) { - entryPointStrategy = strategy; } }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/ProfileModificationAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/ProfileModificationAction.java index bd8e11cce..accf5964e 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/ProfileModificationAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/ProfileModificationAction.java @@ -21,13 +21,11 @@ import org.eclipse.equinox.p2.engine.IProfileRegistry; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.ui.*; -import org.eclipse.equinox.p2.ui.operations.IOperationConfirmer; import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; import org.eclipse.ui.statushandlers.StatusManager; abstract class ProfileModificationAction extends ProvisioningAction { @@ -35,8 +33,8 @@ abstract class ProfileModificationAction extends ProvisioningAction { Profile profile; IProfileChooser profileChooser; - public ProfileModificationAction(String text, ISelectionProvider selectionProvider, IOperationConfirmer confirmer, Profile profile, IProfileChooser profileChooser, Shell shell) { - super(text, selectionProvider, confirmer, shell); + public ProfileModificationAction(String text, ISelectionProvider selectionProvider, Profile profile, IProfileChooser profileChooser, Shell shell) { + super(text, selectionProvider, shell); this.profile = profile; this.profileChooser = profileChooser; } @@ -70,7 +68,7 @@ abstract class ProfileModificationAction extends ProvisioningAction { final Profile prof = targetProfile; IRunnableWithProgress runnable = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { - ops[0] = validateAndGetOperation(ius, prof, monitor); + ops[0] = validateAndGetOperation(ius, prof, monitor, ProvUI.getUIInfoAdapter(getShell())); } }; try { @@ -84,16 +82,12 @@ abstract class ProfileModificationAction extends ProvisioningAction { if (ops[0] == null) return; - if (operationConfirmer != null && !operationConfirmer.continuePerformingOperation(ops[0], getShell())) { - return; - } - final IStatus[] status = new IStatus[1]; final IAdaptable adapter = ProvUI.getUIInfoAdapter(getShell()); runnable = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { try { - status[0] = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory().execute(ops[0], monitor, adapter); + status[0] = ops[0].execute(monitor, adapter); if (!status[0].isOK()) { StatusManager.getManager().handle(status[0], StatusManager.SHOW | StatusManager.LOG); } @@ -128,5 +122,5 @@ abstract class ProfileModificationAction extends ProvisioningAction { * If so, return an operation representing it. If not, return null. * We assume the user has been notified if something couldn't happen. */ - protected abstract ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] ius, Profile targetProfile, IProgressMonitor monitor); + protected abstract ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] ius, Profile targetProfile, IProgressMonitor monitor, IAdaptable uiInfo); }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/ProvisioningAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/ProvisioningAction.java index 0933c3ff8..caf89b5ad 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/ProvisioningAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/ProvisioningAction.java @@ -11,24 +11,28 @@ package org.eclipse.equinox.p2.ui.actions; -import org.eclipse.equinox.p2.ui.operations.IOperationConfirmer; -import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.*; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.SelectionProviderAction; public abstract class ProvisioningAction extends SelectionProviderAction { - protected IOperationConfirmer operationConfirmer; private Shell shell; - protected ProvisioningAction(String text, ISelectionProvider selectionProvider, IOperationConfirmer confirmer, Shell shell) { + protected ProvisioningAction(String text, ISelectionProvider selectionProvider, Shell shell) { super(selectionProvider, text); - this.operationConfirmer = confirmer; this.shell = shell; if (this.shell == null) { shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); } + // prime the selection validation + ISelection selection = selectionProvider.getSelection(); + if (selection instanceof IStructuredSelection) { + selectionChanged((IStructuredSelection) selection); + } else { + selectionChanged(selection); + } } protected Shell getShell() { diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/UninstallAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/UninstallAction.java index 751ffeece..1ce550362 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/UninstallAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/UninstallAction.java @@ -11,22 +11,71 @@ package org.eclipse.equinox.p2.ui.actions; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.internal.p2.ui.UninstallDialog; +import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.director.ProvisioningPlan; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.ui.IProfileChooser; -import org.eclipse.equinox.p2.ui.operations.*; +import org.eclipse.equinox.p2.ui.*; +import org.eclipse.equinox.p2.ui.model.InstalledIUElement; +import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Shell; public class UninstallAction extends ProfileModificationAction { - public UninstallAction(String text, ISelectionProvider selectionProvider, IOperationConfirmer confirmer, Profile profile, IProfileChooser chooser, Shell shell) { - super(text, selectionProvider, confirmer, profile, chooser, shell); + public UninstallAction(ISelectionProvider selectionProvider, Profile profile, IProfileChooser chooser, Shell shell) { + super(ProvUI.UNINSTALL_COMMAND_LABEL, selectionProvider, profile, chooser, shell); + setToolTipText(ProvUI.UNINSTALL_COMMAND_TOOLTIP); } - protected ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] ius, Profile targetProfile, IProgressMonitor monitor) { - return new UninstallOperation(ProvUIMessages.Ops_UninstallIUOperationLabel, targetProfile.getProfileId(), ius); + protected ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] ius, Profile targetProfile, IProgressMonitor monitor, IAdaptable uiInfo) { + // First validate whether the uninstall can happen + try { + ProvisioningPlan plan = ProvisioningUtil.getUninstallPlan(ius, targetProfile, monitor, uiInfo); + IStatus status = plan.getStatus(); + if (status.isOK()) { + UninstallDialog dialog = new UninstallDialog(getShell(), ius, targetProfile); + dialog.open(); + return dialog.getOperation(); + } + ProvUI.reportStatus(status); + } catch (ProvisionException e) { + ProvUI.handleException(e, null); + // fall through and return null + } + return null; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection) + * + * Overridden to enable only on selections of installed IU's with the same parent + */ + public void selectionChanged(IStructuredSelection selection) { + Object[] selectionArray = selection.toArray(); + Object parent = null; + if (selectionArray.length > 0) { + setEnabled(true); + for (int i = 0; i < selectionArray.length; i++) { + if (selectionArray[i] instanceof InstalledIUElement) { + InstalledIUElement element = (InstalledIUElement) selectionArray[i]; + if (parent == null) { + parent = element.getParent(null); + } else if (parent != element.getParent(null)) { + setEnabled(false); + break; + } + } else { + setEnabled(false); + break; + } + } + } else { + setEnabled(false); + } } }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/UpdateAction.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/UpdateAction.java index fcbc2a6db..e676aeb52 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/UpdateAction.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/actions/UpdateAction.java @@ -11,102 +11,78 @@ package org.eclipse.equinox.p2.ui.actions; -import java.util.*; +import java.util.ArrayList; +import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; +import org.eclipse.equinox.internal.p2.ui.UpdateDialog; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.ui.*; -import org.eclipse.equinox.p2.ui.operations.*; -import org.eclipse.equinox.p2.ui.viewers.IUDetailsLabelProvider; +import org.eclipse.equinox.p2.ui.model.InstalledIUElement; +import org.eclipse.equinox.p2.ui.operations.ProfileModificationOperation; import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.*; -import org.eclipse.ui.dialogs.ListSelectionDialog; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.widgets.Shell; public class UpdateAction extends ProfileModificationAction { - private final class UpdateListSelectionDialog extends ListSelectionDialog { - UpdateListSelectionDialog(Shell parentShell, Object input, IStructuredContentProvider contentProvider, ILabelProvider labelProvider, String message) { - super(parentShell, input, contentProvider, labelProvider, message); - } - - protected Control createDialogArea(Composite parent) { - Control control = super.createDialogArea(parent); - Table table = getViewer().getTable(); - table.setHeaderVisible(true); - TableColumn tc = new TableColumn(table, SWT.LEFT, 0); - tc.setResizable(true); - tc.setWidth(200); - tc = new TableColumn(table, SWT.LEFT, 1); - tc.setWidth(200); - tc.setResizable(true); - getViewer().setInput(new Object()); - return control; - } + public UpdateAction(ISelectionProvider selectionProvider, Profile profile, IProfileChooser chooser, Shell shell) { + super(ProvUI.UPDATE_COMMAND_LABEL, selectionProvider, profile, chooser, shell); + setToolTipText(ProvUI.UPDATE_COMMAND_TOOLTIP); } - private final class UpdateContentProvider implements IStructuredContentProvider { - private final Object[] elements; - - UpdateContentProvider(Object[] elements) { - this.elements = elements; - } - - public Object[] getElements(Object inputElement) { - return elements; - } - - public void dispose() { - // nothing to dispose - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // input is static - } - } - - public UpdateAction(String text, ISelectionProvider selectionProvider, IOperationConfirmer confirmer, Profile profile, IProfileChooser chooser, Shell shell) { - super(text, selectionProvider, confirmer, profile, chooser, shell); - } - - protected ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] ius, Profile targetProfile, IProgressMonitor monitor) { + protected ProfileModificationOperation validateAndGetOperation(IInstallableUnit[] ius, Profile targetProfile, IProgressMonitor monitor, IAdaptable uiInfo) { // Collect the replacements for each IU individually so that // the user can decide what to update try { - Collection[] replacements = new Collection[ius.length]; ArrayList iusWithUpdates = new ArrayList(); for (int i = 0; i < ius.length; i++) { - replacements[i] = ProvisioningUtil.updatesFor(ius[i], monitor); - if (replacements[i].size() > 0) + IInstallableUnit[] replacements = ProvisioningUtil.updatesFor(ius[i], monitor); + if (replacements.length > 0) iusWithUpdates.add(ius[i]); } if (iusWithUpdates.size() > 0) { - final Object[] elements = iusWithUpdates.toArray(); - ListSelectionDialog dialog = new UpdateListSelectionDialog(getShell(), new Object(), new UpdateContentProvider(elements), new IUDetailsLabelProvider(), ProvUIMessages.UpdateAction_UpdatesAvailableMessage); - dialog.setInitialSelections(elements); - dialog.setTitle(ProvUIMessages.UpdateAction_UpdatesAvailableTitle); - int ret = dialog.open(); - IInstallableUnit[] iusToUpdate = new IInstallableUnit[0]; - if (ret != Window.CANCEL) { - Object[] result = dialog.getResult(); - if (result != null && result.length > 0) { - iusToUpdate = (IInstallableUnit[]) Arrays.asList(dialog.getResult()).toArray(new IInstallableUnit[result.length]); - IInstallableUnit[] replacementIUs = ProvisioningUtil.updatesFor(iusToUpdate, targetProfile, monitor, ProvUI.getUIInfoAdapter(getShell())); - if (replacementIUs.length > 0) { - return new UpdateOperation(ProvUIMessages.Ops_UpdateIUOperationLabel, targetProfile.getProfileId(), iusToUpdate, replacementIUs); - } - } - } - } else { - MessageDialog.openInformation(getShell(), ProvUIMessages.UpdateAction_UpdateInformationTitle, ProvUIMessages.UpdateOperation_NothingToUpdate); + UpdateDialog dialog = new UpdateDialog(getShell(), (IInstallableUnit[]) iusWithUpdates.toArray(new IInstallableUnit[iusWithUpdates.size()]), targetProfile); + dialog.open(); + return dialog.getOperation(); } + MessageDialog.openInformation(getShell(), ProvUIMessages.UpdateAction_UpdateInformationTitle, ProvUIMessages.UpdateOperation_NothingToUpdate); } catch (ProvisionException e) { // fall through and return null } return null; } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection) + * + * Overridden to enable only on selections of installed IU's with the same parent + */ + public void selectionChanged(IStructuredSelection selection) { + Object[] selectionArray = selection.toArray(); + Object parent = null; + if (selectionArray.length > 0) { + setEnabled(true); + for (int i = 0; i < selectionArray.length; i++) { + if (selectionArray[i] instanceof InstalledIUElement) { + InstalledIUElement element = (InstalledIUElement) selectionArray[i]; + if (parent == null) { + parent = element.getParent(null); + } else if (parent != element.getParent(null)) { + setEnabled(false); + break; + } + } else { + setEnabled(false); + break; + } + } + } else { + setEnabled(false); + } + } }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUGroup.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUGroup.java index d82e12f67..fc0be5780 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUGroup.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUGroup.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.equinox.p2.ui.dialogs; +import org.eclipse.core.runtime.IAdaptable; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Composite; @@ -22,11 +23,11 @@ import org.eclipse.swt.widgets.Composite; */ public abstract class IUGroup { - protected IInstallableUnit iu; + protected Object iuElement; private Composite composite; - IUGroup(final Composite parent, IInstallableUnit iu, ModifyListener listener) { - this.iu = iu; + protected IUGroup(final Composite parent, Object iu, ModifyListener listener) { + this.iuElement = iu; composite = createGroupComposite(parent, listener); } @@ -37,7 +38,11 @@ public abstract class IUGroup { } public IInstallableUnit getIU() { - return iu; + if (iuElement instanceof IInstallableUnit) + return (IInstallableUnit) iuElement; + if (iuElement instanceof IAdaptable) + return ((IInstallableUnit) ((IAdaptable) iuElement).getAdapter(IInstallableUnit.class)); + return null; } public void updateIU() { diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUImplementationGroup.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUImplementationGroup.java index 57aaa1351..4c1cc990f 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUImplementationGroup.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUImplementationGroup.java @@ -72,8 +72,7 @@ public class IUImplementationGroup extends IUGroup { gdList.horizontalSpan = 2; gdList.heightHint = Dialog.convertHeightInCharsToPixels(fontMetrics, 5); - // TODO will existing IUs be editable? - boolean editable = iu == null && listener != null; + boolean editable = iuElement == null && listener != null; Label label = new Label(composite, SWT.NONE); label.setText(ProvUIMessages.IUGroup_ID); @@ -134,6 +133,7 @@ public class IUImplementationGroup extends IUGroup { } private void initializeFields() { + IInstallableUnit iu = getIU(); if (iu == null) { return; } @@ -170,12 +170,12 @@ public class IUImplementationGroup extends IUGroup { } public void updateIU() { - if (iu == null) { - iu = new InstallableUnit(); + if (iuElement == null) { + iuElement = new InstallableUnit(); } // If it's not an InstallableUnit it is not editable - if (iu instanceof InstallableUnit) { - InstallableUnit unit = (InstallableUnit) iu; + if (iuElement instanceof InstallableUnit) { + InstallableUnit unit = (InstallableUnit) iuElement; unit.setId(id.getText().trim()); unit.setVersion(new Version(version.getText().trim())); unit.setProperty(IInstallableUnit.IU_NAMESPACE, namespace.getText().trim()); diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUPropertiesGroup.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUPropertiesGroup.java index 8b1f365bb..73d7bec98 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUPropertiesGroup.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/IUPropertiesGroup.java @@ -59,14 +59,14 @@ public class IUPropertiesGroup extends IUGroup { } private void initializeFields() { - if (iu == null) { + if (iuElement == null) { return; } String[] propNames = new String[] {IInstallableUnitConstants.NAME, IInstallableUnitConstants.DESCRIPTION, IInstallableUnitConstants.PROVIDER, IInstallableUnitConstants.COPYRIGHT, IInstallableUnitConstants.LICENSE}; String[] userPropNames = new String[] {ProvUIMessages.IUPropertiesGroup_NameProperty, ProvUIMessages.IUPropertiesGroup_DescriptionProperty, ProvUIMessages.IUPropertiesGroup_ProviderProperty, ProvUIMessages.IUPropertiesGroup_CopyrightProperty, ProvUIMessages.IUPropertiesGroup_LicenseProperty}; for (int i = 0; i < propNames.length; i++) { TableItem item = new TableItem(propertiesTable, SWT.NULL); - String value = iu.getProperty(propNames[i]); + String value = getIU().getProperty(propNames[i]); if (value != null) item.setText(new String[] {userPropNames[i], value}); } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/UpdateAndInstallGroup.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/UpdateAndInstallGroup.java index 94808b8eb..db9eefcff 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/UpdateAndInstallGroup.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/dialogs/UpdateAndInstallGroup.java @@ -16,8 +16,7 @@ import org.eclipse.equinox.p2.engine.Profile; import org.eclipse.equinox.p2.ui.*; import org.eclipse.equinox.p2.ui.actions.*; import org.eclipse.equinox.p2.ui.model.*; -import org.eclipse.equinox.p2.ui.viewers.IUDetailsLabelProvider; -import org.eclipse.equinox.p2.ui.viewers.StructuredViewerProvisioningListener; +import org.eclipse.equinox.p2.ui.viewers.*; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.Dialog; @@ -120,6 +119,8 @@ public class UpdateAndInstallGroup { data = new GridData(GridData.FILL_VERTICAL); buttonBar.setLayoutData(data); + // Must be done after buttons are created so that the buttons can + // register and receive their selection notifications before us. availableIUViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { validateAvailableIUButtons(event.getSelection()); @@ -155,8 +156,8 @@ public class UpdateAndInstallGroup { // Add the buttons to the button bar. availablePropButton = createVerticalButton(composite, ProvUIMessages.UpdateAndInstallGroup_Properties, false); availablePropButton.setData(BUTTONACTION, new PropertyDialogAction(new SameShellProvider(parent.getShell()), availableIUViewer)); - installButton = createVerticalButton(composite, ProvUIMessages.UpdateAndInstallGroup_Install, false); - installButton.setData(BUTTONACTION, new InstallAction(ProvUIMessages.UpdateAndInstallGroup_Install, availableIUViewer, null, profile, null, parent.getShell())); + installButton = createVerticalButton(composite, ProvUIMessages.InstallIUCommandLabel, false); + installButton.setData(BUTTONACTION, new InstallAction(availableIUViewer, profile, null, parent.getShell())); Button refreshButton = createVerticalButton(composite, ProvUIMessages.UpdateAndInstallGroup_Refresh, false); refreshButton.setData(BUTTONACTION, new Action() { public void runWithEvent(Event event) { @@ -179,8 +180,10 @@ public class UpdateAndInstallGroup { } void validateAvailableIUButtons(ISelection selection) { - availablePropButton.setEnabled(((IStructuredSelection) selection).size() == 1); - installButton.setEnabled(!selection.isEmpty()); + // This relies on the actions themselves receiving the selection changed + // listener before we do, since we use their state to enable the buttons + updateEnablement(availablePropButton); + updateEnablement(installButton); } private Control createInstalledIUsPage(Composite parent, ViewerFilter[] iuFilters) { @@ -199,6 +202,7 @@ public class UpdateAndInstallGroup { installedIUViewer.setContentProvider(new ProfileContentProvider()); installedIUViewer.setInput(profile); installedIUViewer.setLabelProvider(new IUDetailsLabelProvider()); + if (iuFilters != null) { installedIUViewer.setFilters(iuFilters); } @@ -214,6 +218,8 @@ public class UpdateAndInstallGroup { data = new GridData(GridData.FILL_VERTICAL); buttonBar.setLayoutData(data); + // Must be done after buttons are created so that the buttons can + // register and receive their selection notifications before us. installedIUViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { validateInstalledIUButtons(event.getSelection()); @@ -248,10 +254,10 @@ public class UpdateAndInstallGroup { // Add the buttons to the button bar. installedPropButton = createVerticalButton(composite, ProvUIMessages.UpdateAndInstallGroup_Properties, false); installedPropButton.setData(BUTTONACTION, new PropertyDialogAction(new SameShellProvider(parent.getShell()), installedIUViewer)); - uninstallButton = createVerticalButton(composite, ProvUIMessages.UpdateAndInstallGroup_Uninstall, false); - uninstallButton.setData(BUTTONACTION, new UninstallAction(ProvUIMessages.UpdateAndInstallGroup_Uninstall, installedIUViewer, null, profile, null, parent.getShell())); - updateButton = createVerticalButton(composite, ProvUIMessages.UpdateAndInstallGroup_Update, false); - updateButton.setData(BUTTONACTION, new UpdateAction(ProvUIMessages.UpdateAndInstallGroup_Update, installedIUViewer, null, profile, null, parent.getShell())); + uninstallButton = createVerticalButton(composite, ProvUIMessages.UninstallIUCommandLabel, false); + uninstallButton.setData(BUTTONACTION, new UninstallAction(installedIUViewer, profile, null, parent.getShell())); + updateButton = createVerticalButton(composite, ProvUIMessages.UpdateIUCommandLabel, false); + updateButton.setData(BUTTONACTION, new UpdateAction(installedIUViewer, profile, null, parent.getShell())); if (repositoryManipulator != null) { Button repoButton = createVerticalButton(composite, repositoryManipulator.getLabel(), false); repoButton.setData(BUTTONACTION, new Action() { @@ -277,9 +283,20 @@ public class UpdateAndInstallGroup { } void validateInstalledIUButtons(ISelection selection) { - installedPropButton.setEnabled(((IStructuredSelection) selection).size() == 1); - uninstallButton.setEnabled(!selection.isEmpty()); - updateButton.setEnabled(!selection.isEmpty()); + // Note that this relies on the actions getting the selection notification + // before we do, since we rely on the action enablement to update + // the buttons. This should be ok since the buttons + // hook the listener on create. + updateEnablement(installedPropButton); + updateEnablement(uninstallButton); + updateEnablement(updateButton); + } + + private void updateEnablement(Button button) { + IAction action = getButtonAction(button); + if (action != null) { + button.setEnabled(action.isEnabled()); + } } private Button createVerticalButton(Composite parent, String label, boolean defaultButton) { @@ -305,12 +322,18 @@ public class UpdateAndInstallGroup { } void verticalButtonPressed(Event event) { - Object data = event.widget.getData(BUTTONACTION); + IAction action = getButtonAction(event.widget); + if (action != null) { + action.runWithEvent(event); + } + } + + private IAction getButtonAction(Widget widget) { + Object data = widget.getData(BUTTONACTION); if (data == null || !(data instanceof IAction)) { - return; + return null; } - IAction action = (IAction) data; - action.runWithEvent(event); + return (IAction) data; } private GridData setButtonLayoutData(Button button) { @@ -338,15 +361,15 @@ public class UpdateAndInstallGroup { return Dialog.convertVerticalDLUsToPixels(fm, dlus); } - //TODO: callers should be able to configure the table columns as well as the label provider private void setTableColumns(Table table) { + // TODO will we ever let callers set the column config? + IUColumnConfig[] columns = ProvUI.getIUColumnConfig(); table.setHeaderVisible(true); - // don't externalize, these strings will go away soon enough - String[] columnHeaders = {"Name", "Version"}; - for (int i = 0; i < columnHeaders.length; i++) { + + for (int i = 0; i < columns.length; i++) { TableColumn tc = new TableColumn(table, SWT.NONE, i); tc.setResizable(true); - tc.setText(columnHeaders[i]); + tc.setText(columns[i].columnTitle); tc.setWidth(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH)); } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/AvailableIUElement.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/AvailableIUElement.java index de033e18c..6ce5c4f17 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/AvailableIUElement.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/AvailableIUElement.java @@ -25,10 +25,11 @@ import org.eclipse.equinox.p2.ui.ProvUIImages; */ public class AvailableIUElement extends ProvElement { - int size; + public static final long SIZE_UNKNOWN = -1; + long size; IInstallableUnit iu; - public AvailableIUElement(IInstallableUnit iu, int size) { + public AvailableIUElement(IInstallableUnit iu, long size) { this.size = size; this.iu = iu; } @@ -66,7 +67,7 @@ public class AvailableIUElement extends ProvElement { return super.getAdapter(adapter); } - public int getSize() { + public long getSize() { return size; } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/AvailableUpdateElement.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/AvailableUpdateElement.java new file mode 100644 index 000000000..b25154f5c --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/AvailableUpdateElement.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.p2.ui.model; + +import org.eclipse.equinox.p2.metadata.IInstallableUnit; + +/** + * Element wrapper class for IU's that are available for installation. + * Used instead of the plain IU when additional information such as sizing + * info is necessary. + * + * @since 3.4 + */ +public class AvailableUpdateElement extends AvailableIUElement { + + IInstallableUnit iuToBeUpdated; + + public AvailableUpdateElement(IInstallableUnit iu, long size, IInstallableUnit iuToBeUpdated) { + super(iu, size); + this.iuToBeUpdated = iuToBeUpdated; + } + + public IInstallableUnit getIUToBeUpdated() { + return iuToBeUpdated; + } +} diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/InstalledIUElement.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/InstalledIUElement.java index d098bed4a..9bc61eda0 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/InstalledIUElement.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/model/InstalledIUElement.java @@ -70,4 +70,8 @@ public class InstalledIUElement extends ProvElement { public Profile getProfile() { return parent; } + + public IInstallableUnit getIU() { + return iu; + } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/AddProfileOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/AddProfileOperation.java index 8b6e9e379..dbe54bd3c 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/AddProfileOperation.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/AddProfileOperation.java @@ -21,7 +21,6 @@ import org.eclipse.equinox.p2.ui.ProvisioningUtil; * @since 3.4 */ public class AddProfileOperation extends ProfileOperation { - private boolean added = false; public AddProfileOperation(String label, Profile profile) { super(label, new Profile[] {profile}); @@ -29,31 +28,6 @@ public class AddProfileOperation extends ProfileOperation { protected IStatus doExecute(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { ProvisioningUtil.addProfile(getProfiles()[0], monitor, uiInfo); - added = true; return okStatus(); } - - protected IStatus doUndo(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - ProvisioningUtil.removeProfile(profileIds[0], monitor, uiInfo); - added = false; - return okStatus(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canExecute() - */ - public boolean canExecute() { - return super.canExecute() && !added; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canUndo() - */ - public boolean canUndo() { - return super.canUndo() && added; - } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/BecomeOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/BecomeOperation.java deleted file mode 100644 index 0e8776f27..000000000 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/BecomeOperation.java +++ /dev/null @@ -1,71 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.equinox.p2.ui.operations; - -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.p2.core.ProvisionException; -import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.ui.ProvisioningUtil; - -/** - * An operation that installs the specified IU's into the specified profile - * - * @since 3.4 - */ -public class BecomeOperation extends ProfileModificationOperation { - - private boolean installed = false; - - public BecomeOperation(String label, String profileID, IInstallableUnit toBecome) { - super(label, profileID, new IInstallableUnit[] {toBecome}, null); - } - - protected IStatus doExecute(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - IStatus status = ProvisioningUtil.become(ius[0], getProfiles()[0], monitor); - if (status.isOK()) { - installed = true; - } - return status; - } - - // TODO We need to see what this means in the light of engine rollback - protected IStatus doUndo(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - return Status.OK_STATUS; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canExecute() - */ - public boolean canExecute() { - return isValid() && !installed; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canUndo() - */ - public boolean canUndo() { - return isValid() && installed; - } - - /* - * (non-Javadoc) - * Overridden to use the Oracle to compute the validity of an install. - * @see org.eclipse.equinox.p2.ui.operations.ProvisioningOperation#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus computeExecutionStatus(IProgressMonitor monitor) { - //TODO Need to do the proper thing here - return Status.OK_STATUS; - } -} diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/InstallOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/InstallOperation.java index ea8ea67d8..20979ad2f 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/InstallOperation.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/InstallOperation.java @@ -11,10 +11,9 @@ package org.eclipse.equinox.p2.ui.operations; import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.director.ProvisioningPlan; import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.ui.ProvUIActivator; import org.eclipse.equinox.p2.ui.ProvisioningUtil; /** @@ -24,59 +23,14 @@ import org.eclipse.equinox.p2.ui.ProvisioningUtil; */ public class InstallOperation extends ProfileModificationOperation { - private boolean installed = false; + IInstallableUnit[] installRoots; - public InstallOperation(String label, String profileID, IInstallableUnit[] ius, String entryPointName) { - super(label, profileID, ius, entryPointName); + public InstallOperation(String label, String profileID, ProvisioningPlan plan, IInstallableUnit[] ius) { + super(label, profileID, plan); + this.installRoots = ius; } protected IStatus doExecute(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - IStatus status = ProvisioningUtil.install(ius, entryPointName, getProfiles()[0], monitor, uiInfo); - if (status.isOK()) { - installed = true; - } - return status; - } - - // TODO undo is more likely a rollback than an uninstall? Need to clarify - protected IStatus doUndo(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - IStatus status = ProvisioningUtil.uninstall(ius, getProfiles()[0], monitor, uiInfo); - if (status.isOK()) { - installed = false; - } - return status; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canExecute() - */ - public boolean canExecute() { - return isValid() && !installed; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canUndo() - */ - public boolean canUndo() { - return isValid() && installed; - } - - /* - * (non-Javadoc) - * Overridden to use the Oracle to compute the validity of an install. - * @see org.eclipse.equinox.p2.ui.operations.ProvisioningOperation#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus computeExecutionStatus(IProgressMonitor monitor) { - try { - if (ProvisioningUtil.canInstall(ius, getProfile(), monitor, null)) - return okStatus(); - return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.InstallOperation_CannotInstall, null); - } catch (ProvisionException e) { - return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, e.getLocalizedMessage(), e); - } + return ProvisioningUtil.performInstall(plan, getProfile(), installRoots, monitor); } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/ProfileModificationOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/ProfileModificationOperation.java index 53d8a27f8..61a7e63bd 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/ProfileModificationOperation.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/ProfileModificationOperation.java @@ -10,32 +10,28 @@ *******************************************************************************/ package org.eclipse.equinox.p2.ui.operations; +import org.eclipse.core.runtime.*; import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.director.ProvisioningPlan; import org.eclipse.equinox.p2.engine.Profile; -import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.ui.ProvisioningUtil; /** * Abstract class representing provisioning profile operations * * @since 3.4 */ -public abstract class ProfileModificationOperation extends ProfileOperation { +public class ProfileModificationOperation extends ProfileOperation { - IInstallableUnit[] ius; - String entryPointName; + ProvisioningPlan plan; - ProfileModificationOperation(String label, String id, IInstallableUnit[] ius, String entryPointName) { + public ProfileModificationOperation(String label, String id, ProvisioningPlan plan) { super(label, new String[] {id}); - this.entryPointName = entryPointName; - this.ius = ius; - } - - ProfileModificationOperation(String label, String id, IInstallableUnit[] ius) { - this(label, id, ius, null); + this.plan = plan; } boolean isValid() { - return super.isValid() && ius != null && ius.length > 0; + return super.isValid() && plan != null && plan.getStatus().isOK(); } public String getProfileId() { @@ -54,13 +50,7 @@ public abstract class ProfileModificationOperation extends ProfileOperation { } } - /* - * (non-Javadoc) - * @see org.eclipse.equinox.p2.ui.operations.ProvisioningOperation#getAffectedObjects() - */ - public Object[] getAffectedObjects() { - if (ius != null) - return ius; - return super.getAffectedObjects(); + protected IStatus doExecute(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { + return ProvisioningUtil.performProvisioningPlan(plan, getProfile(), monitor); } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/ProvisioningOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/ProvisioningOperation.java index 538d20edc..e59be473e 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/ProvisioningOperation.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/ProvisioningOperation.java @@ -11,12 +11,10 @@ package org.eclipse.equinox.p2.ui.operations; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.commands.operations.*; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.ui.ProvUIActivator; -import org.eclipse.equinox.p2.ui.ProvisioningUndoSupport; import org.eclipse.osgi.util.NLS; /** @@ -25,17 +23,12 @@ import org.eclipse.osgi.util.NLS; * @since 3.4 */ -public abstract class ProvisioningOperation extends AbstractOperation implements IAdvancedUndoableOperation, IAdvancedUndoableOperation2 { +public abstract class ProvisioningOperation { - /* - * Specifies whether any user prompting is appropriate while computing - * status. - */ - protected boolean quietCompute = false; + private String label; public ProvisioningOperation(String label) { - super(label); - addContext(ProvisioningUndoSupport.getProvisioningUndoContext()); + this.label = label; } /** @@ -46,22 +39,7 @@ public abstract class ProvisioningOperation extends AbstractOperation implements try { status = doExecute(monitor, uiInfo); } catch (final ProvisionException e) { - throw new ExecutionException(NLS.bind(ProvUIMessages.ProvisioningOperation_ExecuteErrorTitle, getLabel()), e); - } catch (OperationCanceledException e) { - return Status.CANCEL_STATUS; - } - return status; - } - - /** - * - */ - public IStatus redo(IProgressMonitor monitor, final IAdaptable uiInfo) throws ExecutionException { - IStatus status; - try { - status = doExecute(monitor, uiInfo); - } catch (final ProvisionException e) { - throw new ExecutionException(NLS.bind(ProvUIMessages.ProvisioningOperation_RedoErrorTitle, getLabel()), e); + throw new ExecutionException(NLS.bind(ProvUIMessages.ProvisioningOperation_ExecuteErrorTitle, label, e)); } catch (OperationCanceledException e) { return Status.CANCEL_STATUS; } @@ -69,37 +47,6 @@ public abstract class ProvisioningOperation extends AbstractOperation implements } /** - * - */ - public IStatus undo(IProgressMonitor monitor, final IAdaptable uiInfo) throws ExecutionException { - IStatus status; - try { - status = doUndo(monitor, uiInfo); - } catch (final ProvisionException e) { - throw new ExecutionException(NLS.bind(ProvUIMessages.ProvisioningOperation_UndoErrorTitle, getLabel()), e); - } catch (OperationCanceledException e) { - return Status.CANCEL_STATUS; - } - return status; - } - - /** - * Perform the specific work involved in undoing this operation. - * - * @param monitor - * the progress monitor to use for the operation - * @param uiInfo - * the IAdaptable (or <code>null</code>) provided by the - * caller in order to supply UI information for prompting the - * user if necessary. When this parameter is not - * <code>null</code>, it contains an adapter for the - * org.eclipse.swt.widgets.Shell.class - * @throws ProvisionException - * propagates any ProvisionException thrown - */ - protected abstract IStatus doUndo(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException; - - /** * Perform the specific work involved in executing this operation. * * @param monitor @@ -116,79 +63,16 @@ public abstract class ProvisioningOperation extends AbstractOperation implements */ protected abstract IStatus doExecute(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException; - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canRedo() - */ - public boolean canRedo() { - return canExecute(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#aboutToNotify(org.eclipse.core.commands.operations.OperationHistoryEvent) - */ - public void aboutToNotify(OperationHistoryEvent event) { - // do nothing - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#getAffectedObjects() - */ - public Object[] getAffectedObjects() { - return new Object[0]; - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeRedoableStatus(org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus computeRedoableStatus(IProgressMonitor monitor) throws ExecutionException { - return computeExecutionStatus(monitor); - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus computeUndoableStatus(IProgressMonitor monitor) throws ExecutionException { - return okStatus(); - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus computeExecutionStatus(IProgressMonitor monitor) throws ExecutionException { - return okStatus(); - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#runInBackground() - */ - public boolean runInBackground() { - return true; - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#setQuietCompute(boolean) - */ - public void setQuietCompute(boolean quiet) { - quietCompute = quiet; - } - protected IStatus okStatus() { return Status.OK_STATUS; } protected IStatus failureStatus() { - return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, getLabel()); + return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, label); + } + + public String getLabel() { + return label; } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/RemoveProfilesOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/RemoveProfilesOperation.java index cbe323690..ae0fe9b8f 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/RemoveProfilesOperation.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/RemoveProfilesOperation.java @@ -21,8 +21,6 @@ import org.eclipse.equinox.p2.ui.ProvisioningUtil; * @since 3.4 */ public class RemoveProfilesOperation extends ProfileOperation { - private boolean removed = false; - public RemoveProfilesOperation(String label, Profile[] profiles) { super(label, profiles); } @@ -32,33 +30,6 @@ public class RemoveProfilesOperation extends ProfileOperation { ProvisioningUtil.removeProfile(profileIds[i], monitor, uiInfo); } // assume the best if no exception - removed = true; - return okStatus(); - } - - protected IStatus doUndo(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - for (int i = 0; i < cachedProfiles.length; i++) { - ProvisioningUtil.addProfile(cachedProfiles[i], monitor, uiInfo); - } - removed = false; return okStatus(); } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canExecute() - */ - public boolean canExecute() { - return profileIds != null && !removed; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canUndo() - */ - public boolean canUndo() { - return cachedProfiles != null && removed; - } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/RepositoryOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/RepositoryOperation.java index f0154abea..73da481c1 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/RepositoryOperation.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/RepositoryOperation.java @@ -11,13 +11,20 @@ package org.eclipse.equinox.p2.ui.operations; import java.net.URL; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.operations.*; +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; +import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.ui.ProvUIActivator; +import org.eclipse.osgi.util.NLS; /** * Abstract class representing provisioning repository operations * * @since 3.4 */ -public abstract class RepositoryOperation extends ProvisioningOperation { +public abstract class RepositoryOperation extends AbstractOperation implements IAdvancedUndoableOperation2 { URL[] urls; String[] names; @@ -28,6 +35,84 @@ public abstract class RepositoryOperation extends ProvisioningOperation { this.names = names; } + /** + * Perform the specific work involved in undoing this operation. + * + * @param monitor + * the progress monitor to use for the operation + * @param uiInfo + * the IAdaptable (or <code>null</code>) provided by the + * caller in order to supply UI information for prompting the + * user if necessary. When this parameter is not + * <code>null</code>, it contains an adapter for the + * org.eclipse.swt.widgets.Shell.class + * @throws ProvisionException + * propagates any ProvisionException thrown + */ + protected abstract IStatus doUndo(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException; + + /** + * Perform the specific work involved in executing this operation. + * + * @param monitor + * the progress monitor to use for the operation + * @param uiInfo + * the IAdaptable (or <code>null</code>) provided by the + * caller in order to supply UI information for prompting the + * user if necessary. When this parameter is not + * <code>null</code>, it contains an adapter for the + * org.eclipse.swt.widgets.Shell.class + * @throws ProvisionException + * propagates any ProvisionException thrown + * + */ + protected abstract IStatus doExecute(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException; + + /** + * + */ + public IStatus execute(IProgressMonitor monitor, final IAdaptable uiInfo) throws ExecutionException { + IStatus status; + try { + status = doExecute(monitor, uiInfo); + } catch (final ProvisionException e) { + throw new ExecutionException(NLS.bind(ProvUIMessages.ProvisioningOperation_ExecuteErrorTitle, getLabel()), e); + } catch (OperationCanceledException e) { + return Status.CANCEL_STATUS; + } + return status; + } + + /** + * + */ + public IStatus redo(IProgressMonitor monitor, final IAdaptable uiInfo) throws ExecutionException { + IStatus status; + try { + status = doExecute(monitor, uiInfo); + } catch (final ProvisionException e) { + throw new ExecutionException(NLS.bind(ProvUIMessages.ProvisioningOperation_RedoErrorTitle, getLabel()), e); + } catch (OperationCanceledException e) { + return Status.CANCEL_STATUS; + } + return status; + } + + /** + * + */ + public IStatus undo(IProgressMonitor monitor, final IAdaptable uiInfo) throws ExecutionException { + IStatus status; + try { + status = doUndo(monitor, uiInfo); + } catch (final ProvisionException e) { + throw new ExecutionException(NLS.bind(ProvUIMessages.ProvisioningOperation_UndoErrorTitle, getLabel()), e); + } catch (OperationCanceledException e) { + return Status.CANCEL_STATUS; + } + return status; + } + public boolean canExecute() { return urls != null; } @@ -35,4 +120,69 @@ public abstract class RepositoryOperation extends ProvisioningOperation { public boolean canUndo() { return urls != null; } + + /* + * (non-Javadoc) + * + * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#getAffectedObjects() + */ + public Object[] getAffectedObjects() { + return urls; + } + + /* + * (non-Javadoc) + * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeRedoableStatus(org.eclipse.core.runtime.IProgressMonitor) + */ + public IStatus computeRedoableStatus(IProgressMonitor monitor) throws ExecutionException { + return computeExecutionStatus(monitor); + } + + /* + * (non-Javadoc) + * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor) + */ + public IStatus computeUndoableStatus(IProgressMonitor monitor) throws ExecutionException { + return okStatus(); + } + + /* + * (non-Javadoc) + * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor) + */ + public IStatus computeExecutionStatus(IProgressMonitor monitor) throws ExecutionException { + return okStatus(); + } /* + * (non-Javadoc) + * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#runInBackground() + */ + + public boolean runInBackground() { + return true; + } + + /* + * (non-Javadoc) + * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#setQuietCompute(boolean) + */ + public void setQuietCompute(boolean quiet) { + // do nothing for now + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#aboutToNotify(org.eclipse.core.commands.operations.OperationHistoryEvent) + */ + public void aboutToNotify(OperationHistoryEvent event) { + // do nothing + } + + protected IStatus okStatus() { + return Status.OK_STATUS; + } + + protected IStatus failureStatus() { + return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, getLabel()); + } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/UninstallOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/UninstallOperation.java deleted file mode 100644 index 2a18eb1fd..000000000 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/UninstallOperation.java +++ /dev/null @@ -1,76 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.equinox.p2.ui.operations; - -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.p2.core.ProvisionException; -import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.metadata.IInstallableUnitConstants; -import org.eclipse.equinox.p2.ui.ProvisioningUtil; - -/** - * An operation that uninstalls the specified IU's from the specified profile - * - * @since 3.4 - */ -public class UninstallOperation extends ProfileModificationOperation { - - private boolean installed = true; - - public UninstallOperation(String label, String profileID, IInstallableUnit[] ius) { - super(label, profileID, ius); - } - - protected IStatus doExecute(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - for (int i = 0; i < ius.length; i++) { - if (entryPointName == null) { - String prop = ius[i].getProperty(IInstallableUnitConstants.ENTRYPOINT_IU_KEY); - if (prop != null && Boolean.valueOf(prop).booleanValue()) { - entryPointName = ius[i].getProperty(IInstallableUnitConstants.NAME); - } - } else { - break; - } - } - IStatus status = ProvisioningUtil.uninstall(ius, getProfiles()[0], monitor, uiInfo); - if (status.isOK()) { - installed = false; - } - return status; - } - - protected IStatus doUndo(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - IStatus status = ProvisioningUtil.install(ius, entryPointName, getProfiles()[0], monitor, uiInfo); - if (status.isOK()) { - installed = true; - } - return status; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canExecute() - */ - public boolean canExecute() { - // TODO should make sure it's actually installed in the profile - return isValid() && installed; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canUndo() - */ - public boolean canUndo() { - return isValid() && !installed; - } -} diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/UpdateOperation.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/UpdateOperation.java deleted file mode 100644 index 265f4faa5..000000000 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/UpdateOperation.java +++ /dev/null @@ -1,80 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.equinox.p2.ui.operations; - -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; -import org.eclipse.equinox.p2.core.ProvisionException; -import org.eclipse.equinox.p2.metadata.IInstallableUnit; -import org.eclipse.equinox.p2.ui.ProvUIActivator; -import org.eclipse.equinox.p2.ui.ProvisioningUtil; - -/** - * An operation that installs the specified IU's into the specified profile - * - * @since 3.4 - */ -public class UpdateOperation extends ProfileModificationOperation { - - private IInstallableUnit[] replacementIUs; - - public UpdateOperation(String label, String profileID, IInstallableUnit[] toUpdate, IInstallableUnit[] replacements) { - super(label, profileID, toUpdate); - replacementIUs = replacements; - } - - protected IStatus doExecute(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - return ProvisioningUtil.update(ius, replacementIUs, getProfiles()[0], monitor, uiInfo); - } - - protected IStatus doUndo(IProgressMonitor monitor, IAdaptable uiInfo) throws ProvisionException { - // won't get called because canUndo() is currently false; - return Status.OK_STATUS; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canExecute() - */ - public boolean canExecute() { - return isValid(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.commands.operations.AbstractOperation#canUndo() - */ - // TODO this should be implemented as a rollback - public boolean canUndo() { - return false; - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus computeExecutionStatus(IProgressMonitor monitor) throws ExecutionException { - if (replacementIUs == null) { - try { - replacementIUs = ProvisioningUtil.updatesFor(ius, getProfile(), monitor, null); - } catch (ProvisionException e) { - return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, e.getLocalizedMessage(), e); - } - } - if (replacementIUs.length > 0) { - return okStatus(); - } - return new Status(IStatus.INFO, ProvUIActivator.PLUGIN_ID, ProvUIMessages.UpdateOperation_NothingToUpdate); - } -} diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/IOperationConfirmer.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUColumnConfig.java index 3e0e4d21b..bf4d8cd4d 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/operations/IOperationConfirmer.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUColumnConfig.java @@ -8,25 +8,25 @@ * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ -package org.eclipse.equinox.p2.ui.operations; -import org.eclipse.swt.widgets.Shell; +package org.eclipse.equinox.p2.ui.viewers; /** - * Interface for confirming provisioning operations + * Data structure describing a column to be shown in an IU view. * * @since 3.4 */ +public class IUColumnConfig { + public final static int COLUMN_ID = 0; + public final static int COLUMN_NAME = 1; + public final static int COLUMN_VERSION = 2; + public final static int COLUMN_SIZE = 3; -public interface IOperationConfirmer { - /** - * Return a boolean indicating whether the operation should continue. - * - * @param op - * the operation to be performed. - * @param shell - * the shell that should be used for prompting - * @return a boolean indicating whether the operation should be performed. - */ - public boolean continuePerformingOperation(ProvisioningOperation op, Shell shell); -} + public String columnTitle; + public int columnField; + + public IUColumnConfig(String title, int columnField) { + this.columnTitle = title; + this.columnField = columnField; + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUDetailsLabelProvider.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUDetailsLabelProvider.java index 41dc031e5..b13e0c311 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUDetailsLabelProvider.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUDetailsLabelProvider.java @@ -30,37 +30,32 @@ import org.eclipse.swt.graphics.Image; * @since 3.4 */ public class IUDetailsLabelProvider extends LabelProvider implements ITableLabelProvider { - public final static int COLUMN_ID = 0; - public final static int COLUMN_NAME = 1; - public final static int COLUMN_VERSION = 2; - public final static int COLUMN_SIZE = 3; - final static int PRIMARY_COLUMN = 0; final static String BLANK = ""; //$NON-NLS-1$ - private int[] columnConfig = ProvUI.getIUDetailsColumns(); + private IUColumnConfig[] columnConfig = ProvUI.getIUColumnConfig(); public IUDetailsLabelProvider() { // use default column config } - public IUDetailsLabelProvider(int[] columnConfig) { + public IUDetailsLabelProvider(IUColumnConfig[] columnConfig) { Assert.isLegal(columnConfig.length > 0); this.columnConfig = columnConfig; } public String getText(Object obj) { - return getColumnText(obj, columnConfig[0]); + return getColumnText(obj, columnConfig[0].columnField); } public Image getImage(Object obj) { - return getColumnImage(obj, columnConfig[0]); + return getColumnImage(obj, columnConfig[0].columnField); } public String getColumnText(Object element, int columnIndex) { - int columnContent = COLUMN_ID; - if (columnIndex <= columnConfig.length) { - columnContent = columnConfig[columnIndex]; + int columnContent = IUColumnConfig.COLUMN_ID; + if (columnIndex < columnConfig.length) { + columnContent = columnConfig[columnIndex].columnField; } IInstallableUnit iu = getIU(element); @@ -68,16 +63,16 @@ public class IUDetailsLabelProvider extends LabelProvider implements ITableLabel return BLANK; switch (columnContent) { - case COLUMN_ID : + case IUColumnConfig.COLUMN_ID : return iu.getId(); - case COLUMN_NAME : + case IUColumnConfig.COLUMN_NAME : String name = iu.getProperty(IInstallableUnitConstants.NAME); if (name != null) return name; return BLANK; - case COLUMN_VERSION : + case IUColumnConfig.COLUMN_VERSION : return iu.getVersion().toString(); - case COLUMN_SIZE : + case IUColumnConfig.COLUMN_SIZE : return getIUSize(element); } return BLANK; @@ -99,8 +94,13 @@ public class IUDetailsLabelProvider extends LabelProvider implements ITableLabel } private String getIUSize(Object element) { - if (element instanceof AvailableIUElement) - return Integer.toString(((AvailableIUElement) element).getSize()); + if (element instanceof AvailableIUElement) { + long size = ((AvailableIUElement) element).getSize(); + if (size != AvailableIUElement.SIZE_UNKNOWN) { + // TODO should do something prettier here + return Long.toString(size); + } + } return ProvUIMessages.IUDetailsLabelProvider_Unknown; } }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUProfilePropertyFilter.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUProfilePropertyFilter.java new file mode 100644 index 000000000..d732a4492 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/IUProfilePropertyFilter.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.equinox.p2.ui.viewers; + +import org.eclipse.equinox.p2.engine.Profile; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; + +/** + * Viewer filter which shows only IUs that have a property matching + * the specified value. + * + * @since 3.4 + */ +public class IUProfilePropertyFilter extends IUPropertyFilter { + + public IUProfilePropertyFilter(String name, String value) { + super(name, value); + } + + protected String getProperty(IInstallableUnit iu, Object parentElement, String key) { + if (parentElement instanceof Profile) + return ((Profile) parentElement).getInstallableUnitProfileProperty(iu, key); + return super.getProperty(iu, parentElement, key); + } +} diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/InstallIUDropAdapter.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/InstallIUDropAdapter.java index 83955b235..8a6cd7a78 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/InstallIUDropAdapter.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/InstallIUDropAdapter.java @@ -18,7 +18,6 @@ import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.ui.ProvUIActivator; import org.eclipse.equinox.p2.ui.actions.InstallAction; import org.eclipse.equinox.p2.ui.model.InstalledIUElement; -import org.eclipse.equinox.p2.ui.operations.IOperationConfirmer; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.*; import org.eclipse.swt.dnd.*; @@ -34,8 +33,6 @@ import org.eclipse.swt.widgets.Shell; public class InstallIUDropAdapter extends ViewerDropAdapter { static boolean DEBUG = false; - private IOperationConfirmer confirmer; - private int entryPointStrategy = InstallAction.ENTRYPOINT_FORCE; /** * Constructs a new drop adapter. @@ -46,9 +43,8 @@ public class InstallIUDropAdapter extends ViewerDropAdapter { * a confirmer that should be used to confirm the operation, or * <code>null</code> if no confirmation is necessary. */ - public InstallIUDropAdapter(StructuredViewer viewer, IOperationConfirmer confirmer) { + public InstallIUDropAdapter(StructuredViewer viewer) { super(viewer); - this.confirmer = confirmer; } /** @@ -147,8 +143,7 @@ public class InstallIUDropAdapter extends ViewerDropAdapter { throw new UnsupportedOperationException("This ISelectionProvider is static, and cannot be modified."); //$NON-NLS-1$ } }; - InstallAction action = new InstallAction(ProvUIMessages.Ops_InstallIUOperationLabel, selectionProvider, confirmer, profile, null, getShell()); - action.setEntryPointStrategy(entryPointStrategy); + InstallAction action = new InstallAction(selectionProvider, profile, null, getShell()); if (DEBUG) System.out.println("Running install action"); //$NON-NLS-1$ action.run(); @@ -235,8 +230,4 @@ public class InstallIUDropAdapter extends ViewerDropAdapter { } return null; } - - public void setEntryPointStrategy(int strategy) { - entryPointStrategy = strategy; - } } diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/StructuredViewerProvisioningListener.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/StructuredViewerProvisioningListener.java index 76fa7ffce..b9f02b168 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/StructuredViewerProvisioningListener.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/p2/ui/viewers/StructuredViewerProvisioningListener.java @@ -51,8 +51,10 @@ public class StructuredViewerProvisioningListener implements SynchronousProvisio final Profile profile = event.getProfile(); display.asyncExec(new Runnable() { public void run() { - viewer.refresh(profile); - + if (viewer.getInput() instanceof Profile) + viewer.refresh(); + else + viewer.refresh(profile); } }); } else if (o instanceof ProfileEvent && ((eventTypes & PROV_EVENT_IU) == PROV_EVENT_IU)) { |