package org.eclipse.epf.library.edit.process.command; import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.emf.common.command.AbstractCommand; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.epf.library.edit.command.IResourceAwareCommand; import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider; import org.eclipse.epf.library.edit.util.ConstraintManager; import org.eclipse.epf.library.edit.util.DescriptorPropUtil; import org.eclipse.epf.library.edit.util.ProcessUtil; import org.eclipse.epf.library.edit.util.TngUtil; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.Constraint; import org.eclipse.epf.uma.Descriptor; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.Process; import org.eclipse.epf.uma.TaskDescriptor; import org.eclipse.epf.uma.UmaFactory; import org.eclipse.epf.uma.UmaPackage; import org.eclipse.epf.uma.util.UmaUtil; public class CustomizeDescriptorCommand extends AbstractCommand implements IResourceAwareCommand { private Process proc; private BreakdownElementWrapperItemProvider wrapper; private Descriptor greenParent; private static boolean debug = false; public CustomizeDescriptorCommand(BreakdownElementWrapperItemProvider wrapper) { this.wrapper = wrapper; proc = (Process) wrapper.getTopItem(); Object obj = TngUtil.unwrap(wrapper); if (obj instanceof Descriptor) { greenParent = (Descriptor) obj; } } public BreakdownElementWrapperItemProvider getWrapper() { return wrapper; } /* * (non-Javadoc) * * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources() */ public Collection getModifiedResources() { if (proc.eResource() != null) { return Collections.singletonList(proc.eResource()); } return Collections.EMPTY_LIST; } /* * (non-Javadoc) * * @see org.eclipse.emf.common.command.AbstractCommand#prepare() */ protected boolean prepare() { return true; } /* * (non-Javadoc) * * @see org.eclipse.emf.common.command.Command#execute() */ public void execute() { if (greenParent == null || ! (greenParent instanceof TaskDescriptor)) { return; } Object parentObj = wrapper.getParent(null); Activity parentAct = parentObj instanceof Activity ? (Activity) parentObj : null; if (parentAct == null) { return; } if (proc != ProcessUtil.getProcess(parentAct)) { return; } Descriptor des = UmaFactory.eINSTANCE.createTaskDescriptor(); updateFromGreenParent(greenParent, des, true); parentAct.getBreakdownElements().add(des); } private static boolean isAttToCopy(EAttribute attribute, boolean newChild) { //For an old child, realization manager's process update takes care of synchronized attributes, //and any other attributes left as un-synchronized if (!newChild) { return false; } if (!attribute.isChangeable()) { return false; } if (attribute.isDerived()) { return false; } if (attribute == UmaPackage.eINSTANCE.getMethodElement_Guid()) { return false; } if (attribute == UmaPackage.eINSTANCE.getNamedElement_Name()) { return false; } return true; } private static boolean isRefToCopy(EReference ref, boolean newChild) { //For now, no need to copy any references for an old child. //This may change if requirement changes in future if (!newChild) { return false; } if (!ref.isChangeable()) { return false; } if (ref.isDerived()) { return false; } if (ref == UmaPackage.eINSTANCE.getDescribableElement_Presentation()) { return false; } if (ref == UmaPackage.eINSTANCE.getBreakdownElement_SuperActivities()) { return false; } if (ref == UmaPackage.eINSTANCE.getBreakdownElement_SuperActivities()) { return false; } if (ref == UmaPackage.eINSTANCE.getBreakdownElement_PlanningData()) { return false; } return true; } private static void copyAttributes(MethodElement source, MethodElement target, boolean newChild) { if (source == null || target == null || source.eClass() != target.eClass()) { return; } if (debug) { System.out.println("\nLD> source: " + source); //$NON-NLS-1$ } Collection<EAttribute> attributes = source.eClass().getEAllAttributes(); for (EAttribute attribute : attributes) { if (isAttToCopy(attribute, newChild)) { if (debug) { System.out.println("LD> attribute: " + attribute.getName() + ", type : " + attribute.getEType()); //$NON-NLS-1$ } Object value = source.eGet(attribute); if (value != null) { target.eSet(attribute, value); } } } } private static void copyReferences(MethodElement source, MethodElement target, boolean newChild) { if (source == null || target == null || source.eClass() != target.eClass()) { return; } Collection<EReference> references = source.eClass().getEAllReferences(); if (debug) { System.out.println("\nLD> source: " + source); //$NON-NLS-1$ } for (EReference reference : references) { if (debug) { if (reference.isContainment()) { System.out.println("LD> reference: " + reference.getName() + ", type : " + reference.getEType()); //$NON-NLS-1$ } if (reference == UmaPackage.eINSTANCE.getBreakdownElement_PlanningData()) { Object value = source.eGet(reference); System.out.println("LD> planningData: " + value); } } if ( ! isRefToCopy(reference, newChild)) { continue; } Object value = source.eGet(reference); if (value == null) { continue; } if (reference.isContainment()) { } else if (reference.isMany()) { List valueList = (List) value; if (! valueList.isEmpty()) { EList copyList = (EList) target.eGet(reference); copyList.clear(); copyList.addAll(valueList); } } else { target.eSet(reference, value); } } } public static void updateFromGreenParent(Descriptor greenParent, Descriptor child, boolean newChild) { //for now do nothing for an old child if (!newChild) { return; } if (newChild) { child.setName(greenParent.getName()); } copyAttributes(greenParent, child, newChild); copyAttributes(greenParent.getPresentation(), child.getPresentation(), newChild); DescriptorPropUtil propUtil = DescriptorPropUtil.getDesciptorPropUtil(); if (debug) { child.setName(greenParent.getName() + "_n-modified"); //$NON-NLS-1$ child.setPresentationName(greenParent.getPresentationName() + "_p-modified");//$NON-NLS-1$ propUtil.setNameRepalce(child, true); propUtil.setPresentationNameRepalce(child, true); } copyReferences(greenParent, child, newChild); copyWpStates(greenParent, child, newChild); copyReferences(greenParent.getPresentation(), child.getPresentation(), newChild); propUtil.setGreenParent(child, greenParent.getGuid()); propUtil.addToCustomizingChildren(greenParent, child); } private static void copyWpStates(MethodElement source, MethodElement target, boolean newChild) { if (! newChild) { return; } if (source == null || target == null || source.eClass() != target.eClass()) { return; } if (source instanceof TaskDescriptor) { TaskDescriptor srcTd = (TaskDescriptor) source; TaskDescriptor tgtTd = (TaskDescriptor) target; for (Constraint c : ConstraintManager.getWpStates(srcTd)) { Constraint copiedState = (Constraint) EcoreUtil.copy(c); copiedState.setGuid(UmaUtil.generateGUID()); tgtTd.getOwnedRules().add(copiedState); } } } /* * (non-Javadoc) * * @see org.eclipse.emf.common.command.Command#redo() */ public void redo() { execute(); } /* * (non-Javadoc) * * @see org.eclipse.emf.common.command.AbstractCommand#undo() */ public void undo() { } /* * (non-Javadoc) * * @see org.eclipse.emf.common.command.AbstractCommand#getResult() */ public Collection getResult() { return super.getResult(); } }