@Override
 public List<PaymentTransactionModelDao> getPaymentTransactionsByExternalKey(
     final String transactionExternalKey, final InternalTenantContext context) {
   final List<PaymentTransactionModelDao> result = new ArrayList<PaymentTransactionModelDao>();
   synchronized (this) {
     for (PaymentTransactionModelDao cur : transactions.values()) {
       if (cur.getTransactionExternalKey().equals(transactionExternalKey)) {
         result.add(cur);
       }
     }
   }
   return result;
 }
 @Override
 public int failOldPendingTransactions(
     final TransactionStatus newTransactionStatus,
     final DateTime createdBeforeDate,
     final InternalCallContext context) {
   int result = 0;
   synchronized (transactions) {
     for (PaymentTransactionModelDao cur : transactions.values()) {
       cur.setTransactionStatus(newTransactionStatus);
       result++;
     }
   }
   return result;
 }
 @Override
 public PaymentTransactionModelDao updatePaymentWithNewTransaction(
     final UUID paymentId,
     final PaymentTransactionModelDao paymentTransaction,
     final InternalCallContext context) {
   synchronized (this) {
     transactions.put(paymentTransaction.getId(), paymentTransaction);
   }
   return paymentTransaction;
 }
 @Override
 public PaymentModelDao insertPaymentWithFirstTransaction(
     final PaymentModelDao payment,
     final PaymentTransactionModelDao paymentTransaction,
     final InternalCallContext context) {
   synchronized (this) {
     payments.put(payment.getId(), payment);
     transactions.put(paymentTransaction.getId(), paymentTransaction);
   }
   return payment;
 }
 @Override
 public void updatePaymentAndTransactionOnCompletion(
     final UUID accountId,
     final UUID paymentId,
     final TransactionType transactionType,
     final String currentPaymentStateName,
     final String lastSuccessPaymentStateName,
     final UUID transactionId,
     final TransactionStatus paymentStatus,
     final BigDecimal processedAmount,
     final Currency processedCurrency,
     final String gatewayErrorCode,
     final String gatewayErrorMsg,
     final InternalCallContext context) {
   synchronized (this) {
     final PaymentModelDao payment = payments.get(paymentId);
     if (payment != null) {
       payment.setStateName(currentPaymentStateName);
     }
     final PaymentTransactionModelDao transaction = transactions.get(transactionId);
     if (transaction != null) {
       transaction.setTransactionStatus(paymentStatus);
       transaction.setProcessedAmount(processedAmount);
       transaction.setProcessedCurrency(processedCurrency);
       transaction.setGatewayErrorCode(gatewayErrorCode);
       transaction.setGatewayErrorMsg(gatewayErrorMsg);
     }
   }
 }