/******************************************************************************* * 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.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.unresolved()); } /* (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.unresolved()); } 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>>(); iu = iu.unresolved(); 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>>(); iu = iu.unresolved(); 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 Collections.<IInstallableUnit> 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 Collections.<IInstallableUnit> 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 Collections.<String, String> 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 Collections.<IInstallableUnit, List<String>> 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 Collections.<IInstallableUnit, Map<String, String>> 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.unresolved(), 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.unresolved(), 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; } }