private void makeSale(final PaymentMode mode) throws JMSException {
    final SaleTO saleTO = this.createSaleTO();

    //
    // Request the store inventory system to account for the sale.
    // This uses JMS so that the notification can be asynchronous
    // and the message persisted.
    //
    this.sendAccountSaleEvent(saleTO);

    //
    // Notify cash desk components that sale has been successful.
    //
    this.sendSaleSuccessEvent();

    //
    // Notify the coordinator about the sale, providing basic statistics.
    //
    this.sendSaleRegisteredEvent(saleTO.getProductTOs().size(), mode);
  }
 private SaleTO createSaleTO() {
   final SaleTO saleTO = new SaleTO();
   saleTO.setDate(new Date());
   saleTO.setProductTOs(this.saleProducts);
   return saleTO;
 }