package com.robonobo.wang.server.dao; import java.math.BigInteger; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import com.robonobo.wang.beans.DenominationPrivate; import com.robonobo.wang.beans.DenominationPublic; @Repository("denominationDao") public class DenominationDaoImpl implements DenominationDao { private static final String GET_DENOMS_SQL = "SELECT * FROM denomination"; static final String DELETE_DENOMS_SQL = "DELETE FROM denomination"; static final String INSERT_DENOM_SQL = "INSERT INTO denomination (id, denom, generator, prime, public_key, private_key) VALUES (?, ?, ?, ?, ?, ?)"; private JdbcTemplate db; private DenomPublicMapper denomPubMapper = new DenomPublicMapper(); private DenomPrivateMapper denomPrivMapper = new DenomPrivateMapper(); private Log log = LogFactory.getLog(getClass()); @Autowired public void setDataSource(DataSource dataSource) { db = new JdbcTemplate(dataSource); } @Override public List<DenominationPublic> getDenomsPublic() throws DAOException { try { return db.query(GET_DENOMS_SQL, denomPubMapper); } catch (DataAccessException e) { throw new DAOException(e); } } @Override public List<DenominationPrivate> getDenomsPrivate() throws DAOException { try { return db.query(GET_DENOMS_SQL, denomPrivMapper); } catch (DataAccessException e) { throw new DAOException(e); } } @Override public void deleteAllDenoms() throws DAOException { try { db.update(DELETE_DENOMS_SQL); } catch (DataAccessException e) { throw new DAOException(e); } } @Override public void putDenom(DenominationPrivate denom) throws DAOException { try { db.update(INSERT_DENOM_SQL, denom.getPrivateKey().hashCode(), denom.getDenom(), denom.getGenerator().toString(), denom.getPrime().toString(), denom.getPublicKey().toString(), denom.getPrivateKey().toString()); } catch (DataAccessException e) { throw new DAOException(e); } } private class DenomPublicMapper implements RowMapper<DenominationPublic> { @Override public DenominationPublic mapRow(ResultSet rs, int rowNum) throws SQLException { BigInteger gen = new BigInteger(rs.getString("generator")); BigInteger prime = new BigInteger(rs.getString("prime")); BigInteger pubKey = new BigInteger(rs.getString("public_key")); DenominationPublic result = new DenominationPublic(gen, prime, pubKey); result.setDenom(rs.getInt("denom")); return result; } } private class DenomPrivateMapper implements RowMapper<DenominationPrivate> { @Override public DenominationPrivate mapRow(ResultSet rs, int rowNum) throws SQLException { BigInteger gen = new BigInteger(rs.getString("generator")); BigInteger prime = new BigInteger(rs.getString("prime")); BigInteger pubKey = new BigInteger(rs.getString("public_key")); BigInteger priKey = new BigInteger(rs.getString("private_key")); DenominationPrivate result = new DenominationPrivate(gen, prime, pubKey, priKey); result.setDenom(rs.getInt("denom")); return result; } } }