blob: ba69b2cf3c53750d7c5a92d78239d2873bcfe082 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 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.engine.phases;
import java.util.*;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.equinox.internal.p2.engine.*;
import org.eclipse.equinox.p2.engine.PhaseSetFactory;
import org.eclipse.equinox.p2.engine.spi.ProvisioningAction;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
public class Property extends Phase {
public class ProfilePropertyAction extends ProvisioningAction {
public IStatus execute(Map<String, Object> parameters) {
Profile profile = (Profile) parameters.get(PARM_PROFILE);
PropertyOperand propertyOperand = (PropertyOperand) parameters.get(PARM_OPERAND);
if (propertyOperand.second() == null)
removeProfileProperty(profile, propertyOperand);
else
setProfileProperty(profile, propertyOperand, false);
return null;
}
public IStatus undo(Map<String, Object> parameters) {
Profile profile = (Profile) parameters.get(PARM_PROFILE);
PropertyOperand propertyOperand = (PropertyOperand) parameters.get(PARM_OPERAND);
if (propertyOperand.first() == null)
removeProfileProperty(profile, propertyOperand);
else
setProfileProperty(profile, propertyOperand, true);
return null;
}
private void setProfileProperty(Profile profile, PropertyOperand propertyOperand, boolean undo) {
String value = (String) (undo ? propertyOperand.first() : propertyOperand.second());
if (propertyOperand instanceof InstallableUnitPropertyOperand) {
InstallableUnitPropertyOperand iuPropertyOperand = (InstallableUnitPropertyOperand) propertyOperand;
profile.setInstallableUnitProperty(iuPropertyOperand.getInstallableUnit(), iuPropertyOperand.getKey(), value);
} else {
profile.setProperty(propertyOperand.getKey(), value);
}
}
private void removeProfileProperty(Profile profile, PropertyOperand propertyOperand) {
if (propertyOperand instanceof InstallableUnitPropertyOperand) {
InstallableUnitPropertyOperand iuPropertyOperand = (InstallableUnitPropertyOperand) propertyOperand;
profile.removeInstallableUnitProperty(iuPropertyOperand.getInstallableUnit(), iuPropertyOperand.getKey());
} else {
profile.removeProperty(propertyOperand.getKey());
}
}
}
public class UpdateInstallableUnitProfilePropertiesAction extends ProvisioningAction {
// we do not need to use a memento here since the profile is not persisted unless the operation is successful
Map<String, String> originalSourceProperties;
Map<String, String> originalTargetProperties;
public IStatus execute(Map<String, Object> parameters) {
Profile profile = (Profile) parameters.get(PARM_PROFILE);
InstallableUnitOperand iuOperand = (InstallableUnitOperand) parameters.get(PARM_OPERAND);
IInstallableUnit source = iuOperand.first();
originalSourceProperties = profile.getInstallableUnitProperties(source);
IInstallableUnit target = iuOperand.second();
originalTargetProperties = profile.getInstallableUnitProperties(target);
profile.addInstallableUnitProperties(target, originalSourceProperties);
profile.clearInstallableUnitProperties(source);
return null;
}
public IStatus undo(Map<String, Object> parameters) {
Profile profile = (Profile) parameters.get(PARM_PROFILE);
InstallableUnitOperand iuOperand = (InstallableUnitOperand) parameters.get(PARM_OPERAND);
IInstallableUnit source = iuOperand.first();
profile.clearInstallableUnitProperties(source);
profile.addInstallableUnitProperties(source, originalSourceProperties);
IInstallableUnit target = iuOperand.second();
profile.clearInstallableUnitProperties(target);
profile.addInstallableUnitProperties(target, originalTargetProperties);
return null;
}
}
public class RemoveInstallableUnitProfilePropertiesAction extends ProvisioningAction {
// we do not need to use a memento here since the profile is not persisted unless the operation is successful
Map<String, String> originalSourceProperties;
Map<String, String> originalTargetProperties;
public IStatus execute(Map<String, Object> parameters) {
Profile profile = (Profile) parameters.get(PARM_PROFILE);
InstallableUnitOperand iuOperand = (InstallableUnitOperand) parameters.get(PARM_OPERAND);
IInstallableUnit source = iuOperand.first();
originalSourceProperties = profile.getInstallableUnitProperties(source);
profile.clearInstallableUnitProperties(source);
return null;
}
public IStatus undo(Map<String, Object> parameters) {
Profile profile = (Profile) parameters.get(PARM_PROFILE);
InstallableUnitOperand iuOperand = (InstallableUnitOperand) parameters.get(PARM_OPERAND);
IInstallableUnit source = iuOperand.first();
profile.clearInstallableUnitProperties(source);
profile.addInstallableUnitProperties(source, originalSourceProperties);
return null;
}
}
public Property(int weight) {
super(PhaseSetFactory.PHASE_PROPERTY, weight);
}
protected List<ProvisioningAction> getActions(Operand operand) {
if (operand instanceof PropertyOperand)
return Collections.<ProvisioningAction> singletonList(new ProfilePropertyAction());
if (operand instanceof InstallableUnitOperand) {
InstallableUnitOperand iuOperand = (InstallableUnitOperand) operand;
if (iuOperand.first() != null) {
if (iuOperand.second() != null) {
return Collections.<ProvisioningAction> singletonList(new UpdateInstallableUnitProfilePropertiesAction());
}
return Collections.<ProvisioningAction> singletonList(new RemoveInstallableUnitProfilePropertiesAction());
}
}
return null;
}
}