//------------------------------------------------------------------------------ // 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(); } }