| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2007 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 |
| //------------------------------------------------------------------------------ |
| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2007 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.diagram.core.bridge; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| |
| import org.eclipse.epf.library.edit.command.IActionManager; |
| import org.eclipse.epf.library.edit.util.ProcessUtil; |
| import org.eclipse.epf.uma.Activity; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.epf.uma.ProcessPackage; |
| import org.eclipse.epf.uma.UmaPackage; |
| import org.eclipse.epf.uma.WorkBreakdownElement; |
| import org.eclipse.epf.uma.WorkOrder; |
| import org.eclipse.epf.uma.util.UmaUtil; |
| import org.eclipse.uml2.uml.ActivityEdge; |
| import org.eclipse.uml2.uml.ActivityNode; |
| import org.eclipse.uml2.uml.ControlNode; |
| |
| /** |
| * @author Phong Nguyen Le |
| * |
| * @since 1.2 |
| */ |
| public class ControlNodeAdapter extends NodeAdapter { |
| |
| protected boolean addToUMA(ActivityEdge link) { |
| if (!super.addToUMA(link)) |
| return false; |
| |
| Activity diagramActivity = (Activity) BridgeHelper.getMethodElement(getDiagram()); |
| MethodElement srcElement = BridgeHelper.getMethodElement(link.getSource()); |
| if (srcElement instanceof WorkBreakdownElement) { |
| if (BridgeHelper.isSynchBar(link.getTarget())) { |
| Collection targetActNodes = new ArrayList(); |
| BridgeHelper.getSyncBarTargetNodes(link |
| .getTarget(), targetActNodes); |
| WorkBreakdownElement pred = (WorkBreakdownElement) srcElement; |
| for (Iterator<?> iter = targetActNodes.iterator(); iter.hasNext();) { |
| ActivityNode node = (ActivityNode) iter.next(); |
| WorkBreakdownElement targetElement = (WorkBreakdownElement) BridgeHelper.getMethodElement(node); |
| addWorkOrder(node, targetElement, null, pred, diagramActivity, null); |
| } |
| } |
| } else if (BridgeHelper.isSynchBar(link.getSource())) { |
| // Predecessor should be created only in case of |
| // Syncronization Bar, not for DecisionPoint. |
| Collection srcActNodes = new ArrayList(); |
| BridgeHelper.getSyncBarSourceNodes(link.getSource(), srcActNodes); |
| Collection targetActNodes = new ArrayList(); |
| BridgeHelper.getSyncBarTargetNodes(link.getTarget(), targetActNodes); |
| |
| for (Iterator iter = targetActNodes.iterator(); iter.hasNext();) { |
| ActivityNode node = ((ActivityNode) iter.next()); |
| WorkBreakdownElement succ = (WorkBreakdownElement) BridgeHelper.getMethodElement(node); |
| for (Iterator<?> iterator = srcActNodes.iterator(); iterator |
| .hasNext();) { |
| ActivityNode srcNode = (ActivityNode) iterator.next(); |
| WorkBreakdownElement pred = (WorkBreakdownElement) BridgeHelper |
| .getMethodElement(srcNode); |
| addWorkOrder(node, succ, srcNode, pred, diagramActivity, null); |
| } |
| } |
| } |
| |
| return true; |
| } |
| |
| protected void removeFromUMA(ActivityEdge link, ActivityNode oldSource, ActivityNode oldTarget) { |
| org.eclipse.epf.uma.Activity diagramActivity = (org.eclipse.epf.uma.Activity) BridgeHelper.getMethodElement(getDiagram()); |
| ProcessPackage pkg = (ProcessPackage) diagramActivity.eContainer(); |
| Collection<Object> srcActNodes = new ArrayList<Object>(); |
| BridgeHelper.getSourceNodes(srcActNodes, oldSource, WorkBreakdownElement.class); |
| MethodElement targetElement = BridgeHelper.getMethodElement(oldTarget); |
| if (targetElement instanceof WorkBreakdownElement) { |
| WorkBreakdownElement targetWbe = (WorkBreakdownElement) targetElement; |
| for (Iterator<?> iterator = srcActNodes.iterator(); iterator.hasNext();) { |
| ActivityNode node = (ActivityNode) iterator.next(); |
| if(targetWbe.getSuperActivities() == diagramActivity) { // target element is local |
| if (BridgeHelper.canRemoveAllPreds(link, node, oldTarget)) { |
| MethodElement srcElement = BridgeHelper.getMethodElement(node); |
| WorkOrder wo; |
| while ((wo = UmaUtil.findWorkOrder(targetWbe, srcElement)) != null) { |
| getActionManager().doAction(IActionManager.REMOVE, targetWbe, |
| UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR, wo, -1); |
| } |
| } |
| } else { // target is an inherited element |
| WorkBreakdownElement pred = (WorkBreakdownElement) BridgeHelper.getMethodElement(node); |
| WorkOrder order = ProcessUtil.findWorkOrder(diagramActivity, targetWbe, pred); |
| if(order != null) { |
| getActionManager().doAction(IActionManager.REMOVE, pkg, |
| UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS, order, -1); |
| } |
| } |
| } |
| } else if (oldTarget instanceof ControlNode) { |
| Collection<Object> targetActNodes = new ArrayList<Object>(); |
| BridgeHelper.getTargetNodes(targetActNodes, |
| oldTarget, WorkBreakdownElement.class); |
| |
| // remove the work orders of target activities that have the |
| // predecessor in srcActNodes |
| // |
| for (Iterator<?> iter = targetActNodes.iterator(); iter.hasNext();) { |
| ActivityNode node = ((ActivityNode) iter.next()); |
| WorkBreakdownElement targetE = (WorkBreakdownElement) BridgeHelper.getMethodElement(node); |
| for (Iterator<?> iterator = srcActNodes.iterator(); iterator |
| .hasNext();) { |
| ActivityNode prednode = (ActivityNode) iterator.next(); |
| if(targetE.getSuperActivities() == diagramActivity) { // target element is local |
| if (BridgeHelper.canRemoveAllPreds(link, prednode, |
| node)) { |
| MethodElement srcElement = BridgeHelper.getMethodElement(prednode); |
| WorkOrder wo; |
| while ((wo = UmaUtil.findWorkOrder(targetE, srcElement)) != null) { |
| getActionManager().doAction(IActionManager.REMOVE, targetE, |
| UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR, wo, -1); |
| } |
| } |
| } else { // target element is inherited |
| WorkBreakdownElement pred = (WorkBreakdownElement) BridgeHelper.getMethodElement(prednode); |
| WorkOrder order = ProcessUtil.findWorkOrder(diagramActivity, targetE, pred); |
| if(order != null) { |
| getActionManager().doAction(IActionManager.REMOVE, pkg, |
| UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS, order, -1); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |