gov.nih.nci.cabig.caaers.service.migrator.adverseevent.AdverseEventConverter.java Source code

Java tutorial

Introduction

Here is the source code for gov.nih.nci.cabig.caaers.service.migrator.adverseevent.AdverseEventConverter.java

Source

/*******************************************************************************
 * Copyright SemanticBits, Northwestern University and Akaza Research
 * 
 * Distributed under the OSI-approved BSD 3-Clause License.
 * See http://ncip.github.com/caaers/LICENSE.txt for details.
 ******************************************************************************/
package gov.nih.nci.cabig.caaers.service.migrator.adverseevent;

import gov.nih.nci.cabig.caaers.CaaersSystemException;
import gov.nih.nci.cabig.caaers.dao.CtcTermDao;
import gov.nih.nci.cabig.caaers.dao.meddra.LowLevelTermDao;
import gov.nih.nci.cabig.caaers.domain.AdverseEvent;
import gov.nih.nci.cabig.caaers.domain.AdverseEventCtcTerm;
import gov.nih.nci.cabig.caaers.domain.AdverseEventMeddraLowLevelTerm;
import gov.nih.nci.cabig.caaers.domain.AeTerminology;
import gov.nih.nci.cabig.caaers.domain.Attribution;
import gov.nih.nci.cabig.caaers.domain.Ctc;
import gov.nih.nci.cabig.caaers.domain.CtcGrade;
import gov.nih.nci.cabig.caaers.domain.CtcTerm;
import gov.nih.nci.cabig.caaers.domain.ExternalAdverseEvent;
import gov.nih.nci.cabig.caaers.domain.Grade;
import gov.nih.nci.cabig.caaers.domain.Hospitalization;
import gov.nih.nci.cabig.caaers.domain.Outcome;
import gov.nih.nci.cabig.caaers.domain.TimeValue;
import gov.nih.nci.cabig.caaers.domain.meddra.LowLevelTerm;
import gov.nih.nci.cabig.caaers.integration.schema.adverseevent.AdverseEventMeddraLowLevelTermType;
import gov.nih.nci.cabig.caaers.integration.schema.adverseevent.AdverseEventType;
import gov.nih.nci.cabig.caaers.integration.schema.adverseevent.HospitalizationType;
import gov.nih.nci.cabig.caaers.integration.schema.adverseevent.OutcomeType;
import gov.nih.nci.cabig.caaers.utils.DateUtils;

import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

import org.apache.commons.lang.StringUtils;
import org.springframework.context.MessageSource;

public class AdverseEventConverter {
    private CtcTermDao ctcTermDao = null;
    private LowLevelTermDao lowLevelTermDao = null;
    private MessageSource messageSource;

    public AdverseEvent convert(AdverseEventType adverseEventDto) {
        AdverseEvent adverseEvent = new AdverseEvent();
        if (adverseEventDto.getVerbatim() != null) {
            adverseEvent.setDetailsForOther(adverseEventDto.getVerbatim());
        }
        adverseEvent.setExternalId(adverseEventDto.getExternalId());
        populateHospitalization(adverseEventDto, adverseEvent);
        populateGrade(adverseEventDto, adverseEvent);
        adverseEvent.setExpected(adverseEventDto.isExpected());
        populateAttributionSummary(adverseEventDto, adverseEvent);
        adverseEvent.setComments(adverseEventDto.getComments());
        adverseEvent.setReporterEmail(adverseEventDto.getReporterEmail());

        if (adverseEventDto.getStartDate() != null)
            adverseEvent.setStartDate(adverseEventDto.getStartDate().toGregorianCalendar().getTime());
        if (adverseEventDto.getEndDate() != null)
            adverseEvent.setEndDate(adverseEventDto.getEndDate().toGregorianCalendar().getTime());

        if (adverseEventDto.getDateFirstLearned() != null) {
            // Convert the timezone Server timezone but user can  send it any timezone.
            TimeZone timeZone = TimeZone.getDefault();
            adverseEventDto.getDateFirstLearned().toGregorianCalendar().setTimeZone(timeZone);
            adverseEvent.setGradedDate(adverseEventDto.getDateFirstLearned().toGregorianCalendar().getTime());
        }

        if (adverseEventDto.getAdverseEventCtepTerm() != null) {
            adverseEvent.setOtherSpecify(adverseEventDto.getAdverseEventCtepTerm().getOtherSpecify());
        }

        if (adverseEventDto.getAdverseEventCtepTerm() != null
                && adverseEventDto.getAdverseEventCtepTerm().getCtepCode() != null) {
            AdverseEventCtcTerm ctcTerm = new AdverseEventCtcTerm();
            adverseEvent.setAdverseEventCtcTerm(ctcTerm);
            ctcTerm.setCtcTerm(new CtcTerm());
            ctcTerm.getCtcTerm().setCtepCode(adverseEventDto.getAdverseEventCtepTerm().getCtepCode());
            ctcTerm.getCtcTerm()
                    .setOtherRequired(adverseEventDto.getAdverseEventCtepTerm().getOtherSpecify() != null);
            if (adverseEventDto.getAdverseEventCtepTerm().getOtherMeddra() != null) {
                LowLevelTerm lowLevelTerm = new LowLevelTerm();
                lowLevelTerm
                        .setMeddraCode(adverseEventDto.getAdverseEventCtepTerm().getOtherMeddra().getMeddraCode());
                //  lowLevelTerm.setMeddraTerm(adverseEventDto.getAdverseEventCtepTerm().getOtherMeddra().getMeddraTerm());
                adverseEvent.setMeddraTerm(lowLevelTerm);
                adverseEvent.setLowLevelTerm(lowLevelTerm);
            }
        }

        if (adverseEventDto.getAdverseEventMeddraLowLevelTerm() != null
                && adverseEventDto.getAdverseEventMeddraLowLevelTerm().getMeddraCode() != null) {
            LowLevelTerm lowLevelTerm = new LowLevelTerm();
            lowLevelTerm.setMeddraCode(adverseEventDto.getAdverseEventMeddraLowLevelTerm().getMeddraCode());
            //  lowLevelTerm.setMeddraTerm(adverseEventDto.getAdverseEventMeddraLowLevelTerm().getMeddraTerm());
            AdverseEventMeddraLowLevelTerm aeMeddraLowLevelTerm = new AdverseEventMeddraLowLevelTerm();
            aeMeddraLowLevelTerm.setTerm(lowLevelTerm);
            adverseEvent.setAdverseEventMeddraLowLevelTerm(aeMeddraLowLevelTerm);
        }

        if (adverseEventDto.getEventApproximateTime() != null) {
            TimeValue tv = new TimeValue();
            tv.setHour(adverseEventDto.getEventApproximateTime().getHour().intValue());
            tv.setMinute(adverseEventDto.getEventApproximateTime().getMinute().intValue());
            if (adverseEventDto.getEventApproximateTime().getAmpm().equals("AM")) {
                tv.setType(0);
            } else {
                tv.setType(1);
            }
            adverseEvent.setEventApproximateTime(tv);
        }

        if (adverseEventDto.getEventLocation() != null) {
            adverseEvent.setEventLocation(adverseEventDto.getEventLocation());
        }

        if (adverseEventDto.getOutcome() != null) {
            populateOutcomes(adverseEventDto, adverseEvent);
        }

        if (adverseEventDto.getHospitalization() != null
                && adverseEventDto.getHospitalization().equals(HospitalizationType.YES)) {

            Outcome hOutcome = new Outcome();
            hOutcome.setOutcomeType(gov.nih.nci.cabig.caaers.domain.OutcomeType.HOSPITALIZATION);
            adverseEvent.addOutComeIfNecessary(hOutcome);

        }

        if (adverseEventDto.isIncreasedRisk() != null) {
            adverseEvent.setParticipantAtRisk(adverseEventDto.isIncreasedRisk());
        }

        populateOutcomes(adverseEventDto, adverseEvent);

        return adverseEvent;
    }

    public void convertAdverseEventDtoToAdverseEventDomain(AdverseEventType adverseEventDto,
            AdverseEvent adverseEvent, AeTerminology terminology, Date startDateOfFirstCourse, String operation)
            throws CaaersSystemException {
        if (adverseEvent == null) {
            adverseEvent = new AdverseEvent();
        }

        try {
            if (adverseEventDto.getVerbatim() != null) {
                adverseEvent.setDetailsForOther(adverseEventDto.getVerbatim());
            }
            adverseEvent.setExternalId(adverseEventDto.getExternalId());
            populateGrade(adverseEventDto, adverseEvent);
            populateHospitalization(adverseEventDto, adverseEvent);
            adverseEvent.setExpected(adverseEventDto.isExpected());

            populateAttributionSummary(adverseEventDto, adverseEvent);
            adverseEvent.setComments(adverseEventDto.getComments());

            Date today = new Date();

            if (adverseEventDto.getStartDate() != null) {
                adverseEvent.setStartDate(adverseEventDto.getStartDate().toGregorianCalendar().getTime());
                //start date cannot be in future.
                if (DateUtils.compareDate(today, adverseEvent.getStartDate()) < 0) {
                    throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_031",
                            new String[] { adverseEventDto.getStartDate() + "" }, "", Locale.getDefault()));
                }
                //start date cannot be earlier than start date of the course.
                if (startDateOfFirstCourse != null
                        && (DateUtils.compareDate(adverseEvent.getStartDate(), startDateOfFirstCourse) < 0)) {
                    throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_059",
                            new String[] { adverseEventDto.getStartDate() + "", startDateOfFirstCourse + "" }, "",
                            Locale.getDefault()));
                }
            }
            if (adverseEventDto.getEndDate() != null) {
                adverseEvent.setEndDate(adverseEventDto.getEndDate().toGregorianCalendar().getTime());
                //end date cannot be in future
                if (DateUtils.compareDate(today, adverseEvent.getEndDate()) < 0) {
                    throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_031",
                            new String[] { adverseEventDto.getEndDate() + "" }, "", Locale.getDefault()));
                }
                //end date cannot be earlier than start date.
                if (adverseEvent.getStartDate() != null
                        && (DateUtils.compareDate(adverseEvent.getEndDate(), adverseEvent.getStartDate()) < 0)) {
                    throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_075",
                            new String[] { adverseEventDto.getEndDate() + "" }, "", Locale.getDefault()));
                }
            }

            if (adverseEventDto.getDateFirstLearned() != null) {
                adverseEvent.setGradedDate(adverseEventDto.getDateFirstLearned().toGregorianCalendar().getTime());
                //awareness date cannot be in future.
                if (DateUtils.compareDate(today, adverseEvent.getGradedDate()) < 0) {
                    throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_031",
                            new String[] { adverseEventDto.getDateFirstLearned() + "" }, "", Locale.getDefault()));
                }

                if (adverseEvent.getStartDate() != null
                        && DateUtils.compareDate(adverseEvent.getStartDate(), adverseEvent.getGradedDate()) < 0) {
                    throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_073",
                            new String[] { adverseEventDto.getDateFirstLearned().toString() },
                            "Awareness date should not be after Start date", Locale.getDefault()));
                }

                if (adverseEvent.getEndDate() != null
                        && DateUtils.compareDate(adverseEvent.getEndDate(), adverseEvent.getGradedDate()) < 0) {
                    throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_074",
                            new String[] { adverseEventDto.getDateFirstLearned().toString() },
                            "Awareness date should not be after End date", Locale.getDefault()));
                }
            }

            if (terminology.getCtcVersion() != null && adverseEventDto.getAdverseEventCtepTerm() != null
                    && adverseEventDto.getAdverseEventCtepTerm().getCtepCode() != null) {
                populateCtcTerm(adverseEventDto, adverseEvent, terminology.getCtcVersion());
            }

            if (terminology.getMeddraVersion() != null
                    && adverseEventDto.getAdverseEventMeddraLowLevelTerm() != null) {
                populateLowLevelTerm(adverseEventDto.getAdverseEventMeddraLowLevelTerm(), adverseEvent);
            }

            if (adverseEventDto.getEventApproximateTime() != null) {
                TimeValue tv = new TimeValue();
                tv.setHour(adverseEventDto.getEventApproximateTime().getHour().intValue());
                tv.setMinute(adverseEventDto.getEventApproximateTime().getMinute().intValue());
                if (adverseEventDto.getEventApproximateTime().getAmpm().equals("AM")) {
                    tv.setType(0);
                } else {
                    tv.setType(1);
                }
                adverseEvent.setEventApproximateTime(tv);
            }

            if (adverseEventDto.getEventLocation() != null) {
                adverseEvent.setEventLocation(adverseEventDto.getEventLocation());
            }
            if (adverseEventDto.getOutcome() != null) {
                populateOutcomes(adverseEventDto, adverseEvent);
            }

            if (adverseEventDto.isIncreasedRisk() != null) {
                adverseEvent.setParticipantAtRisk(adverseEventDto.isIncreasedRisk());
            }

        } catch (Exception e) {
            throw new CaaersSystemException(e);
        }
    }

    public void convertAdverseEventDtoToExternalAdverseEventDTO(AdverseEventType adverseEventDto,
            ExternalAdverseEvent adverseEvent, AeTerminology terminology, Date startDateOfFirstCourse)
            throws CaaersSystemException {
        if (adverseEvent == null) {
            throw new IllegalArgumentException("adverse event cannot be null");
        }

        try {
            // populate verbatim
            String verbatim = adverseEventDto.getVerbatim();
            if (verbatim != null) {
                // Remove the spaces which is causing CAAERS-6077             
                verbatim = verbatim.trim();
            }
            adverseEvent.setVerbatim(verbatim);

            // populate attribution
            if (adverseEventDto.getAttributionSummary() != null) {
                Attribution attribution = Attribution.valueOf(adverseEventDto.getAttributionSummary().name());
                adverseEvent.setAttribution(attribution.getDisplayName());
            }

            // populate howSerious
            StringBuilder howSeriousSb = new StringBuilder();

            for (OutcomeType xmlOutcome : adverseEventDto.getOutcome()) {
                String xmlOc = xmlOutcome.getOutComeEnumType().name();
                gov.nih.nci.cabig.caaers.domain.OutcomeType oct = gov.nih.nci.cabig.caaers.domain.OutcomeType
                        .valueOf(xmlOc);
                howSeriousSb.append(oct.getShortName()).append(",");
            }
            String howSerious = howSeriousSb.toString();

            if (StringUtils.isNotEmpty(howSerious)) {
                //remove the last char ','
                howSerious = howSerious.substring(0, howSerious.length() - 1);
                adverseEvent.setHowSerious(howSerious);
            }

            // populate grade
            Grade grade = Grade.getByCode(adverseEventDto.getGrade());
            adverseEvent.setGrade(grade);

            // populate start date
            if (adverseEventDto.getStartDate() != null) {
                adverseEvent.setStartDate(adverseEventDto.getStartDate().toGregorianCalendar().getTime());
            }

            // populate end date
            if (adverseEventDto.getEndDate() != null) {
                adverseEvent.setEndDate(adverseEventDto.getEndDate().toGregorianCalendar().getTime());
            }

            // populate adverse event term, code and other value

            if (terminology.getCtcVersion() != null && adverseEventDto.getAdverseEventCtepTerm() != null
                    && adverseEventDto.getAdverseEventCtepTerm().getCtepCode() != null) {
                adverseEvent.setAdverseEventTermCode(adverseEventDto.getAdverseEventCtepTerm().getCtepCode());
                if (adverseEventDto.getAdverseEventCtepTerm().getOtherMeddra() != null) {
                    adverseEvent.setAdverseEventTermOtherValue(
                            adverseEventDto.getAdverseEventCtepTerm().getOtherMeddra().getMeddraCode());
                } else if (adverseEventDto.getAdverseEventCtepTerm().getOtherSpecify() != null) {
                    adverseEvent.setOtherSpecify(adverseEventDto.getAdverseEventCtepTerm().getOtherSpecify());
                }
            }

            adverseEvent.setExternalId(adverseEventDto.getExternalId());

        } catch (Exception e) {
            throw new CaaersSystemException(e);
        }
    }

    private void populateGrade(AdverseEventType adverseEventDto, AdverseEvent adverseEvent) {
        if (adverseEventDto.getGrade() != null) {
            Grade grade = Grade.getByCode(adverseEventDto.getGrade());
            adverseEvent.setGrade(grade);
        } else {
            adverseEvent.setGrade(null);
        }
    }

    private void populateHospitalization(AdverseEventType adverseEventDto, AdverseEvent adverseEvent) {
        if (adverseEventDto.getHospitalization() != null) {
            Hospitalization hospitalization = Hospitalization.valueOf(adverseEventDto.getHospitalization().name());
            adverseEvent.setHospitalization(hospitalization);
        }

    }

    private void populateAttributionSummary(AdverseEventType adverseEventDto, AdverseEvent adverseEvent) {
        if (adverseEventDto.getAttributionSummary() != null) {
            Attribution attributionSummary = Attribution.valueOf(adverseEventDto.getAttributionSummary().name());
            adverseEvent.setAttributionSummary(attributionSummary);
        }
    }

    private LowLevelTerm getLowLevelTerm(String code) {
        LowLevelTerm lowLevelTerm = null;
        List<LowLevelTerm> lowLevelTerms = lowLevelTermDao.getByMeddraCode(code);
        lowLevelTerm = lowLevelTerms.isEmpty() ? null : lowLevelTerms.get(0);
        return lowLevelTerm;
    }

    private void populateLowLevelTerm(AdverseEventMeddraLowLevelTermType adverseEventMeddraLowLevelTermType,
            AdverseEvent adverseEvent) {
        if (adverseEventMeddraLowLevelTermType != null) {
            AdverseEventMeddraLowLevelTermType xmlLowLevelTerm = adverseEventMeddraLowLevelTermType;

            LowLevelTerm lowLevelTerm = getLowLevelTerm(xmlLowLevelTerm.getMeddraCode());
            if (lowLevelTerm == null) {
                throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_021",
                        new String[] { xmlLowLevelTerm.getMeddraCode().toString() }, "", Locale.getDefault()));
            }
            //for update, lowlevelterm already exists
            AdverseEventMeddraLowLevelTerm adverseEventMeddraLowLevelTerm = adverseEvent
                    .getAdverseEventMeddraLowLevelTerm();
            if (adverseEventMeddraLowLevelTerm == null) {
                adverseEventMeddraLowLevelTerm = new AdverseEventMeddraLowLevelTerm();
            }

            adverseEventMeddraLowLevelTerm.setLowLevelTerm(lowLevelTerm);
            adverseEventMeddraLowLevelTerm.setAdverseEvent(adverseEvent);
            adverseEvent.setAdverseEventMeddraLowLevelTerm(adverseEventMeddraLowLevelTerm);
        }
    }

    private void populateCtcTerm(AdverseEventType adverseEventDto, AdverseEvent adverseEvent, Ctc ctc)
            throws CaaersSystemException {
        if (adverseEventDto.getAdverseEventCtepTerm() != null
                && adverseEventDto.getAdverseEventCtepTerm().getCtepCode() != null) {
            //CtcTerm ctcTerm = ctcTermDao.getCtcTerm(new String[]{adverseEventDto.getCtepCode()});//getByCtepCodeandVersion(adverseEventDto.getAdverseEventCtcTerm().getCtepCode(), adverseEventDto.getAdverseEventCtcTerm().getCtcVersion());
            CtcTerm ctcTerm = ctcTermDao
                    .getByCtepCodeandVersion(adverseEventDto.getAdverseEventCtepTerm().getCtepCode(), ctc);

            if (ctcTerm == null) {
                throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_020",
                        new String[] { adverseEventDto.getAdverseEventCtepTerm().getCtepCode() }, "",
                        Locale.getDefault()));
            }
            if (ctcTerm.isOtherRequired()) {
                if (adverseEventDto.getAdverseEventCtepTerm().getOtherMeddra() != null) {
                    LowLevelTerm lowLevelTerm = getLowLevelTerm(
                            adverseEventDto.getAdverseEventCtepTerm().getOtherMeddra().getMeddraCode());
                    if (lowLevelTerm == null) {
                        throw new CaaersSystemException(
                                messageSource.getMessage(
                                        "WS_AEMS_021", new String[] { adverseEventDto.getAdverseEventCtepTerm()
                                                .getOtherMeddra().getMeddraCode().toString() },
                                        "", Locale.getDefault()));

                    }
                    adverseEvent.setLowLevelTerm(lowLevelTerm);
                } else {
                    throw new CaaersSystemException(
                            messageSource.getMessage("WS_AEMS_022", new String[] {}, "", Locale.getDefault()));
                }
            } else {
                if (adverseEventDto.getAdverseEventCtepTerm().getOtherMeddra() != null) {
                    throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_023",
                            new String[] { adverseEventDto.getAdverseEventCtepTerm().getCtepCode() }, "",
                            Locale.getDefault()));
                }
            }
            List<CtcGrade> ctcGrades = ctcTerm.getContextualGrades();
            boolean gradeAllowed = false;
            for (CtcGrade ctcGrade : ctcGrades) {
                if (ctcGrade.getGrade().getCode() == adverseEventDto.getGrade()) {
                    gradeAllowed = true;
                    break;
                }
            }
            if (!gradeAllowed) {
                throw new CaaersSystemException(messageSource.getMessage("WS_AEMS_030",
                        new String[] { adverseEventDto.getGrade() + "",
                                adverseEventDto.getAdverseEventCtepTerm().getCtepCode() },
                        "", Locale.getDefault()));
            }
            //for update AECtcTerm already exists
            AdverseEventCtcTerm adverseEventCtcTerm = (AdverseEventCtcTerm) adverseEvent.getAdverseEventTerm();
            if (adverseEventCtcTerm == null) {
                adverseEventCtcTerm = new AdverseEventCtcTerm();
            }
            adverseEventCtcTerm.setCtcTerm(ctcTerm);
            adverseEventCtcTerm.setAdverseEvent(adverseEvent);
            adverseEvent.setAdverseEventTerm(adverseEventCtcTerm);

        }
    }

    public void populateOutcomes(AdverseEventType adverseEventDto, AdverseEvent adverseEvent) {
        for (OutcomeType xmlOutcome : adverseEventDto.getOutcome()) {
            String xmlOutcomeTypeName = xmlOutcome.getOutComeEnumType().name();

            Outcome outcome = new Outcome();
            outcome.setOutcomeType(gov.nih.nci.cabig.caaers.domain.OutcomeType.valueOf(xmlOutcomeTypeName));
            if (outcome.getOutcomeType() == gov.nih.nci.cabig.caaers.domain.OutcomeType.OTHER_SERIOUS) {
                outcome.setOther(xmlOutcome.getOther());
                if ("NONE".equalsIgnoreCase(outcome.getOther())) {
                    outcome.setOther(null);
                }
            }
            adverseEvent.addOutComeIfNecessary(outcome);
        }
    }

    public void setCtcTermDao(CtcTermDao ctcTermDao) {
        this.ctcTermDao = ctcTermDao;
    }

    public void setLowLevelTermDao(LowLevelTermDao lowLevelTermDao) {
        this.lowLevelTermDao = lowLevelTermDao;
    }

    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

}