@Override
  public void doExecute(TestContext context) {
    boolean success = true;

    testSuiteListener.onFinish();

    log.info("Executing " + actions.size() + " actions after suite");
    log.info("");

    for (TestAction action : actions) {
      try {
        /* Executing test action and validate its success */
        action.execute(context);
      } catch (Exception e) {
        log.error("After suite action failed " + action.getName() + "Nested exception is: ", e);
        log.error("Continue after suite actions");
        success = false;
      }
    }

    if (success) {
      testSuiteListener.onFinishSuccess();
    } else {
      testSuiteListener.onFinishFailure(new CitrusRuntimeException("Error in after suite"));
      throw new CitrusRuntimeException("Error in after suite");
    }
  }
 public void run() {
   if (afterSuite != null) {
     try {
       afterSuite.execute(context);
     } catch (Exception e) {
       throw new CitrusRuntimeException("After suite failed with errors", e);
     }
   } else {
     testSuiteListener.onFinish();
     testSuiteListener.onFinishSuccess();
   }
 }
  /**
   * @see
   *     org.springframework.test.context.support.AbstractTestExecutionListener#prepareTestInstance(org.springframework.test.context.TestContext)
   */
  @Override
  public void prepareTestInstance(TestContext testContext) throws Exception {
    synchronized (doneMonitor) {
      if (done) {
        return;
      } else {
        TestSuiteAwareExecutionListener.preparationDone();
      }

      ApplicationContext ctx = testContext.getApplicationContext();

      SequenceBeforeSuite beforeSuite = null;
      if (ctx.getBeansOfType(SequenceBeforeSuite.class).size() == 1) {
        beforeSuite = ctx.getBean(SequenceBeforeSuite.class);
      }

      SequenceAfterSuite afterSuite = null;
      if (ctx.getBeansOfType(SequenceAfterSuite.class).size() == 1) {
        afterSuite = ctx.getBean(SequenceAfterSuite.class);
      }

      com.consol.citrus.context.TestContext context =
          ctx.getBean(com.consol.citrus.context.TestContext.class);
      TestSuiteListeners testSuiteListener = ctx.getBean(TestSuiteListeners.class);

      if (beforeSuite != null) {
        try {
          beforeSuite.execute(context);
        } catch (Exception e) {
          throw new CitrusRuntimeException("Before suite failed with errors", e);
        }
      } else {
        testSuiteListener.onStart();
        testSuiteListener.onStartSuccess();
      }

      Runtime.getRuntime()
          .addShutdownHook(
              new Thread(new AfterSuiteShutdownHook(afterSuite, context, testSuiteListener)));
    }
  }