@Test
  @DiagramResource("org/camunda/bpm/modeler/test/ui/change/ChangeSupportTest.testBase.bpmn")
  public void testAttributeRemove() {
    final SequenceFlow sequenceFlow2 =
        findBusinessObjectById(diagram, "SequenceFlow_2", SequenceFlow.class);

    FeatureChangeFilter filter =
        new FeatureChangeFilter(sequenceFlow2, CONDITION_EXPRESSION_FEATURE);
    CustomResourceSetListener listener = new CustomResourceSetListener(sequenceFlow2, filter);
    listener.register();

    // assert that feature is set
    assertThat(sequenceFlow2.eIsSet(CONDITION_EXPRESSION_FEATURE)).isTrue();

    transactionalExecute(
        new RecordingCommand(editingDomain) {

          @Override
          protected void doExecute() {
            sequenceFlow2.eUnset(CONDITION_EXPRESSION_FEATURE);
          }
        });

    assertThat(listener.getCapturedEvents()).hasSize(1);
  }
  public SequenceFlow createSequenceFlow(FlowNode source, FlowNode target) {
    SequenceFlow sequenceFlow = FACTORY.createSequenceFlow();
    //		sequenceFlow.setId(EcoreUtil.generateUUID());
    ModelUtil.setID(sequenceFlow, resource);

    addFlowElement(source, sequenceFlow);
    sequenceFlow.setSourceRef(source);
    sequenceFlow.setTargetRef(target);
    return sequenceFlow;
  }
  public static void updateCategoryValues(IFeatureProvider fp, PictogramElement pe) {

    Resource resource = ObjectPropertyProvider.getResource(pe);
    if (Bpmn2Preferences.getInstance(resource).getPropagateGroupCategories()) {
      // only do this if User Preference is enabled: assign the Group's CategoryValue
      // to the FlowElement represented by the given PictogramElement
      Diagram diagram = fp.getDiagramTypeProvider().getDiagram();
      FlowElement flowElement = BusinessObjectUtil.getFirstElementOfType(pe, FlowElement.class);
      if (flowElement == null) return;
      // remove any previous Category Values from this FlowElement
      flowElement.getCategoryValueRef().clear();

      // find all Groups in this Resource and check if it contains the given FlowElement
      if (pe instanceof ContainerShape) {
        for (Group group : ModelUtil.getAllObjectsOfType(resource, Group.class)) {
          CategoryValue cv = group.getCategoryValueRef();
          if (cv == null) continue;

          for (PictogramElement groupShape :
              Graphiti.getLinkService().getPictogramElements(diagram, group)) {
            if (groupShape instanceof ContainerShape) {
              for (ContainerShape flowElementShape :
                  FeatureSupport.findGroupedShapes((ContainerShape) groupShape)) {
                FlowElement fe =
                    BusinessObjectUtil.getFirstElementOfType(flowElementShape, FlowElement.class);
                if (fe == flowElement) {
                  fe.getCategoryValueRef().add(cv);
                  break;
                }
              }
            }
          }
        }
      } else if (pe instanceof Connection && flowElement instanceof SequenceFlow) {
        SequenceFlow sf = (SequenceFlow) flowElement;
        FlowNode source = sf.getSourceRef();
        FlowNode target = sf.getTargetRef();

        sf.getCategoryValueRef().clear();
        sf.getCategoryValueRef().addAll(source.getCategoryValueRef());
        sf.getCategoryValueRef().addAll(target.getCategoryValueRef());
      }
    }
  }
 @Test
 public void testSequenceFlowUnmarshalling() throws Exception {
   Bpmn2JsonUnmarshaller unmarshaller = new Bpmn2JsonUnmarshaller();
   Definitions definitions =
       ((Definitions)
           unmarshaller.unmarshall(getTestJsonFile("sequenceFlow.json"), "").getContents().get(0));
   assertTrue(definitions.getRootElements().size() == 1);
   Process process = getRootProcess(definitions);
   assertTrue(process.getFlowElements().get(0) instanceof Task);
   Task task = (Task) process.getFlowElements().get(0);
   assertEquals("task1", task.getName());
   Task task2 = (Task) process.getFlowElements().get(1);
   assertEquals("task2", task2.getName());
   SequenceFlow flow = (SequenceFlow) process.getFlowElements().get(2);
   assertEquals("seqFlow", flow.getName());
   assertEquals(task, flow.getSourceRef());
   assertEquals(task2, flow.getTargetRef());
   definitions.eResource().save(System.out, Collections.emptyMap());
 }
  public static List<Object> getFlowElementsContainerChildren(FlowElementsContainer container) {
    List<Object> retList = new ArrayList<Object>();
    List<FlowElement> flowElements = new ArrayList<FlowElement>();
    for (FlowElement fe : container.getFlowElements()) {
      if (!(fe instanceof BoundaryEvent)) flowElements.add(fe);
    }

    if (container.getLaneSets().size() == 0) retList.addAll(flowElements);
    else {
      for (LaneSet ls : container.getLaneSets()) {
        retList.addAll(ls.getLanes());
      }
      // only add the flow element if it's not contained in a Lane
      List<Object> laneElements = new ArrayList<Object>();
      for (FlowElement fe : flowElements) {
        boolean inLane = false;
        for (LaneSet ls : container.getLaneSets()) {
          if (isInLane(fe, ls)) {
            inLane = true;
            break;
          }
        }
        if (inLane) laneElements.add(fe);
        else retList.add(fe);
      }

      // don't include any sequence flows that connect flow
      // nodes that are contained in Lanes
      List<SequenceFlow> flows = new ArrayList<SequenceFlow>();
      for (Object fn : laneElements) {
        if (fn instanceof FlowNode) {
          for (SequenceFlow sf : ((FlowNode) fn).getIncoming()) {
            if (laneElements.contains(sf.getSourceRef())
                && laneElements.contains(sf.getTargetRef())
                && !flows.contains(sf)) {
              flows.add(sf);
            }
          }
          for (SequenceFlow sf : ((FlowNode) fn).getOutgoing()) {
            if (laneElements.contains(sf.getSourceRef())
                && laneElements.contains(sf.getTargetRef())
                && !flows.contains(sf)) {
              flows.add(sf);
            }
          }
        }
      }
      retList.removeAll(flows);
    }

    // add the list of Artifacts
    if (container instanceof Process) {
      retList.addAll(((Process) container).getArtifacts());
    } else if (container instanceof SubProcess) {
      retList.addAll(((SubProcess) container).getArtifacts());
    }
    if (container instanceof SubChoreography) {
      retList.addAll(((SubChoreography) container).getArtifacts());
    }
    if (container instanceof Choreography) {
      // Add Pools as children if the Pool has a Process associated with it,
      // or if the Participant is NOT referenced by a Choreography Activity.
      for (Participant p : ((Choreography) container).getParticipants()) {
        if (p.getProcessRef() != null) retList.add(p);
        else {
          for (FlowElement fe : flowElements) {
            if (fe instanceof ChoreographyActivity) {
              if (!((ChoreographyActivity) fe).getParticipantRefs().contains(p)) {
                retList.add(p);
              }
            }
          }
        }
      }
    }
    return retList;
  }
 /* (non-Javadoc)
  * @see org.eclipse.gef.editparts.AbstractConnectionEditPart#getSource()
  */
 @Override
 public EditPart getSource() {
   FlowNode sourceNode = fUnderlyingSequenceFlow.getSourceRef();
   ShapeEditPartAdapter shapeEditPart = AdapterFactory.getShapeEditPartAdapter(sourceNode);
   return shapeEditPart;
 }
 /* (non-Javadoc)
  * @see org.eclipse.gef.editparts.AbstractConnectionEditPart#getTarget()
  */
 @Override
 public EditPart getTarget() {
   FlowNode targetNode = fUnderlyingSequenceFlow.getTargetRef();
   ShapeEditPartAdapter shapeEditPart = AdapterFactory.getShapeEditPartAdapter(targetNode);
   return shapeEditPart;
 }