package org.obeonetwork.bpmn2.design; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.util.EcoreUtil.Copier; import org.obeonetwork.dsl.bpmn2.Collaboration; import org.obeonetwork.dsl.bpmn2.Definitions; import org.obeonetwork.dsl.bpmn2.InteractionNode; import org.obeonetwork.dsl.bpmn2.MessageFlow; import org.obeonetwork.dsl.bpmn2.Process; import org.obeonetwork.dsl.bpmn2.RootElement; public class ProcessService { public static EObject trace(EObject eObject) { System.out.println("Trace(" + eObject + ")"); return eObject; } public static Definitions getDefinitionsObject(EObject eObject) { EObject cursor = eObject; while (!(cursor instanceof Definitions)) { cursor = cursor.eContainer(); } return (Definitions) cursor; } public static void duplicate(Process process) { // Clone the process @SuppressWarnings("serial") Copier copier = new Copier() { @Override protected void copyAttribute(EAttribute eAttribute, EObject eObject, EObject copyEObject) { if (!eAttribute.isID()) { super.copyAttribute(eAttribute, eObject, copyEObject); } } }; Process clone = (Process) copier.copy(process); clone.setName(clone.getName() + " (copy)"); copier.copyReferences(); // Clone message flows Definitions defs = getDefinitionsObject(process); for (RootElement root : defs.getRootElements()) { if (root instanceof Collaboration) { Collaboration collaboration = (Collaboration) root; Collection<MessageFlow> newMFs = new ArrayList<MessageFlow>(); for (MessageFlow mf : collaboration.getMessageFlows()) { InteractionNode sourceRef = mf.getSourceRef(); InteractionNode targetRef = mf.getTargetRef(); if (copier.containsKey(sourceRef) && copier.containsKey(targetRef)) { MessageFlow messageFlowClone = (MessageFlow) copier.copy(mf); mf.setSourceRef((InteractionNode) copier.get(sourceRef)); mf.setTargetRef((InteractionNode) copier.get(targetRef)); newMFs.add(messageFlowClone); } } collaboration.getMessageFlows().addAll(newMFs); } } // Save process clone EObject container = process.eContainer(); if (container instanceof Definitions) { ((Definitions) container).getRootElements().add(clone); } else { ((Process) container).getDecomposedBy().add(clone); } } public static void paste(EObject container, EObject containerView, EObject copiedView, EObject copiedElement) { // change IDs EcoreUtil.setID(copiedElement, EcoreUtil.generateUUID()); for (Iterator<EObject> iterator = copiedElement.eAllContents(); iterator.hasNext();) { EcoreUtil.setID(iterator.next(), EcoreUtil.generateUUID()); } // change Name EStructuralFeature nameFeature = copiedElement.eClass().getEStructuralFeature("name"); //$NON-NLS-1$ if (nameFeature != null) { Object name = copiedElement.eGet(nameFeature); if (name == null) { name = ""; } copiedElement.eSet(nameFeature, name + " (copy)"); // $NON-NLS-1$ } // add to container for (EReference containment : container.eClass().getEAllContainments()) { if (containment.getEType().equals(copiedElement.eClass()) || copiedElement.eClass().getEAllSuperTypes().contains(containment.getEType())) { if (containment.isMany()) { ((EList<EObject>) container.eGet(containment)).add(copiedElement); } else { container.eSet(containment, copiedElement); } } } } }