@Override
  public void reportHeuristic(String participantId, HeuristicType heuristicType) {
    final ParticipantInformation participantInformation =
        ParticipantsContainer.getInstance().getParticipantInformation(participantId);

    switch (heuristicType) {
      case HEURISTIC_ROLLBACK:
        participantInformation.setStatus(TxStatus.TransactionHeuristicRollback.name());
        break;

      case HEURISTIC_COMMIT:
        participantInformation.setStatus(TxStatus.TransactionHeuristicCommit.name());
        break;

      case HEURISTIC_HAZARD:
        participantInformation.setStatus(TxStatus.TransactionHeuristicHazard.name());
        break;

      case HEURISTIC_MIXED:
        participantInformation.setStatus(TxStatus.TransactionHeuristicMixed.name());
        break;

      default:
        throw new IllegalArgumentException("Unknown heuristic type");
    }

    RecoveryManager.getInstance().persistParticipantInformation(participantInformation);
  }
  @Override
  public String enlist(
      final String applicationId,
      final String participantEnlistmentURL,
      final Participant participant) {
    if (baseUrl == null) {
      throw new IllegalStateException("Base URL was not defined.");
    }

    final String participantId = new Uid().toString();
    final String participantUrl = getParticipantUrl(participantId, baseUrl);

    String participantRecoveryURL = enlistParticipant(participantUrl, participantEnlistmentURL);

    ParticipantInformation participantInformation =
        new ParticipantInformation(
            participantId, applicationId, participantRecoveryURL, participant);
    participantInformation.setStatus(TxStatus.TransactionActive.name());

    ParticipantsContainer.getInstance()
        .addParticipantInformation(participantId, participantInformation);

    return participantId;
  }