diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java')
-rw-r--r-- | bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java new file mode 100644 index 000000000..4621b5d74 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/ProfileChangeRequest.java @@ -0,0 +1,279 @@ +/******************************************************************************* + * Copyright (c) 2008, 2010 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 + * Sonatype, Inc. - ongoing development + *******************************************************************************/ +package org.eclipse.equinox.internal.p2.director; + +import java.util.*; +import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils; +import org.eclipse.equinox.p2.core.IProvisioningAgent; +import org.eclipse.equinox.p2.engine.IProfile; +import org.eclipse.equinox.p2.engine.IProfileRegistry; +import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.metadata.IRequirement; +import org.eclipse.equinox.p2.planner.IPlanner; +import org.eclipse.equinox.p2.planner.IProfileChangeRequest; + +/** + * @noreference This class was unintentionally left in the provisional API package and + * is intended to be made internal in Eclipse 3.7. Clients should create and manipulate + * profile change requests via the API {@link IPlanner#createChangeRequest(IProfile)} + * and methods on {@link IProfileChangeRequest}. + */ +public class ProfileChangeRequest implements Cloneable, IProfileChangeRequest { + + private final IProfile profile; + private ArrayList<IInstallableUnit> iusToRemove = null; // list of ius to remove + private ArrayList<IInstallableUnit> iusToAdd = null; // list of ius to add + private ArrayList<String> propertiesToRemove = null; // list of keys for properties to be removed + private HashMap<String, String> propertiesToAdd = null; // map of key->value for properties to be added + private HashMap<IInstallableUnit, Map<String, String>> iuPropertiesToAdd = null; // map iu->map of key->value pairs for properties to be added for an iu + private HashMap<IInstallableUnit, List<String>> iuPropertiesToRemove = null; // map of iu->list of property keys to be removed for an iu + private ArrayList<IRequirement> additionalRequirements; + + public static ProfileChangeRequest createByProfileId(IProvisioningAgent agent, String profileId) { + IProfileRegistry profileRegistry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME); + if (profileRegistry == null) + throw new IllegalStateException(Messages.Planner_no_profile_registry); + IProfile profile = profileRegistry.getProfile(profileId); + if (profile == null) + throw new IllegalArgumentException("Profile id " + profileId + " is not registered."); //$NON-NLS-1$//$NON-NLS-2$ + return new ProfileChangeRequest(profile); + } + + public ProfileChangeRequest(IProfile profile) { + this.profile = profile; + } + + public void setProfile(IProfile profile) { + if (profile == null) + throw new IllegalArgumentException("Profile cannot be null."); //$NON-NLS-1$ + } + + public IProfile getProfile() { + return profile; + } + + public Map<String, String> getProfileProperties() { + Map<String, String> result = new HashMap<String, String>(profile.getProperties()); + if (propertiesToRemove != null) { + for (String key : propertiesToRemove) { + result.remove(key); + } + } + if (propertiesToAdd != null) + result.putAll(propertiesToAdd); + + return result; + } + + //done + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#addInstallableUnit(org.eclipse.equinox.p2.metadata.IInstallableUnit) + */ + public void add(IInstallableUnit toInstall) { + if (iusToAdd == null) + iusToAdd = new ArrayList<IInstallableUnit>(); + iusToAdd.add(toInstall); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#addInstallableUnits(java.util.Collection) + */ + public void addAll(Collection<IInstallableUnit> toInstall) { + for (IInstallableUnit iu : toInstall) + add(iu); + } + + public void addInstallableUnits(IInstallableUnit... toInstall) { + for (int i = 0; i < toInstall.length; i++) + add(toInstall[i]); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#removeInstallableUnit(org.eclipse.equinox.p2.metadata.IInstallableUnit) + */ + public void remove(IInstallableUnit toUninstall) { + if (iusToRemove == null) + iusToRemove = new ArrayList<IInstallableUnit>(); + iusToRemove.add(toUninstall); + } + + public void removeInstallableUnits(IInstallableUnit[] toUninstall) { + for (int i = 0; i < toUninstall.length; i++) + remove(toUninstall[i]); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#removeInstallableUnits(java.util.Collection) + */ + public void removeAll(Collection<IInstallableUnit> toUninstall) { + for (IInstallableUnit iu : toUninstall) + remove(iu); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#setProfileProperty(java.lang.String, java.lang.String) + */ + public void setProfileProperty(String key, String value) { + if (propertiesToAdd == null) + propertiesToAdd = new HashMap<String, String>(); + propertiesToAdd.put(key, value); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#removeProfileProperty(java.lang.String) + */ + public void removeProfileProperty(String key) { + if (propertiesToRemove == null) + propertiesToRemove = new ArrayList<String>(1); + propertiesToRemove.add(key); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#setInstallableUnitProfileProperty(org.eclipse.equinox.p2.metadata.IInstallableUnit, java.lang.String, java.lang.String) + */ + public void setInstallableUnitProfileProperty(IInstallableUnit iu, String key, String value) { + if (iuPropertiesToAdd == null) + iuPropertiesToAdd = new HashMap<IInstallableUnit, Map<String, String>>(); + Map<String, String> properties = iuPropertiesToAdd.get(iu); + if (properties == null) { + properties = new HashMap<String, String>(); + iuPropertiesToAdd.put(iu, properties); + } + properties.put(key, value); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#removeInstallableUnitProfileProperty(org.eclipse.equinox.p2.metadata.IInstallableUnit, java.lang.String) + */ + public void removeInstallableUnitProfileProperty(IInstallableUnit iu, String key) { + if (iuPropertiesToRemove == null) + iuPropertiesToRemove = new HashMap<IInstallableUnit, List<String>>(); + List<String> keys = iuPropertiesToRemove.get(iu); + if (keys == null) { + keys = new ArrayList<String>(); + iuPropertiesToRemove.put(iu, keys); + } + if (!keys.contains(key)) + keys.add(key); + } + + public Collection<IInstallableUnit> getRemovals() { + if (iusToRemove == null) + return CollectionUtils.emptyList(); + return Collections.unmodifiableList(iusToRemove); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#getAddedInstallableUnits() + */ + public Collection<IInstallableUnit> getAdditions() { + if (iusToAdd == null) + return CollectionUtils.emptyList(); + return Collections.unmodifiableList(iusToAdd); + } + + // String [key, key, key] names of properties to remove + public String[] getPropertiesToRemove() { + if (propertiesToRemove == null) + return new String[0]; + return propertiesToRemove.toArray(new String[propertiesToRemove.size()]); + } + + // map of key value pairs + public Map<String, String> getPropertiesToAdd() { + if (propertiesToAdd == null) + return CollectionUtils.emptyMap(); + return propertiesToAdd; + } + + // map of iu->list of property keys to be removed for an iu + public Map<IInstallableUnit, List<String>> getInstallableUnitProfilePropertiesToRemove() { + if (iuPropertiesToRemove == null) + return CollectionUtils.emptyMap(); + return iuPropertiesToRemove; + } + + // TODO This can be represented and returned in whatever way makes most sense for planner/engine + // map iu->map of key->value pairs for properties to be added for an iu + public Map<IInstallableUnit, Map<String, String>> getInstallableUnitProfilePropertiesToAdd() { + if (iuPropertiesToAdd == null) + return CollectionUtils.emptyMap(); + return iuPropertiesToAdd; + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#setInstallableUnitInclusionRules(org.eclipse.equinox.p2.metadata.IInstallableUnit, java.lang.String) + */ + public void setInstallableUnitInclusionRules(IInstallableUnit iu, String value) { + setInstallableUnitProfileProperty(iu, SimplePlanner.INCLUSION_RULES, value); + } + + /* (non-Javadoc) + * @see org.eclipse.equinox.internal.provisional.p2.director.IPCR#removeInstallableUnitInclusionRules(org.eclipse.equinox.p2.metadata.IInstallableUnit) + */ + public void removeInstallableUnitInclusionRules(IInstallableUnit iu) { + removeInstallableUnitProfileProperty(iu, SimplePlanner.INCLUSION_RULES); + } + + @SuppressWarnings("unchecked") + public Object clone() { + ProfileChangeRequest result = new ProfileChangeRequest(profile); + result.iusToRemove = iusToRemove == null ? null : (ArrayList<IInstallableUnit>) iusToRemove.clone(); + result.iusToAdd = iusToAdd == null ? null : (ArrayList<IInstallableUnit>) iusToAdd.clone(); + result.propertiesToRemove = propertiesToRemove == null ? null : (ArrayList<String>) propertiesToRemove.clone(); + result.propertiesToAdd = propertiesToAdd == null ? null : (HashMap<String, String>) propertiesToAdd.clone(); + result.iuPropertiesToAdd = iuPropertiesToAdd == null ? null : (HashMap<IInstallableUnit, Map<String, String>>) iuPropertiesToAdd.clone(); + result.iuPropertiesToRemove = iuPropertiesToRemove == null ? null : (HashMap<IInstallableUnit, List<String>>) iuPropertiesToRemove.clone(); + result.additionalRequirements = additionalRequirements == null ? null : (ArrayList<IRequirement>) additionalRequirements.clone(); + return result; + } + + public String toString() { + StringBuffer result = new StringBuffer(1000); + result.append("==Profile change request for "); //$NON-NLS-1$ + result.append(profile.getProfileId()); + result.append('\n'); + if (iusToAdd != null) { + result.append("==Additions=="); //$NON-NLS-1$ + result.append('\n'); + for (IInstallableUnit iu : iusToAdd) { + result.append('\t'); + result.append(iu); + result.append('\n'); + } + } + if (iusToRemove != null) { + result.append("==Removals=="); //$NON-NLS-1$ + result.append('\n'); + for (IInstallableUnit iu : iusToRemove) { + result.append('\t'); + result.append(iu); + result.append('\n'); + } + } + return result.toString(); + } + + public void addExtraRequirements(Collection<IRequirement> requirements) { + if (additionalRequirements == null) + additionalRequirements = new ArrayList<IRequirement>(requirements.size()); + additionalRequirements.addAll(requirements); + } + + public Collection<IRequirement> getExtraRequirements() { + return additionalRequirements; + } + + public void clearExtraRequirements() { + additionalRequirements = null; + } +} |