blob: 481dccc4e096d170eca4f22ef3ce144ae0b95a29 [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.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.transaction.RollbackException;
import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
import org.eclipse.epf.library.edit.TngAdapterFactory;
import org.eclipse.epf.library.edit.command.IActionManager;
import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
import org.eclipse.epf.library.edit.process.IBSItemProvider;
import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
import org.eclipse.epf.library.edit.util.DescriptorPropUtil;
import org.eclipse.epf.library.edit.util.PredecessorList;
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.BreakdownElement;
import org.eclipse.epf.uma.Descriptor;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Milestone;
import org.eclipse.epf.uma.TaskDescriptor;
import org.eclipse.epf.uma.UmaFactory;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.WorkBreakdownElement;
import org.eclipse.epf.uma.WorkOrder;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.uml2.uml.ActivityEdge;
import org.eclipse.uml2.uml.ActivityNode;
import org.eclipse.uml2.uml.ActivityParameterNode;
import org.eclipse.uml2.uml.ControlNode;
import org.eclipse.uml2.uml.StructuredActivityNode;
import org.eclipse.uml2.uml.UMLFactory;
/**
* @author Phong Nguyen Le
* @author Shilpa Toraskar
*
* @since 1.2
*/
public class ActivityDiagramAdapter extends DiagramAdapter {
public ActivityDiagramAdapter(BreakdownElementWrapperItemProvider wrapper) {
super(wrapper);
}
/**
* @param e
*/
public ActivityDiagramAdapter(Activity e) {
super(e);
}
protected ActivityNode addNode(Collection nodes, Object obj) {
if (obj instanceof Activity) {
Activity act = (Activity) obj;
VariabilityElement base = act.getVariabilityBasedOnElement();
if (base != null) {
// find existing node for base and link it to the activity
//
org.eclipse.uml2.uml.Activity diagram = getDiagram();
ActivityNode baseNode = BridgeHelper.findNode(diagram, base);
if (baseNode == null) {
baseNode = BridgeHelper.findNode(diagram, act);
}
if (baseNode != null) {
// disassociate with the base
//
NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(baseNode);
if(nodeAdapter != null) {
nodeAdapter.dispose();
}
// associate base node with the activity
//
nodeAdapter = createNodeAdapter(act);
if(nodeAdapter != null) {
initializeNodeAdapter(nodeAdapter);
baseNode.eAdapters().add(nodeAdapter);
nodeAdapter.updateView();
// if(ProcessUtil.isExtendingOrLocallyContributing(act)) {
BridgeHelper.associate(baseNode, act);
if(BridgeHelper.isInherited(nodeAdapter.getView())){
BridgeHelper.unmarkInHerited(nodeAdapter.getView());
}
nodeAdapter.setTargetReadOnly(false);
// }
}
return null;
}
}
}
return super.addNode(nodes, obj);
}
protected NodeAdapter createNodeAdapter(MethodElement e) {
if(e instanceof WorkBreakdownElement) {
return new WorkBreakdownElementNodeAdapter(e);
}
return null;
}
protected void addToUmaModel(int position, ActivityNode addedNode) {
MethodElement e = BridgeHelper.getMethodElement(addedNode);
if(e == null) {
return;
}
Activity act = (Activity) getElement();
// translate ActivityNode index to Activity index
//
int i = toActivityIndex(position);
NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(addedNode);
boolean notify = nodeAdapter.notificationEnabled;
try {
nodeAdapter.notificationEnabled = false;
getActionManager().doAction(IActionManager.ADD, act, UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENTS, e, i);
BridgeHelper.addEAnnotation(addedNode, e);
}
finally {
nodeAdapter.notificationEnabled = notify;
}
super.addToUmaModel(position, addedNode);
}
private int toActivityIndex(int index) {
if (index == -1)
return index;
int size = getNodes().size();
int i = index + 1;
if (i == size)
return -1;
ActivityNode node = (ActivityNode) getNodes().get(i);
if (node == null)
return -1;
for (; !(BridgeHelper.getMethodElement(node) instanceof BreakdownElement) && i < size; i++) {
node = (ActivityNode) getNodes().get(i);
}
if (i == size)
return -1;
Activity act = (Activity) getElement();
return act.getBreakdownElements().indexOf(BridgeHelper.getMethodElement(node));
}
protected List getBreakdownElementTypes() {
return Collections.singletonList(WorkBreakdownElement.class);
}
/* (non-Javadoc)
* @see org.eclipse.epf.diagram.core.bridge.DiagramAdapter#newNode(org.eclipse.epf.uma.MethodElement)
*/
protected ActivityNode newNode(MethodElement e) {
ActivityNode node = null;
if(e instanceof Activity ) {
node = UMLFactory.eINSTANCE.createStructuredActivityNode();
}
else if(e instanceof TaskDescriptor || e instanceof Milestone) {
node = UMLFactory.eINSTANCE.createActivityParameterNode();
}
else if(e instanceof WorkBreakdownElement) {
node = UMLFactory.eINSTANCE.createStructuredActivityNode();
}
if(node != null) {
BridgeHelper.associate(node, e);
}
return node;
}
private boolean isValid(ActivityEdge link) {
if (link.getSource() == null || link.getTarget() == null
|| !getNodes().contains(link.getSource())
|| !getNodes().contains(link.getTarget())) {
return false;
}
return true;
}
private static boolean isValidWorkOrder(WorkOrder wo, Object pred) {
if (wo.getPred() == pred) {
return true;
}
if (pred instanceof Activity) {
Activity act = (Activity) pred;
// check if predecessor reference in the given work order is base of
// pred
//
for (VariabilityElement ve = act.getVariabilityBasedOnElement(); ve != null; ve = ve
.getVariabilityBasedOnElement()) {
if (ve == wo.getPred()) {
return true;
}
}
}
return false;
}
/**
* Checks if Node src can reach Node target as the first ActivityNode in the
* diagram
*
* @param predNode
* @param node
* @return
*/
private static boolean canReachAsFirstActivityNode(ActivityNode predNode, ActivityNode node) {
for (Iterator iter = predNode.getOutgoings().iterator(); iter
.hasNext();) {
ActivityEdge link = (ActivityEdge) iter.next();
if (link.getTarget() == node) {
return true;
}
if (link.getTarget() instanceof ControlNode
&& canReachAsFirstActivityNode(link.getTarget(), node)) {
return true;
}
}
return false;
}
protected List<WorkBreakdownElement> getLocalPredecessors(ActivityNode node) {
Activity diagramActivity = (Activity) BridgeHelper.getMethodElement(getDiagram());
AdapterFactory adapterFactory = getAdapterFactory();
ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(diagramActivity, ITreeItemContentProvider.class);
Collection<?> children = adapter.getChildren(diagramActivity);
return getLocalPredecessors(node, children);
}
private List<WorkBreakdownElement> getLocalPredecessors(ActivityNode node, Collection<?> activityChildren) {
MethodElement e = BridgeHelper.getMethodElement(node);
if(e instanceof WorkBreakdownElement) {
// find item provider
//
Object object = null;
for (Object child : activityChildren) {
if(e == TngUtil.unwrap(child)) {
object = child;
break;
}
}
if(object != null) {
Object ip = getAdapterFactory().adapt(object, ITreeItemContentProvider.class);
if(ip instanceof IBSItemProvider) {
Object parent = ((ITreeItemContentProvider) ip).getParent(object);
ArrayList<WorkBreakdownElement> preds = new ArrayList<WorkBreakdownElement>();
PredecessorList predList = ((IBSItemProvider) ip).getPredecessors();
for (Object predIp : predList) {
Object pred = TngUtil.unwrap(predIp);
if (ProcessUtil.isSynFree() && pred instanceof TaskDescriptor) {
DescriptorPropUtil propUtil = DescriptorPropUtil.getDesciptorPropUtil();
List<? extends Descriptor> childList = propUtil.getCustomizingChildren((TaskDescriptor) pred);
if (childList != null && ! childList.isEmpty()) {
boolean processed = false;
for (Descriptor des : childList) {
if (des.getSuperActivities() == parent) {
preds.add((WorkBreakdownElement) des);
processed = true;
break;
}
}
if (processed) {
continue;
}
}
}
// make sure that predecessors are sibling
//
if(((ITreeItemContentProvider) predIp).getParent(pred) == parent) {
if(pred instanceof WorkBreakdownElement) {
preds.add((WorkBreakdownElement) pred);
} else if (pred instanceof Adapter) {
pred = ((Adapter) pred).getTarget();
if(pred instanceof WorkBreakdownElement) {
preds.add((WorkBreakdownElement) pred);
}
}
} else if (ProcessUtil.isSynFree() && pred instanceof Adapter) {
pred = ((Adapter) pred).getTarget();
if (pred instanceof TaskDescriptor) {
TaskDescriptor td = (TaskDescriptor) pred;
if (td.getSuperActivities() == parent) {
preds.add(td);
}
}
}
}
return preds;
}
}
}
return Collections.emptyList();
}
AdapterFactory getAdapterFactory(){
AdapterFactory adapterFactory = null;
if (filter == null) {
adapterFactory = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
} else if (filter instanceof IAdapterFactoryFilter) {
adapterFactory = (ConfigurableComposedAdapterFactory) ((IAdapterFactoryFilter) filter)
.getWBSAdapterFactory();
}
return adapterFactory;
}
@Override
protected void populateLinks(List<ActivityNode> selectedNodes) {
if(selectedNodes.isEmpty()) {
return;
}
super.populateLinks(selectedNodes);
// remove the invalid links
//
for (ActivityNode node : selectedNodes) {
WorkBreakdownElement wbe = null;
MethodElement me;
if ((me = BridgeHelper.getMethodElement(node)) instanceof WorkBreakdownElement) {
wbe = (WorkBreakdownElement) me;
}
ArrayList<ActivityEdge> linksToRemove = new ArrayList<ActivityEdge>();
linkListWalk: for (Iterator iterator = node
.getIncomings().iterator(); iterator.hasNext();) {
ActivityEdge link = (ActivityEdge) iterator.next();
if (!isValid(link)) {
linksToRemove.add(link);
}
if (wbe != null) {
// TODO: need revisit to check the valid connection from a
// ForkNode or JoinNode
//
if (link.getSource() != null && link.getSource() instanceof ControlNode)
continue linkListWalk;
boolean workOrderFound = false;
WorkOrder workOrder = (WorkOrder) BridgeHelper.getMethodElement(link);
if(workOrder == null) {
Object pred = BridgeHelper.getMethodElement(link.getSource());
find_WorkOrder: for (Iterator iterator1 = wbe
.getLinkToPredecessor().iterator(); iterator1
.hasNext();) {
WorkOrder wo = (WorkOrder) iterator1.next();
if (isValidWorkOrder(wo, pred)) {
workOrderFound = true;
break find_WorkOrder;
}
}
} else {
workOrderFound = true;
}
if (!workOrderFound) {
// invalid link, remove it
//
linksToRemove.add(link);
}
}
}
for (ActivityEdge link : linksToRemove) {
BridgeHelper.removeLink(link);
}
linksToRemove.clear();
for (Iterator iterator = node.getOutgoings().iterator(); iterator
.hasNext();) {
ActivityEdge link = (ActivityEdge) iterator.next();
if (!isValid(link)) {
linksToRemove.add(link);
}
}
for (Iterator iterator = linksToRemove.iterator(); iterator
.hasNext();) {
ActivityEdge link = (ActivityEdge) iterator.next();
BridgeHelper.removeLink(link);
}
linksToRemove.clear();
linksToRemove = null;
}
// Check the links of each ActivityNode
// set the WorkOrder to the link if needed
// add new link for those WorkOrders that still don't have the
// corresponding link
//
Activity diagramActivity = (Activity) BridgeHelper.getMethodElement(getDiagram());
AdapterFactory adapterFactory = getAdapterFactory();
ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(diagramActivity, ITreeItemContentProvider.class);
Collection<?> children = adapter.getChildren(diagramActivity);
for (ActivityNode node : selectedNodes) {
List<WorkBreakdownElement> preds = getLocalPredecessors(node, children);
// Iterate work orders and create links.
for (WorkBreakdownElement pred : preds) {
ActivityNode predNode = BridgeHelper.findNode(getDiagram(),
pred, true);
if (predNode != null) {
// check if there is a link for this work order
// already
//
boolean linkFound = false;
find_link: for (Iterator<?> iterator1 = node
.getIncomings().iterator(); iterator1
.hasNext();) {
ActivityEdge link = (ActivityEdge) iterator1.next();
if (link.getSource() == predNode) {
// link already exists
// check if work order is set to this link
//
linkFound = true;
// MethodElement me = BridgeHelper.getMethodElement(link);
// if (link != null) {
// BridgeHelper.setSemanticModel(
// link, workOrder);
// }
break find_link;
}
}
if (!linkFound) {
// check if this WorkOrder can be represented
// via links of TypedNodes
//
if (!canReachAsFirstActivityNode(predNode, node)) {
// add new link for this work order
//
NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
NodeAdapter predNodeAdapter = BridgeHelper.getNodeAdapter(predNode);
if(nodeAdapter != null && predNodeAdapter != null) {
boolean oldNotify = nodeAdapter.notificationEnabled;
boolean predNodeNotify = predNodeAdapter.notificationEnabled;
try {
nodeAdapter.notificationEnabled = false;
predNodeAdapter.notificationEnabled = false;
ActivityEdge edge = nodeAdapter.addIncomingConnection(pred);
if(BridgeHelper.isInherited(node)) {
// target node is inherited, must find the custom work order and associate it with the edge
//
WorkBreakdownElement inheritedChild = (WorkBreakdownElement) BridgeHelper.getMethodElement(node);
if(inheritedChild != null) {
WorkOrder wo = ProcessUtil.findWorkOrder(diagramActivity, inheritedChild, pred);
if(wo != null) {
BridgeHelper.associate(edge, wo);
}
}
}
} finally {
nodeAdapter.notificationEnabled = oldNotify;
predNodeAdapter.notificationEnabled = predNodeNotify;
}
}
}
}
}
}
}
cleanDuplicateLinks(selectedNodes);
}
private void cleanDuplicateLinks(List<ActivityNode> selectedNodes) {
List<ActivityEdge> duplicateLinks = new ArrayList<ActivityEdge>();
for (ActivityNode wbNode : selectedNodes) {
if(wbNode.getIncomings() != null){
findDuplicateLinks(duplicateLinks, wbNode.getIncomings());
}
if(wbNode.getOutgoings() !=null){
findDuplicateLinks(duplicateLinks, wbNode.getOutgoings());
}
}
for (ActivityEdge link : duplicateLinks) {
BridgeHelper.removeLink(link);
}
duplicateLinks.clear();
duplicateLinks = null;
}
private void findDuplicateLinks(List duplicateLinks, List links) {
for (int i = 0; i < links.size(); i++) {
ActivityEdge link = (ActivityEdge) links.get(i);
if(!duplicateLinks.contains(link)){
for (int j = i + 1; j < links.size(); j++) {
ActivityEdge link1 = (ActivityEdge) links.get(j);
if (link1.getSource() == link.getSource()
&& link1.getTarget() == link.getTarget()) {
duplicateLinks.add(link1);
}
}
}
}
}
protected Collection populateNodes() {
HashSet selectedNodes = new HashSet();
Collection children = getChildren();
// associate control nodes
//
selectedNodes.addAll(associateControlNodes(children));
// add WorkBreakdownElementNodes
//
selectedNodes.addAll(addElementNodes(children));
return selectedNodes;
}
@Override
protected void updateView(Collection<?> selectedNodes)
throws InterruptedException, RollbackException {
super.updateView(selectedNodes);
hideUnusedSyncBars();
}
protected void hideUnusedSyncBars() {
View diagram = getView();
for (Object child : diagram.getVisibleChildren()) {
View childView = (View) child;
// hide a sync bar that is not connected to any visible target node
// or source node, which is associated with a work breakdown element
//
if(childView.getElement() instanceof ControlNode &&
BridgeHelper.isSynchBar((ActivityNode) childView.getElement()) &&
!isConnectedToVisibleWBENode(childView)) {
childView.setVisible(false);
}
}
}
private static boolean isConnectedToVisibleWBENode(View view) {
// check source nodes
//
for(Object object : view.getTargetEdges()) {
View connectedView = ((Edge) object).getSource();
// if(connectedView != null && connectedView.isVisible() &&
// connectedView.getElement() instanceof ActivityNode &&
// BridgeHelper.getMethodElement(connectedView) instanceof WorkBreakdownElement) {
// return true;
// }
if(connectedView != null && connectedView.isVisible() &&
connectedView.getElement() instanceof ActivityNode ) {
return true;
}
}
// check target nodes
//
for(Object object : view.getSourceEdges()) {
View connectedView = ((Edge) object).getTarget();
// if(connectedView != null && connectedView.isVisible() &&
// connectedView.getElement() instanceof ActivityNode &&
// BridgeHelper.getMethodElement(connectedView) instanceof WorkBreakdownElement) {
// return true;
// }
if(connectedView != null && connectedView.isVisible() &&
connectedView.getElement() instanceof ActivityNode) {
return true;
}
}
return false;
}
private List<? extends ControlNode> associateControlNodes(Collection<?> methodElements) {
List<ControlNode> ctrlNodes = new ArrayList<ControlNode>();
for (Iterator<?> iter = getDiagram().getNodes().iterator(); iter.hasNext();) {
ActivityNode node = (ActivityNode) iter.next();
if(node instanceof ControlNode) {
if(addNodeAdapterTo(node) != null) {
ctrlNodes.add((ControlNode) node);
}
}
}
return ctrlNodes;
}
/**
* Adds element nodes for the specified method elements if they don't exist yet.
*
* @param methodElements
*/
private List addElementNodes(Collection methodElements) {
ArrayList nodes = new ArrayList();
ArrayList newNodes = new ArrayList();
for (Iterator iter = methodElements.iterator(); iter.hasNext();) {
Object e = iter.next();
Object child = TngUtil.unwrap(e);
if (child instanceof WorkBreakdownElement) {
ActivityNode node = BridgeHelper.findNode(getDiagram(), child);
if(node == null) {
node = toNode((MethodElement) child);
newNodes.add(node);
}
else {
// synchronize name with linked element
//
String name = BridgeHelper.getNodeName((MethodElement) child);
if(!name.equals(node.getName())) {
node.setName(name);
}
addNodeAdapterTo(node);
}
nodes.add(node);
if (e instanceof BreakdownElementWrapperItemProvider && !isTargetReadOnly()) {
BreakdownElementWrapperItemProvider wrapper = ((BreakdownElementWrapperItemProvider) e);
if (wrapper.isReadOnly()) {
NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
nodeAdapter.wrapper = wrapper;
// readOnly attribute is still needed
// after introduction of wrapper.
// For example, we can have a node adapter for a read-only base activity
// without supplying wrapper for this base activity.
//
nodeAdapter.basicSetTargetReadOnly(true);
}
}
}
}
getNodes().addAll(newNodes);
return nodes;
}
/**
* Moved code from getChildren. getAdapter() will return Adapter,
* which will allow us to find itemprovider for the children.
*
* @return
*/
private ITreeItemContentProvider getAdapter(){
ITreeItemContentProvider adapter = null;
if (wrapper != null) {
adapter = wrapper;
} else {
adapter = (ITreeItemContentProvider) getAdapterFactory().adapt(
getElement(), ITreeItemContentProvider.class);
}
return adapter;
}
public Collection getChildren() {
ITreeItemContentProvider adapter = getAdapter();
if (adapter != null) {
//Turn off the VariabilityInfo for the activity diagram.
Object obj = null;
boolean enableVariabilityInfo = false;
if(adapter instanceof ActivityWrapperItemProvider){
obj = ((ActivityWrapperItemProvider)adapter).getDelegatingItemProvider();
}
if(adapter instanceof BSActivityItemProvider){
obj = adapter;
}
if(obj instanceof BSActivityItemProvider){
enableVariabilityInfo = ((BSActivityItemProvider)obj).isEnableVariabilityInfo();
((BSActivityItemProvider)obj).setEnableVariabilityInfo(false);
}
// end of variability info
// return adapter.getChildren(getObject());
// commented above line, For diagrams - rollup should be false, for
// handling rollup state below code.
List children = new ArrayList();
extractChildren(adapter, getElement(), children);
// reset variabilityinfo status back
if(obj instanceof BSActivityItemProvider){
((BSActivityItemProvider)obj).setEnableVariabilityInfo(enableVariabilityInfo);
}
return children;
} else {
return Collections.EMPTY_LIST;
}
}
protected boolean removeNode(Object obj) {
if (obj instanceof Activity) {
Activity act = (Activity) obj;
VariabilityElement base = act.getVariabilityBasedOnElement();
if (base != null) {
org.eclipse.uml2.uml.Activity diagram = getDiagram();
// find existing node for the old activity and relink it to its
// base
//
ActivityNode node = BridgeHelper.findNode(diagram, act);
if(node == null) {
node = BridgeHelper.findNode(diagram, base);
}
if (node != null) {
// disassociate with the old activity
//
NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
if(nodeAdapter != null) {
nodeAdapter.dispose();
}
// associate node with the base activity
//
nodeAdapter = createNodeAdapter(base);
if(nodeAdapter != null) {
initializeNodeAdapter(nodeAdapter);
nodeAdapter.basicSetTargetReadOnly(true);
node.eAdapters().add(nodeAdapter);
nodeAdapter.updateView();
if(!BridgeHelper.isInherited(nodeAdapter.getView())){
BridgeHelper.markInherited(nodeAdapter.getView());
}
}
return false;
}
}
}
return super.removeNode(obj);
}
protected NodeAdapter addNodeAdapterTo(ActivityNode node) {
NodeAdapter adapter = BridgeHelper.getNodeAdapter(node);
if(adapter != null) {
return adapter;
}
if(node instanceof ControlNode) {
adapter = new ControlNodeAdapter();
}
else {
MethodElement e = BridgeHelper.getMethodElement(node);
if(e == null) {
if(node instanceof StructuredActivityNode) {
String type = BridgeHelper.getType((StructuredActivityNode)node);
if (BridgeHelper.UMA_PHASE.equals(type)) {
e = UmaFactory.eINSTANCE.createPhase();
}
else if (BridgeHelper.UMA_ITERATION.equals(type)) {
e = UmaFactory.eINSTANCE.createIteration();
}
else {
e = UmaFactory.eINSTANCE.createActivity();
}
}
else if(node instanceof ActivityParameterNode) {
String type = BridgeHelper.getType((ActivityParameterNode)node);
if(BridgeHelper.UMA_MILESTONE.equals(type)) {
e = UmaFactory.eINSTANCE.createMilestone();
}
else {
e = UmaFactory.eINSTANCE.createTaskDescriptor();
}
}
}
if(e != null) {
adapter = new WorkBreakdownElementNodeAdapter(e);
}
}
if(adapter != null) {
initializeNodeAdapter(adapter);
node.eAdapters().add(adapter);
return adapter;
}
return null;
}
private ActivityNode reassociateBaseNode(Activity act) {
VariabilityElement base = act.getVariabilityBasedOnElement();
if (base != null) {
// find existing node for base and link it to the activity
//
org.eclipse.uml2.uml.Activity diagram = getDiagram();
ActivityNode baseNode = BridgeHelper.findNode(diagram, base);
if (baseNode == null) {
baseNode = BridgeHelper.findNode(diagram, act);
}
if (baseNode != null) {
// disassociate with the base
//
NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(baseNode);
if(nodeAdapter != null) {
nodeAdapter.dispose();
}
// associate base node with the activity
//
nodeAdapter = createNodeAdapter(act);
if(nodeAdapter != null) {
initializeNodeAdapter(nodeAdapter);
baseNode.eAdapters().add(nodeAdapter);
nodeAdapter.updateView();
// if(ProcessUtil.isExtendingOrLocallyContributing(act)) {
BridgeHelper.associate(baseNode, act);
if(BridgeHelper.isInherited(nodeAdapter.getView())){
BridgeHelper.unmarkInHerited(nodeAdapter.getView());
}
nodeAdapter.setTargetReadOnly(false);
// }
}
return baseNode;
}
}
return null;
}
@Override
protected void replaceNode(Object oldElement, Object newElement) {
if(newElement instanceof MethodElement) {
// find existing node for old element and link it to the new element
//
org.eclipse.uml2.uml.Activity diagram = getDiagram();
ActivityNode oldNode = BridgeHelper.findNode(diagram, oldElement);
if (oldNode != null) {
// disassociate with the old element
//
NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(oldNode);
if(nodeAdapter != null) {
nodeAdapter.dispose();
}
// associate base node with the new element
//
MethodElement e = (MethodElement) newElement;
nodeAdapter = createNodeAdapter(e);
if(nodeAdapter != null) {
initializeNodeAdapter(nodeAdapter);
oldNode.eAdapters().add(nodeAdapter);
nodeAdapter.updateView();
BridgeHelper.associate(oldNode, e);
}
}
}
}
}