/**
   * Test of the registration and use of the {@link TestingTokenListener}.
   *
   * @throws IllegalStarteventException test fails
   * @throws ExtensionNotAvailableException test fails
   * @throws DefinitionNotFoundException test fails
   * @throws DefinitionNotActivatedException test fails
   */
  @Test
  public void testTokenListenerIntegrationInNavigatorForBpmnToken()
      throws IllegalStarteventException, ExtensionNotAvailableException,
          DefinitionNotFoundException, DefinitionNotActivatedException {

    //
    // get ExtensionService
    //
    TestingListenerExtensionService listenerService =
        this.extensionService.getServiceExtension(
            TestingListenerExtensionService.class,
            TestingListenerExtensionService.DEMO_EXTENSION_SERVICE_NAME);

    Assert.assertNotNull(listenerService);

    //
    // create a demo process
    //
    BpmnProcessDefinitionBuilder builder = BpmnProcessDefinitionBuilder.newBuilder();

    Node startNode = BpmnNodeFactory.createBpmnStartEventNode(builder);

    int[] ints = {1, 1};
    Node forkNode1 =
        BpmnCustomNodeFactory.createBpmnAddNumbersAndStoreNode(builder, "result", ints);

    int[] anotherInts = {2, 2};
    Node forkNode2 =
        BpmnCustomNodeFactory.createBpmnAddNumbersAndStoreNode(builder, "result2", anotherInts);

    Node endNode1 = BpmnNodeFactory.createBpmnEndEventNode(builder);
    Node endNode2 = BpmnNodeFactory.createBpmnEndEventNode(builder);

    ControlFlowFactory.createControlFlowFromTo(builder, startNode, forkNode1);
    ControlFlowFactory.createControlFlowFromTo(builder, startNode, forkNode2);
    ControlFlowFactory.createControlFlowFromTo(builder, forkNode1, endNode1);
    ControlFlowFactory.createControlFlowFromTo(builder, forkNode2, endNode2);

    BpmnProcessDefinitionModifier.decorateWithDefaultBpmnInstantiationPattern(builder);
    ProcessDefinition definition = builder.buildDefinition();

    RepositoryService repository = this.jodaEngineServices.getRepositoryService();
    Navigator navigator = this.jodaEngineServices.getNavigatorService();

    //
    // deploy the instance
    //
    repository.addProcessDefinition(definition);
    repository.activateProcessDefinition(definition.getID());

    //
    // start it
    //
    navigator.startProcessInstance(definition.getID());

    //
    // tests the registering of the listener (proper invocation is tested elsewhere)
    //
    Assert.assertTrue(listenerService.hasBeenRegistered(TestingTokenListener.class));
  }
  /**
   * Test of the registration and use of the {@link TestingBpmnXmlParseListener}.
   *
   * @throws ExtensionNotAvailableException test fails
   */
  @Test
  public void testDeploymentListenerRegistrationInRepository()
      throws ExtensionNotAvailableException {

    TestingListenerExtensionService listenerService =
        this.extensionService.getServiceExtension(
            TestingListenerExtensionService.class,
            TestingListenerExtensionService.DEMO_EXTENSION_SERVICE_NAME);

    Assert.assertNotNull(listenerService);

    Assert.assertTrue(listenerService.hasBeenRegistered(TestingRepositoryDeploymentListener.class));

    RepositoryService repository = this.jodaEngineServices.getRepositoryService();
    repository.deployInNewScope(repository.getDeploymentBuilder().buildDeployment());
    Assert.assertTrue(listenerService.hasBeenInvoked(TestingRepositoryDeploymentListener.class));
  }
  /**
   * Test the proper registration of {@link AbstractDarHandler} within our {@link DarImporter}.
   *
   * @throws IllegalAccessException test fails
   * @throws ExtensionNotAvailableException test fails
   */
  @Test
  public void testRegisteringOfDarHandler()
      throws IllegalAccessException, ExtensionNotAvailableException {

    TestingListenerExtensionService listenerService =
        this.extensionService.getServiceExtension(
            TestingListenerExtensionService.class,
            TestingListenerExtensionService.DEMO_EXTENSION_SERVICE_NAME);

    Assert.assertNotNull(listenerService);

    DarImporter importer = this.jodaEngineServices.getRepositoryService().getNewDarImporter();
    File darFile = new File(DAR_RESOURCE_PATH + "deployment/testDefinitionOnly.dar");

    //
    // we need to process the dar for the handler to be invoked
    //
    importer.importDarFile(darFile);

    Assert.assertTrue(listenerService.hasBeenRegistered(TestingDarHandler.class));
    Assert.assertTrue(listenerService.hasBeenInvoked(TestingDarHandler.class));
  }