Package org.activiti.designer.features

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

package org.activiti.designer.features;

import org.activiti.bpmn.model.Association;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.Lane;
import org.activiti.bpmn.model.SubProcess;
import org.activiti.bpmn.model.TextAnnotation;
import org.activiti.designer.PluginImage;
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.ICreateConnectionContext;
import org.eclipse.graphiti.features.context.impl.AddConnectionContext;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;

public class CreateAssociationFeature extends AbstractCreateBPMNConnectionFeature {

  public static final String FEATURE_ID_KEY = "association";
 
  public CreateAssociationFeature(final IFeatureProvider fp) {
    super(fp, "Association", "Associate information with artifacts and flow objects");
  }

  @Override
  public boolean canCreate(ICreateConnectionContext context) {
    final BaseElement sourceBo = getBaseElement(context.getSourceAnchor());
    final BaseElement targetBo = getBaseElement(context.getTargetAnchor());
   
    boolean canCreate = false;
   
    if (sourceBo != targetBo && (sourceBo instanceof TextAnnotation || targetBo instanceof TextAnnotation)) {
      canCreate = true;
    }
   
    return canCreate;
  }

  @Override
  public Connection create(ICreateConnectionContext context) {
    final Anchor sourceAnchor = context.getSourceAnchor();
    final Anchor targetAnchor = context.getTargetAnchor();
   
    final BaseElement sourceBo = getBaseElement(sourceAnchor)
    final BaseElement targetBo = getBaseElement(targetAnchor);
   
    if (sourceBo == null || targetBo == null) {
      return null;
    } else {
      // create new association
      final Association association = createAssociation(sourceBo, targetBo, context);
     
      final AddConnectionContext addContext = new AddConnectionContext(sourceAnchor
                                                                     , targetAnchor);
      addContext.setNewObject(association);
     
      return (Connection) getFeatureProvider().addIfPossible(addContext);
    }
  }
 
  private Association createAssociation(final BaseElement sourceBo, final BaseElement targetBo
                                      , final ICreateConnectionContext context) {
   
    final Association association = new Association();
   
    association.setId(getNextId());
    association.setSourceRef(sourceBo.getId());
    association.setTargetRef(targetBo.getId());
   
    final ContainerShape targetContainer = (ContainerShape) context.getSourcePictogramElement();
    final ContainerShape parentContainer = targetContainer.getContainer();
   
    if (parentContainer instanceof Diagram) {
      final Bpmn2MemoryModel model = ModelHandler.getModel(EcoreUtil.getURI(getDiagram()));
      if (model.getBpmnModel().getPools().size() > 0) {
        String poolRef = model.getBpmnModel().getPools().get(0).getId();
        model.getBpmnModel().getProcess(poolRef).addArtifact(association);
      } else {
        model.getBpmnModel().getMainProcess().addArtifact(association);
      }
    } else {
      final Object parentBo = getBusinessObjectForPictogramElement(parentContainer);
     
      if (parentBo instanceof SubProcess) {
        final SubProcess subProcess = (SubProcess) parentBo;
        subProcess.addArtifact(association);
      } else if (parentBo instanceof Lane) {
        final Lane lane = (Lane) parentBo;
        lane.getParentProcess().addArtifact(association);
      }
    }
   
    return association;
  }

  @Override
  public boolean canStartConnection(ICreateConnectionContext context) {
    return getBaseElement(context.getSourceAnchor()) != null;
  }

  @Override
  public String getCreateImageId() {
    return PluginImage.IMG_ASSOCIATION.getImageKey();
  }

  @Override
  protected String getFeatureIdKey() {
    return FEATURE_ID_KEY;
  }
 
  @Override
  protected Class< ? extends BaseElement> getFeatureClass() {
    return new Association().getClass();
  }

  private BaseElement getBaseElement(final Anchor anchor) {
    if (anchor != null) {
      final Object bo = getBusinessObjectForPictogramElement(anchor.getParent());
     
      if (bo instanceof BaseElement) {
        return (BaseElement) bo;
      }
    }
   
    return null;
  }
}
TOP

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

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.