@Test
  public void testWarningError() throws UnsupportedEncodingException, XMLStreamException {
    String flowWithoutConditionNoDefaultFlow =
        "<?xml version='1.0' encoding='UTF-8'?>"
            + "<definitions id='definitions' xmlns='http://www.omg.org/spec/BPMN/20100524/MODEL' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:activiti='http://activiti.org/bpmn' targetNamespace='Examples'>"
            + "  <process id='exclusiveGwDefaultSequenceFlow'> "
            + "    <startEvent id='theStart' /> "
            + "    <sequenceFlow id='flow1' sourceRef='theStart' targetRef='exclusiveGw' /> "
            + "    <exclusiveGateway id='exclusiveGw' name='Exclusive Gateway' /> "
            + // no default = "flow3" !!
            "    <sequenceFlow id='flow2' sourceRef='exclusiveGw' targetRef='theTask1'> "
            + "      <conditionExpression xsi:type='tFormalExpression'>${input == 1}</conditionExpression> "
            + "    </sequenceFlow> "
            + "    <sequenceFlow id='flow3' sourceRef='exclusiveGw' targetRef='theTask2'/> "
            + // one would be OK
            "    <sequenceFlow id='flow4' sourceRef='exclusiveGw' targetRef='theTask2'/> "
            + // but two unconditional not!
            "    <userTask id='theTask1' name='Input is one' /> "
            + "    <userTask id='theTask2' name='Default input' /> "
            + "  </process>"
            + "</definitions>";

    XMLInputFactory xif = XMLInputFactory.newInstance();
    InputStreamReader in =
        new InputStreamReader(
            new ByteArrayInputStream(flowWithoutConditionNoDefaultFlow.getBytes()), "UTF-8");
    XMLStreamReader xtr = xif.createXMLStreamReader(in);
    bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr);
    Assert.assertNotNull(bpmnModel);
    List<ValidationError> allErrors = processValidator.validate(bpmnModel);
    Assert.assertEquals(1, allErrors.size());
    Assert.assertTrue(allErrors.get(0).isWarning());
  }
 /* (non-Javadoc)
  * @see org.eclipse.bpmn2.modeler.core.validation.validators.AbstractBpmn2ElementValidator#validate(org.eclipse.bpmn2.BaseElement)
  */
 @Override
 public IStatus validate(ItemDefinition object) {
   if (ProcessValidator.isContainingProcessExecutable(object)) {
     if (isEmpty(object.getStructureRef()))
       addMissingFeatureStatus(object, "structureRef", Status.ERROR); // $NON-NLS-1$
   }
   return getResult();
 }
  @Test
  public void verifyValidation() {
    List<ValidationError> allErrors = processValidator.validate(bpmnModel);
    Assert.assertEquals(66, allErrors.size());

    String setName = ValidatorSetNames.ACTIVITI_EXECUTABLE_PROCESS; // shortening it a bit

    // isExecutable should be true
    List<ValidationError> problems =
        findErrors(allErrors, setName, Problems.PROCESS_DEFINITION_IS_NOT_EXECUTABLE, 1);
    assertProcessElementError(problems.get(0));

    // Event listeners
    problems = findErrors(allErrors, setName, Problems.EVENT_LISTENER_IMPLEMENTATION_MISSING, 1);
    assertProcessElementError(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.EVENT_LISTENER_INVALID_THROW_EVENT_TYPE, 1);
    assertProcessElementError(problems.get(0));

    // Execution listeners
    problems =
        findErrors(allErrors, setName, Problems.EXECUTION_LISTENER_IMPLEMENTATION_MISSING, 2);
    assertProcessElementError(problems.get(0));
    assertCommonProblemFieldForActivity(problems.get(1));

    // Association
    problems = findErrors(allErrors, setName, Problems.ASSOCIATION_INVALID_SOURCE_REFERENCE, 1);
    assertProcessElementError(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.ASSOCIATION_INVALID_TARGET_REFERENCE, 1);
    assertProcessElementError(problems.get(0));

    // Signals
    problems = findErrors(allErrors, setName, Problems.SIGNAL_MISSING_ID, 1);
    assertCommonErrorFields(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.SIGNAL_MISSING_NAME, 2);
    assertCommonErrorFields(problems.get(0));
    assertCommonErrorFields(problems.get(1));
    problems = findErrors(allErrors, setName, Problems.SIGNAL_DUPLICATE_NAME, 2);
    assertCommonErrorFields(problems.get(0));
    assertCommonErrorFields(problems.get(1));
    problems = findErrors(allErrors, setName, Problems.SIGNAL_INVALID_SCOPE, 1);
    assertCommonErrorFields(problems.get(0));

    // Start event
    problems = findErrors(allErrors, setName, Problems.START_EVENT_MULTIPLE_FOUND, 3);
    assertCommonProblemFieldForActivity(problems.get(0));
    assertCommonProblemFieldForActivity(problems.get(1));
    assertCommonProblemFieldForActivity(problems.get(2));
    problems = findErrors(allErrors, setName, Problems.START_EVENT_INVALID_EVENT_DEFINITION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Sequence flow
    problems = findErrors(allErrors, setName, Problems.SEQ_FLOW_INVALID_SRC, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.SEQ_FLOW_INVALID_TARGET, 2);
    assertCommonProblemFieldForActivity(problems.get(0));

    // User task
    problems =
        findErrors(allErrors, setName, Problems.USER_TASK_LISTENER_IMPLEMENTATION_MISSING, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Service task
    problems =
        findErrors(allErrors, setName, Problems.SERVICE_TASK_RESULT_VAR_NAME_WITH_DELEGATE, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.SERVICE_TASK_INVALID_TYPE, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.SERVICE_TASK_MISSING_IMPLEMENTATION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems =
        findErrors(allErrors, setName, Problems.SERVICE_TASK_WEBSERVICE_INVALID_OPERATION_REF, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Send task
    problems = findErrors(allErrors, setName, Problems.SEND_TASK_INVALID_IMPLEMENTATION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.SEND_TASK_INVALID_TYPE, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems =
        findErrors(allErrors, setName, Problems.SEND_TASK_WEBSERVICE_INVALID_OPERATION_REF, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Mail task
    problems = findErrors(allErrors, setName, Problems.MAIL_TASK_NO_RECIPIENT, 2);
    assertCommonProblemFieldForActivity(problems.get(0));
    assertCommonProblemFieldForActivity(problems.get(1));
    problems = findErrors(allErrors, setName, Problems.MAIL_TASK_NO_CONTENT, 4);
    assertCommonProblemFieldForActivity(problems.get(0));
    assertCommonProblemFieldForActivity(problems.get(1));

    // Shell task
    problems = findErrors(allErrors, setName, Problems.SHELL_TASK_NO_COMMAND, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Script task
    problems = findErrors(allErrors, setName, Problems.SCRIPT_TASK_MISSING_SCRIPT, 2);
    assertCommonProblemFieldForActivity(problems.get(0));
    assertCommonProblemFieldForActivity(problems.get(1));

    // Exclusive gateway
    problems =
        findErrors(
            allErrors,
            setName,
            Problems.EXCLUSIVE_GATEWAY_CONDITION_NOT_ALLOWED_ON_SINGLE_SEQ_FLOW,
            1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems =
        findErrors(allErrors, setName, Problems.EXCLUSIVE_GATEWAY_CONDITION_ON_DEFAULT_SEQ_FLOW, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.EXCLUSIVE_GATEWAY_NO_OUTGOING_SEQ_FLOW, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems =
        findErrors(allErrors, setName, Problems.EXCLUSIVE_GATEWAY_SEQ_FLOW_WITHOUT_CONDITIONS, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Event gateway
    problems =
        findErrors(
            allErrors, setName, Problems.EVENT_GATEWAY_ONLY_CONNECTED_TO_INTERMEDIATE_EVENTS, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Subprocesses
    problems = findErrors(allErrors, setName, Problems.SUBPROCESS_MULTIPLE_START_EVENTS, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems =
        findErrors(
            allErrors, setName, Problems.SUBPROCESS_START_EVENT_EVENT_DEFINITION_NOT_ALLOWED, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Event subprocesses
    problems =
        findErrors(allErrors, setName, Problems.EVENT_SUBPROCESS_INVALID_START_EVENT_DEFINITION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Boundary events
    problems = findErrors(allErrors, setName, Problems.BOUNDARY_EVENT_NO_EVENT_DEFINITION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems =
        findErrors(allErrors, setName, Problems.BOUNDARY_EVENT_CANCEL_ONLY_ON_TRANSACTION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems =
        findErrors(allErrors, setName, Problems.BOUNDARY_EVENT_MULTIPLE_CANCEL_ON_TRANSACTION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Intermediate catch event
    problems =
        findErrors(allErrors, setName, Problems.INTERMEDIATE_CATCH_EVENT_NO_EVENTDEFINITION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems =
        findErrors(
            allErrors, setName, Problems.INTERMEDIATE_CATCH_EVENT_INVALID_EVENTDEFINITION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Intermediate throw event
    problems = findErrors(allErrors, setName, Problems.THROW_EVENT_INVALID_EVENTDEFINITION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Multi instance
    problems = findErrors(allErrors, setName, Problems.MULTI_INSTANCE_MISSING_COLLECTION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Message events
    problems = findErrors(allErrors, setName, Problems.MESSAGE_EVENT_MISSING_MESSAGE_REF, 2);
    assertCommonProblemFieldForActivity(problems.get(0));
    assertCommonProblemFieldForActivity(problems.get(1));

    // Signal events
    problems = findErrors(allErrors, setName, Problems.SIGNAL_EVENT_MISSING_SIGNAL_REF, 1);
    assertCommonProblemFieldForActivity(problems.get(0));
    problems = findErrors(allErrors, setName, Problems.SIGNAL_EVENT_INVALID_SIGNAL_REF, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Compensate event
    problems = findErrors(allErrors, setName, Problems.COMPENSATE_EVENT_INVALID_ACTIVITY_REF, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Timer event
    problems = findErrors(allErrors, setName, Problems.EVENT_TIMER_MISSING_CONFIGURATION, 2);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Data association
    problems = findErrors(allErrors, setName, Problems.DATA_ASSOCIATION_MISSING_TARGETREF, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Data object
    problems = findErrors(allErrors, setName, Problems.DATA_OBJECT_MISSING_NAME, 2);
    assertCommonErrorFields(problems.get(0));
    assertCommonErrorFields(problems.get(1));

    // End event
    problems = findErrors(allErrors, setName, Problems.END_EVENT_CANCEL_ONLY_INSIDE_TRANSACTION, 1);
    assertCommonProblemFieldForActivity(problems.get(0));

    // Messages
    problems = findErrors(allErrors, setName, Problems.MESSAGE_INVALID_ITEM_REF, 1);
    assertCommonErrorFields(problems.get(0));
  }