/* * PatientView * * Copyright (c) Worth Solutions Limited 2004-2013 * * This file is part of PatientView. * * PatientView is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with PatientView in a file * titled COPYING. If not, see <http://www.gnu.org/licenses/>. * * @package PatientView * @link http://www.patientview.org * @author PatientView <info@patientview.org> * @copyright Copyright (c) 2004-2013, Worth Solutions Limited * @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0 */ package org.patientview.radar.dao.impl; import org.patientview.radar.dao.TransplantDao; import org.patientview.radar.model.Transplant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.simple.SimpleJdbcInsert; import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; public class TransplantDaoImpl extends BaseDaoImpl implements TransplantDao { private static final Logger LOGGER = LoggerFactory.getLogger(TransplantDaoImpl.class); private SimpleJdbcInsert transplantInsert; private SimpleJdbcInsert rejectDataInsert; @Override public void setDataSource(DataSource dataSource) { // Call super super.setDataSource(dataSource); // Initialise a simple JDBC insert to be able to get the allocated ID transplantInsert = new SimpleJdbcInsert(dataSource).withTableName("tbl_transplant") .usingGeneratedKeyColumns("trID").usingColumns("RADAR_NO", "DATE_TRANSPLANT", "TRANS_TYPE", "TRANSPLANT_COUNTER", "DATE_NEPHRECT", "TRANS_RECURR", "DATE_RECURR_TXK", "DATE_TX_REJECT", "DATE_BX_TXK"); rejectDataInsert = new SimpleJdbcInsert(dataSource).withTableName("tbl_transplant_reject") .usingGeneratedKeyColumns("recID").usingColumns("trID", "trRejectDate", "trBiopsyDate", "trFailureDate"); } public void saveTransplant(final Transplant transplant) { Map<String, Object> transplantMap = new HashMap<String, Object>() { { put("RADAR_NO", transplant.getRadarNumber()); put("DATE_TRANSPLANT", transplant.getDate()); put("TRANS_TYPE", transplant.getModality() != null ? transplant.getModality().getId() : null); put("TRANSPLANT_COUNTER", transplant.getCounter()); put("DATE_NEPHRECT", null); put("TRANS_RECURR", transplant.getRecurr()); put("DATE_RECURR_TXK", transplant.getDateRecurr()); put("DATE_TX_REJECT", transplant.getDateRejected()); put("DATE_BX_TXK", transplant.getDateBiopsy()); } }; if (transplant.hasValidId()) { transplantMap.put("trID", transplant.getId()); namedParameterJdbcTemplate.update("UPDATE tbl_transplant " + "SET RADAR_NO = :RADAR_NO, " + "DATE_TRANSPLANT = :DATE_TRANSPLANT, " + "TRANS_TYPE = :TRANS_TYPE, " + "TRANSPLANT_COUNTER = :TRANSPLANT_COUNTER, " + "DATE_NEPHRECT = :DATE_NEPHRECT, " + "TRANS_RECURR = :TRANS_RECURR, " + "DATE_RECURR_TXK = :DATE_RECURR_TXK, " + "DATE_TX_REJECT = :DATE_TX_REJECT, " + "DATE_BX_TXK = :DATE_BX_TXK" + " WHERE trID = :trID;", transplantMap); } else { Number id = transplantInsert.executeAndReturnKey(transplantMap); transplant.setId(id.longValue()); } Transplant.RejectData rejectData = transplant.getDateFailureRejectData(); if (rejectData.getFailureDate() != null) { rejectData.setTransplantId(transplant.getId()); saveRejectData(rejectData); } } public void deleteTransplant(Transplant transplant) { Map<String, Object> transplantTreatmentMap = new HashMap<String, Object>(); transplantTreatmentMap.put("trID", transplant.getId()); namedParameterJdbcTemplate.update("DELETE FROM tbl_transplant " + "WHERE trID = :trID;", transplantTreatmentMap); } public Transplant getTransplant(long id) { try { return jdbcTemplate.queryForObject("SELECT * FROM tbl_Transplant WHERE trID = ?", new Object[]{id}, new TransplantRowMapper()); } catch (EmptyResultDataAccessException e) { LOGGER.debug("No transplant found for ID {}", id); return null; } } public List<Transplant> getTransplantsByRadarNumber(long radarNumber) { return jdbcTemplate.query("SELECT * FROM tbl_Transplant WHERE radar_no = ?", new Object[]{radarNumber}, new TransplantRowMapper()); } public List<Transplant.Modality> getTransplantModalitites() { return jdbcTemplate.query("SELECT * FROM tbl_transplant_modality", new TransplantModalityRowMapper()); } public Transplant.Modality getTransplantModality(long id) { try { return jdbcTemplate.queryForObject("SELECT * FROM tbl_transplant_modality WHERE trID = ?", new Object[]{id}, new TransplantModalityRowMapper()); } catch (EmptyResultDataAccessException e) { return null; } } public void saveRejectData(final Transplant.RejectData rejectData) { Map<String, Object> rejectDataMap = new HashMap<String, Object>() { { put("trID", rejectData.getTransplantId()); put("trRejectDate", rejectData.getRejectedDate()); put("trBiopsyDate", rejectData.getBiopsyDate()); put("trFailureDate", rejectData.getFailureDate()); } }; if (rejectData.hasValidId()) { rejectDataMap.put("recID", rejectData.getId()); namedParameterJdbcTemplate.update("UPDATE tbl_transplant_reject " + "SET trID = :trID, " + "trRejectDate = :trRejectDate, " + "trBiopsyDate = :trBiopsyDate, " + "trFailureDate = :trFailureDate " + " WHERE recID = :recID;", rejectDataMap); } else { Number id = rejectDataInsert.executeAndReturnKey(rejectDataMap); rejectData.setId(id.longValue()); } } public void deleteRejectData(Transplant.RejectData rejectData) { Map<String, Object> rejectDataMap = new HashMap<String, Object>(); rejectDataMap.put("recID", rejectData.getId()); namedParameterJdbcTemplate.update("DELETE FROM tbl_transplant_reject " + "WHERE recID = :recID;", rejectDataMap); } public List<Transplant.RejectData> getRejectDataByTransplantNumber(Long transplantId) { return jdbcTemplate.query("SELECT * FROM tbl_transplant_reject WHERE trID = ? AND trFailureDate IS NULL", new Object[]{transplantId}, new TransplantRejectRowMapper()); } public Transplant.RejectData getRejectData(Long id) { try { return jdbcTemplate.queryForObject("SELECT * FROM tbl_transplant_reject WHERE recID = ?", new Object[]{id}, new TransplantRejectRowMapper()); } catch (EmptyResultDataAccessException e) { return null; } } private Transplant.RejectData getFailureDateRejectDataByTransplantNumber(Long transplantId) { try { return jdbcTemplate.queryForObject("SELECT * FROM tbl_transplant_reject WHERE trID = ? AND " + "trFailureDate IS NOT NULL", new Object[]{transplantId}, new TransplantRejectRowMapper()); } catch (EmptyResultDataAccessException e) { return null; } } private class TransplantRowMapper implements RowMapper<Transplant> { public Transplant mapRow(ResultSet resultSet, int i) throws SQLException { // Construct transplant object and set fields Transplant transplant = new Transplant(); // IDs transplant.setId(resultSet.getLong("trID")); transplant.setRadarNumber(resultSet.getLong("RADAR_NO")); transplant.setDate(resultSet.getDate("DATE_TRANSPLANT")); long transpantId = resultSet.getLong("TRANS_TYPE"); transplant.setModality(getTransplantModality(transpantId)); transplant.setCounter(resultSet.getInt("TRANSPLANT_COUNTER")); // Recurr stuff and dates transplant.setRecurr(resultSet.getBoolean("TRANS_RECURR")); transplant.setDateRecurr(resultSet.getDate("DATE_RECURR_TXK")); transplant.setDateRejected(resultSet.getDate("DATE_TX_REJECT")); transplant.setDateBiopsy(resultSet.getDate("DATE_BX_TXK")); Transplant.RejectData failureDateRejectData = getFailureDateRejectDataByTransplantNumber( transplant.getId()); if (failureDateRejectData == null) { failureDateRejectData = new Transplant.RejectData(); failureDateRejectData.setTransplantId(transplant.getId()); } transplant.setDateFailureRejectData(failureDateRejectData); return transplant; } } private class TransplantModalityRowMapper implements RowMapper<Transplant.Modality> { public Transplant.Modality mapRow(ResultSet resultSet, int i) throws SQLException { // Construct an object and set the fields Transplant.Modality modality = new Transplant.Modality(); modality.setId(resultSet.getLong("trID")); modality.setDescription(resultSet.getString("trDesc")); return modality; } } private class TransplantRejectRowMapper implements RowMapper<Transplant.RejectData> { public Transplant.RejectData mapRow(ResultSet resultSet, int i) throws SQLException { Transplant.RejectData rejectData = new Transplant.RejectData(); rejectData.setId(resultSet.getLong("recID")); rejectData.setTransplantId(resultSet.getLong("trID")); rejectData.setRejectedDate(resultSet.getDate("trRejectDate")); rejectData.setBiopsyDate(resultSet.getDate("trBiopsyDate")); rejectData.setFailureDate(resultSet.getDate("trFailureDate")); return rejectData; } } }