blob: e580e015f9439f00fa2b2c411edea6fe5250a58a [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.process.command;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.epf.library.edit.Providers;
import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.uma.Descriptor;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.RoleDescriptor;
import org.eclipse.epf.uma.TaskDescriptor;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.WorkProductDescriptor;
/**
* @author Phong Nguyen Le
* @since 7.0
*/
public class BasicSynchronizeDescriptorCommand extends AbstractCommand
implements IResourceAwareCommand {
public static final Set NONEMPTY_ATTRIBUTES = new HashSet(Arrays.asList(
new EStructuralFeature[] {
UmaPackage.eINSTANCE.getNamedElement_Name(),
UmaPackage.eINSTANCE.getMethodElement_PresentationName()
}
));
protected Descriptor descriptor;
protected Set synchFeatures;
protected MethodConfiguration config;
private HashMap featureMap;
public BasicSynchronizeDescriptorCommand(Descriptor descriptor, Set synchFeatures, MethodConfiguration config) {
this.descriptor = descriptor;
if (synchFeatures == null) {
this.synchFeatures = BSDropCommand.DEFAULT_SYNCH_FEATURES;
}
else {
this.synchFeatures = synchFeatures;
}
this.config = config;
}
public Collection getModifiedResources() {
if(descriptor.eResource() != null) {
return Collections.singletonList(descriptor.eResource());
}
else {
return Collections.EMPTY_LIST;
}
}
/**
* @param feature
* @param value
*/
private void saveOldFeatureValue(EStructuralFeature feature) {
if (featureMap == null) {
featureMap = new HashMap();
}
featureMap.put(feature, descriptor.eGet(feature));
}
public void execute() {
// update the linked element if required
//
MethodElement e = ProcessUtil.getAssociatedElement(descriptor);
Object resolved = Providers.getConfigurationApplicator().resolve(e, config);
if(resolved != e) {
EStructuralFeature feature;
if(descriptor instanceof TaskDescriptor) {
feature = UmaPackage.eINSTANCE.getTaskDescriptor_Task();
}
else if(descriptor instanceof WorkProductDescriptor) {
feature = UmaPackage.eINSTANCE.getWorkProductDescriptor_WorkProduct();
}
else if(descriptor instanceof RoleDescriptor) {
feature = UmaPackage.eINSTANCE.getRoleDescriptor_Role();
}
else {
feature = null;
}
saveOldFeatureValue(feature);
e = (MethodElement) resolved;
descriptor.eSet(feature, e);
}
for (Iterator iter = synchFeatures.iterator(); iter.hasNext();) {
Object f = iter.next();
if(f instanceof EAttribute) {
EAttribute attrib = (EAttribute) f;
EAttribute descAttrib = (EAttribute) BSDropCommand.FEATURE_MAP.get(attrib);
if(descAttrib != null) {
if(NONEMPTY_ATTRIBUTES.contains(attrib)) {
// refresh attribute that can not be empty
//
Object value = e instanceof VariabilityElement ?
(String) Providers.getConfigurationApplicator().getAttribute((VariabilityElement) e, attrib, config)
: e.eGet(attrib);
// if attriubute is presentation name and new value is blank, copy name over
if ((descAttrib.equals(UmaPackage.eINSTANCE.getMethodElement_PresentationName())) && (value == null || value.equals(""))) //$NON-NLS-1$
value = e instanceof VariabilityElement ?
(String) Providers.getConfigurationApplicator().getAttribute((VariabilityElement) e, UmaPackage.eINSTANCE.getNamedElement_Name(), config)
: e.eGet(UmaPackage.eINSTANCE.getNamedElement_Name());
Object descValue = descriptor.eGet(descAttrib);
if((value == null && descValue != null) || (value != null && !value.equals(descValue))) {
saveOldFeatureValue(descAttrib);
descriptor.eSet(descAttrib, value);
}
}
else {
// reset attribute to its default value
//
saveOldFeatureValue(descAttrib);
descriptor.eSet(descAttrib, descAttrib.getDefaultValue());
}
}
}
}
}
public void redo() {
execute();
}
protected boolean prepare() {
return true;
}
public void undo() {
if(featureMap != null) {
for (Iterator iterator = featureMap.entrySet().iterator(); iterator
.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
EStructuralFeature feature = (EStructuralFeature) entry
.getKey();
try {
descriptor.eSet(feature, entry.getValue());
}
catch(RuntimeException e) {
throw e;
}
}
featureMap.clear();
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.AbstractCommand#dispose()
*/
public void dispose() {
if(featureMap != null) {
featureMap.clear();
featureMap = null;
}
super.dispose();
}
}