docs: public void execute() {
  
      while (!steps.isEmpty()) {
        currentStep = steps.remove(0);
  
        try {
          LOG.debugPerformOperationStep(currentStep.getName());
  
          currentStep.performOperationStep(this);
          successfulSteps.add(currentStep);
  
          LOG.debugSuccessfullyPerformedOperationStep(currentStep.getName());
        }
        catch (Exception e) {
  
          if(isRollbackOnFailure) {
  
            try {
              rollbackOperation();
            }
            catch(Exception e2) {
              LOG.exceptionWhileRollingBackOperation(e2);
            }
            // re-throw the original exception
            throw LOG.exceptionWhilePerformingOperationStep(name, currentStep.getName(), e);
          }
  
          else {
            LOG.exceptionWhilePerformingOperationStep(currentStep.getName(), e);
          }
  
        }
      }
  
    }