Package rewards.internal.reward

Source Code of rewards.internal.reward.JdbcRewardRepository

package rewards.internal.reward;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import rewards.AccountContribution;
import rewards.Dining;
import rewards.RewardConfirmation;

import common.datetime.SimpleDate;

/**
* JDBC implementation of a reward repository that records the result of a reward transaction by inserting a reward
* confirmation record.
*/
@Repository
public class JdbcRewardRepository implements RewardRepository {

  @Autowired
  private DataSource dataSource;

  public RewardConfirmation confirmReward(AccountContribution contribution, Dining dining) {
    String sql = "insert into T_REWARD (CONFIRMATION_NUMBER, REWARD_AMOUNT, REWARD_DATE, ACCOUNT_NUMBER, DINING_MERCHANT_NUMBER, DINING_DATE, DINING_AMOUNT) values (?, ?, ?, ?, ?, ?, ?)";
    Connection conn = null;
    PreparedStatement ps = null;
    try {
      conn = dataSource.getConnection();
      ps = conn.prepareStatement(sql);
      String confirmationNumber = nextConfirmationNumber();
      ps.setString(1, confirmationNumber);
      ps.setBigDecimal(2, contribution.getAmount().asBigDecimal());
      ps.setDate(3, new Date(SimpleDate.today().inMilliseconds()));
      ps.setString(4, contribution.getAccountNumber());
      ps.setString(5, dining.getMerchantNumber());
      ps.setDate(6, new Date(dining.getDate().inMilliseconds()));
      ps.setBigDecimal(7, dining.getAmount().asBigDecimal());
      ps.execute();
      return new RewardConfirmation(confirmationNumber, contribution);
    } catch (SQLException e) {
      throw new RuntimeException("SQL exception occured inserting reward record", e);
    } finally {
      if (ps != null) {
        try {
          // Close to prevent database cursor exhaustion
          ps.close();
        } catch (SQLException ex) {
        }
      }
      if (conn != null) {
        try {
          // Close to prevent database connection exhaustion
          conn.close();
        } catch (SQLException ex) {
        }
      }
    }
  }

  private String nextConfirmationNumber() {
    String sql = "select next value for S_REWARD_CONFIRMATION_NUMBER from DUAL_REWARD_CONFIRMATION_NUMBER";
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      conn = dataSource.getConnection();
      ps = conn.prepareStatement(sql);
      rs = ps.executeQuery();
      rs.next();
      return rs.getString(1);
    } catch (SQLException e) {
      throw new RuntimeException("SQL exception getting next confirmation number", e);
    } finally {
      if (rs != null) {
        try {
          // Close to prevent database cursor exhaustion
          rs.close();
        } catch (SQLException ex) {
        }
      }
      if (ps != null) {
        try {
          // Close to prevent database cursor exhaustion
          ps.close();
        } catch (SQLException ex) {
        }
      }
      if (conn != null) {
        try {
          // Close to prevent database connection exhaustion
          conn.close();
        } catch (SQLException ex) {
        }
      }
    }
  }
}
TOP

Related Classes of rewards.internal.reward.JdbcRewardRepository

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.