blob: 098dedcd4fc1a92bbd7469098a26501d6863c2ee [file] [log] [blame]
//------------------------------------------------------------------------------
// 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);
}
}
}
}
}
}
}