org.patientview.radar.service.impl.TransplantManagerImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.patientview.radar.service.impl.TransplantManagerImpl.java

Source

/*
 * 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.service.impl;

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.patientview.model.Patient;
import org.patientview.radar.dao.TransplantDao;
import org.patientview.radar.dao.impl.TransplantDaoImpl;
import org.patientview.radar.model.Transplant;
import org.patientview.radar.model.exception.InvalidModelException;
import org.patientview.radar.service.PatientManager;
import org.patientview.radar.service.TransplantManager;
import org.patientview.radar.service.TreatmentManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class TransplantManagerImpl implements TransplantManager {

    TransplantDao transplantDao;
    PatientManager patientManager;
    private static final Logger LOGGER = LoggerFactory.getLogger(TransplantDaoImpl.class);

    public void saveTransplant(Transplant transplant) throws InvalidModelException {
        // validate transplant
        List<String> errors = new ArrayList<String>();
        List<Transplant> transplants = transplantDao.getTransplantsByRadarNumber(transplant.getRadarNumber());

        // transplant date must be greater than reccur, failure date, date reject and date biopsy
        List<Date> datesAfterStart = new ArrayList<Date>();
        datesAfterStart.addAll(
                Arrays.asList(transplant.getDateRecurr(), transplant.getDateFailureRejectData().getFailureDate()));
        List<Transplant.RejectData> rejectDataList = transplantDao
                .getRejectDataByTransplantNumber(transplant.getId());
        for (Transplant.RejectData rejectData : rejectDataList) {
            datesAfterStart.add(rejectData.getRejectedDate());
            datesAfterStart.add(rejectData.getBiopsyDate());
        }

        for (Date dateAfterStart : datesAfterStart) {
            if (dateAfterStart != null) {
                if (transplant.getDate().compareTo(dateAfterStart) >= 0) {
                    errors.add(START_DATE_ERROR);
                    break;
                }
            }
        }

        // date of failure has to be after  reccur, date reject and date biopsy
        List<Date> datesAfterEndDate = new ArrayList<Date>();
        datesAfterEndDate.add(transplant.getDateRecurr());
        for (Transplant.RejectData rejectData : rejectDataList) {
            datesAfterEndDate.add(rejectData.getRejectedDate());
            datesAfterEndDate.add(rejectData.getBiopsyDate());
        }

        Date failureDate = transplant.getDateFailureRejectData() != null
                ? transplant.getDateFailureRejectData().getFailureDate()
                : null;
        if (failureDate != null) {
            for (Date dateAfterEndDate : datesAfterEndDate) {
                if (dateAfterEndDate != null) {
                    if (failureDate.compareTo(dateAfterEndDate) <= 0) {
                        errors.add(FAILURE_DATE_ERROR);
                        break;
                    }
                }
            }
        }

        // transplant must be 14 days apart
        for (Transplant existingTransplant : transplants) {
            if (existingTransplant.getId().equals(transplant.getId())) {
                continue;
            }
            int daysApart = Math.abs(
                    Days.daysBetween(new DateTime(existingTransplant.getDate()), new DateTime(transplant.getDate()))
                            .getDays());
            if (Math.abs(daysApart) <= 14) {
                errors.add(TRANSPLANTS_INTERVAL_ERROR);
                break;
            }
        }

        // cannot add new transplant whilst previous transplant has not failed
        for (Transplant existingTransplant : transplants) {
            if (existingTransplant.getId().equals(transplant.getId())) {
                continue;
            }
            if (existingTransplant.getDateFailureRejectData() != null) {
                if (existingTransplant.getDateFailureRejectData().getFailureDate() == null) {
                    errors.add(TreatmentManager.PREVIOUS_TREATMENT_NOT_CLOSED_ERROR);
                    break;
                }
            } else {
                errors.add(TreatmentManager.PREVIOUS_TREATMENT_NOT_CLOSED_ERROR);
                break;
            }
        }

        // cannot add transplant before another failure date
        for (Transplant existingTransplant : transplants) {
            if (existingTransplant.getId().equals(transplant.getId())) {
                continue;
            }
            if (existingTransplant.getDateFailureRejectData() != null) {
                if (failureDate != null) {
                    if (failureDate.compareTo(transplant.getDate()) > 0) {
                        errors.add(BEFORE_PREVIOUS_FAILURE_DATE);
                        break;
                    }

                }
            }
        }

        List<Date> datesToCheck = Arrays.asList(transplant.getDate(), transplant.getDateRecurr(),
                transplant.getDateFailureRejectData() != null
                        ? transplant.getDateFailureRejectData().getFailureDate()
                        : null);

        // cannot be before date of birth
        Patient patient = patientManager.getPatientByRadarNumber(transplant.getRadarNumber());
        if (patient != null) {
            Date dob = patient.getDob();
            if (dob != null) {
                for (Date date : datesToCheck) {
                    if (date != null) {
                        if (dob.compareTo(date) > 0) {
                            errors.add(TreatmentManager.BEFORE_DOB_ERROR);
                            break;
                        }
                    }
                }

            }
        }

        // cannot be after today
        Date today = new Date();
        for (Date date : datesToCheck) {
            if (date != null) {
                if (today.compareTo(date) < 0) {
                    errors.add(TreatmentManager.AFTER_TODAY_ERROR);
                    break;
                }
            }
        }

        if (!errors.isEmpty()) {
            InvalidModelException exception = new InvalidModelException("Transplant model is not valid");
            exception.setErrors(errors);
            throw exception;
        }
        transplantDao.saveTransplant(transplant);
    }

    public void deleteTransplant(Transplant transplant) {
        transplantDao.deleteTransplant(transplant);
    }

    public Transplant getTransplant(long id) {
        return transplantDao.getTransplant(id);
    }

    public List<Transplant> getTransplantsByRadarNumber(long radarNumber) {
        return transplantDao.getTransplantsByRadarNumber(radarNumber);
    }

    public List<Transplant.Modality> getTransplantModalitites() {
        return transplantDao.getTransplantModalitites();
    }

    public Transplant.Modality getTransplantModality(long id) {
        return transplantDao.getTransplantModality(id);
    }

    public void saveRejectData(Transplant.RejectData rejectData) {
        transplantDao.saveRejectData(rejectData);
    }

    public void saveRejectDataWithValidation(Transplant.RejectData rejectData) throws InvalidModelException {
        List<String> errors = new ArrayList<String>();
        // validatation

        // reject dates must be after transplant start date and before failure date
        Long transplantId = rejectData.getTransplantId();
        Transplant transplant = transplantDao.getTransplant(transplantId);
        List<Date> rejectDates = Arrays.asList(rejectData.getBiopsyDate(), rejectData.getRejectedDate());

        for (Date rejectDate : rejectDates) {
            if (rejectDate != null) {
                Date startDate = transplant.getDate();
                Date failureDate = transplant.getDateFailureRejectData() != null
                        ? transplant.getDateFailureRejectData().getFailureDate()
                        : null;
                if (startDate != null) {
                    if (startDate.compareTo(rejectDate) >= 0) {
                        errors.add(TransplantManager.REJECT_DATA_ERROR_MESSAGE);
                        break;
                    }
                }
                if (failureDate != null) {
                    if (failureDate.compareTo(rejectDate) <= 0) {
                        errors.add(TransplantManager.REJECT_DATA_ERROR_MESSAGE);
                        break;
                    }
                }

            }
        }

        if (!errors.isEmpty()) {
            InvalidModelException exception = new InvalidModelException("Transplant model is not valid");
            exception.setErrors(errors);
            throw exception;
        }
        transplantDao.saveRejectData(rejectData);
    }

    public void deleteRejectData(Transplant.RejectData rejectData) {
        transplantDao.deleteRejectData(rejectData);
    }

    public List<Transplant.RejectData> getRejectDataByTransplantNumber(Long transplantNumber) {
        return transplantDao.getRejectDataByTransplantNumber(transplantNumber);
    }

    public Transplant.RejectData getRejectData(Long id) {
        return transplantDao.getRejectData(id);
    }

    public TransplantDao getTransplantDao() {
        return transplantDao;
    }

    public void setTransplantDao(TransplantDao transplantDao) {
        this.transplantDao = transplantDao;
    }

    public void setPatientManager(PatientManager patientManager) {
        this.patientManager = patientManager;
    }
}