Package org.activiti.designer.features

Source Code of org.activiti.designer.features.ReconnectSequenceFlowFeature

package org.activiti.designer.features;

import java.util.List;

import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.Lane;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.SubProcess;
import org.activiti.designer.util.editor.Bpmn2MemoryModel;
import org.activiti.designer.util.editor.ModelHandler;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IReconnectionContext;
import org.eclipse.graphiti.features.context.impl.ReconnectionContext;
import org.eclipse.graphiti.features.impl.DefaultReconnectionFeature;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;

public class ReconnectSequenceFlowFeature extends DefaultReconnectionFeature {

  public ReconnectSequenceFlowFeature(IFeatureProvider fp) {
    super(fp);
  }
 
  @Override
  public void postReconnect(IReconnectionContext context) {
    Bpmn2MemoryModel model = ModelHandler.getModel(EcoreUtil.getURI(getDiagram()));
    Object connectionObject = getFeatureProvider().getBusinessObjectForPictogramElement(context.getConnection());
    if(connectionObject instanceof SequenceFlow == false) return;
   
    SequenceFlow flow = (SequenceFlow) connectionObject;
   
    Object targetObject = getFeatureProvider().getBusinessObjectForPictogramElement(context.getTargetPictogramElement());
    if(targetObject instanceof FlowNode == false) return;
    FlowNode targetElement = (FlowNode) targetObject;
   
    if(ReconnectionContext.RECONNECT_TARGET.equalsIgnoreCase(context.getReconnectType())) {
      List<SequenceFlow> flowList = targetElement.getIncomingFlows();
      boolean found = false;
      for (SequenceFlow sequenceFlow : flowList) {
        if(sequenceFlow.getId().equals(flow.getId())) {
          found = true;
        }
      }
     
      if(found == false) {
       
        FlowNode targetFlowNode = (FlowNode) model.getBpmnModel().getFlowElement(flow.getTargetRef());
      
        if (targetFlowNode != null) {
          // remove old target
          targetFlowNode.getIncomingFlows().remove(flow);
        }
       
        targetElement.getIncomingFlows().add(flow);
        flow.setTargetRef(targetElement.getId());
      }
     
    } else if(ReconnectionContext.RECONNECT_SOURCE.equalsIgnoreCase(context.getReconnectType())) {
      // targetElement is the source side of the sequence flow
      List<SequenceFlow> flowList = targetElement.getOutgoingFlows();
      boolean found = false;
      for (SequenceFlow sequenceFlow : flowList) {
        if(sequenceFlow.equals(flow)) {
          found = true;
        }
      }
     
      if(found == false) {
       
        FlowNode sourceFlowNode = (FlowNode) model.getBpmnModel().getFlowElement(flow.getSourceRef());
        ContainerShape sourceElement = (ContainerShape) getFeatureProvider().getPictogramElementForBusinessObject(sourceFlowNode);
        ContainerShape oldParentContainer = sourceElement.getContainer();
        ContainerShape newParentContainer = ((ContainerShape) context.getTargetPictogramElement()).getContainer();
       
        if (oldParentContainer != newParentContainer) {
         
          if (oldParentContainer instanceof Diagram) {
            ModelHandler.getModel(EcoreUtil.getURI(getDiagram())).getBpmnModel().getMainProcess().removeFlowElement(flow.getId());

          } else {
            Object parentObject = getFeatureProvider().getBusinessObjectForPictogramElement(oldParentContainer);
            if (parentObject instanceof SubProcess) {
              ((SubProcess) parentObject).removeFlowElement(flow.getId());

            } else if (parentObject instanceof Lane) {
              Lane lane = (Lane) parentObject;
              lane.getParentProcess().removeFlowElement(flow.getId());
            }
          }
         
          if (newParentContainer instanceof Diagram) {
            ModelHandler.getModel(EcoreUtil.getURI(getDiagram())).getBpmnModel().getMainProcess().addFlowElement(flow);

          } else {
            Object parentObject = getBusinessObjectForPictogramElement(newParentContainer);
            if (parentObject instanceof SubProcess) {
              ((SubProcess) parentObject).addFlowElement(flow);

            } else if (parentObject instanceof Lane) {
              Lane lane = (Lane) parentObject;
              lane.getParentProcess().addFlowElement(flow);
            }
          }
        }
       
        // remove old source
        if (sourceFlowNode != null) {
          sourceFlowNode.getOutgoingFlows().remove(flow);
        }
       
        targetElement.getOutgoingFlows().add(flow);
        flow.setSourceRef(targetElement.getId());
       
      }
    }
   
    super.postReconnect(context);
  }
}
TOP

Related Classes of org.activiti.designer.features.ReconnectSequenceFlowFeature

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.