com.wdeanmedical.portal.persistence.AppDAO.java Source code

Java tutorial

Introduction

Here is the source code for com.wdeanmedical.portal.persistence.AppDAO.java

Source

/*
 * WDean Medical is distributed under the
 * GNU Lesser General Public License (GNU LGPL).
 * For details see: http://www.wdeanmedical.com
 * copyright 2013-2014 WDean Medical
 */

package com.wdeanmedical.portal.persistence;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import com.wdeanmedical.portal.entity.Ethnicity;
import com.wdeanmedical.portal.entity.Race;
import com.wdeanmedical.portal.entity.MaritalStatus;
import com.wdeanmedical.portal.entity.Gender;
import com.wdeanmedical.portal.entity.USState;
import com.wdeanmedical.portal.core.Core;
import com.wdeanmedical.portal.entity.Appointment;
import com.wdeanmedical.portal.entity.BaseEntity;
import com.wdeanmedical.portal.entity.Clinician;
import com.wdeanmedical.portal.entity.Credentials;
import com.wdeanmedical.portal.entity.Demographics;
import com.wdeanmedical.portal.entity.Patient;
import com.wdeanmedical.portal.entity.PatientAllergen;
import com.wdeanmedical.portal.entity.PatientClinician;
import com.wdeanmedical.portal.entity.PatientDMData;
import com.wdeanmedical.portal.entity.PatientHealthIssue;
import com.wdeanmedical.portal.entity.PatientHealthTrendReport;
import com.wdeanmedical.portal.entity.PatientImmunization;
import com.wdeanmedical.portal.entity.PatientLetter;
import com.wdeanmedical.portal.entity.PatientLipids;
import com.wdeanmedical.portal.entity.PatientMedicalProcedure;
import com.wdeanmedical.portal.entity.PatientMedicalTest;
import com.wdeanmedical.portal.entity.PatientMedicalTestComponent;
import com.wdeanmedical.portal.entity.PatientMedication;
import com.wdeanmedical.portal.entity.PatientMessage;
import com.wdeanmedical.portal.entity.PatientMessageType;
import com.wdeanmedical.portal.entity.PatientSession;
import com.wdeanmedical.portal.entity.PatientStatus;
import com.wdeanmedical.portal.entity.VitalSigns;
import com.wdeanmedical.portal.util.OneWayPasswordEncoder;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public class AppDAO extends SiteDAO {

    private static final Logger log = Logger.getLogger(AppDAO.class);

    private SessionFactory sessionFactory;

    public AppDAO() {
        super();
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    protected Session getSession() {
        return this.sessionFactory.getCurrentSession();
    }

    public void create(BaseEntity item) throws Exception {
        this.createEntity(item);
    }

    public void update(BaseEntity item) throws Exception {
        this.updateEntity(item);
    }

    public void delete(BaseEntity item) throws Exception {
        this.deleteEntity(item);
    }

    public List<PatientAllergen> getPatientAllergens(Patient patient) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientAllergen.class);
        crit.add(Restrictions.eq("patient", patient));
        List<PatientAllergen> list = crit.list();
        return list;
    }

    public List<PatientMedication> getPatientMedications(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientMedication.class);
        crit.add(Restrictions.eq("patientId", patientId));
        List<PatientMedication> list = crit.list();
        return list;
    }

    public List<PatientImmunization> getPatientImmunizations(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientImmunization.class);
        crit.add(Restrictions.eq("patientId", patientId));
        List<PatientImmunization> list = crit.list();
        return list;
    }

    public List<PatientHealthIssue> getPatientHealthIssues(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientHealthIssue.class);
        crit.add(Restrictions.eq("patientId", patientId));
        List<PatientHealthIssue> list = crit.list();
        return list;
    }

    public List<PatientMedicalTest> getPatientMedicalTests(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientMedicalTest.class);
        crit.add(Restrictions.eq("patientId", patientId));
        List<PatientMedicalTest> list = crit.list();
        return list;
    }

    public List<PatientMedicalProcedure> getPatientMedicalProcedures(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientMedicalProcedure.class);
        crit.add(Restrictions.eq("patientId", patientId));
        List<PatientMedicalProcedure> list = crit.list();
        return list;
    }

    public List<PatientHealthTrendReport> getPatientHealthTrendReports(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientHealthTrendReport.class);
        crit.add(Restrictions.eq("patientId", patientId));
        List<PatientHealthTrendReport> list = crit.list();
        return list;
    }

    public List<PatientLetter> getPatientLetters(Patient patient) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientLetter.class);
        crit.add(Restrictions.eq("patient", patient));
        List<PatientLetter> list = crit.list();
        return list;
    }

    public List<PatientMessage> getPatientMessages(Patient patient, Boolean fromClinician) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientMessage.class);
        crit.add(Restrictions.eq("patient", patient));
        crit.add(Restrictions.eq("fromClinician", fromClinician));
        List<PatientMessage> list = crit.list();
        return list;
    }

    public List<Appointment> getAppointments(Patient patient, boolean isPast) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(Appointment.class);
        crit.add(Restrictions.eq("patient", patient));
        if (isPast) {
            crit.add(Restrictions.lt("startTime", new Date()));
        } else {
            crit.add(Restrictions.ge("startTime", new Date()));
        }
        List<Appointment> list = crit.list();
        return list;
    }

    public List<VitalSigns> getPatientVitalSigns(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(VitalSigns.class);
        crit.add(Restrictions.eq("patientId", patientId));
        crit.addOrder(Order.desc("date"));
        List<VitalSigns> list = crit.list();
        return list;
    }

    public List<PatientDMData> getPatientDMData(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientDMData.class);
        crit.add(Restrictions.eq("patientId", patientId));
        crit.addOrder(Order.desc("date"));
        List<PatientDMData> list = crit.list();
        return list;
    }

    public List<PatientLipids> getPatientLipids(Integer patientId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientLipids.class);
        crit.add(Restrictions.eq("patientId", patientId));
        crit.addOrder(Order.desc("date"));
        List<PatientLipids> list = crit.list();
        return list;
    }

    public Patient findPatientById(int id) throws Exception {
        return (Patient) this.findById(Patient.class, id);
    }

    public Patient findPatientByEmail(String email) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(Credentials.class);
        crit.add(Restrictions.eq("email", email));
        Credentials cred = (Credentials) crit.uniqueResult();
        crit = session.createCriteria(Patient.class);
        crit.add(Restrictions.eq("cred", cred));
        Patient patient = (Patient) crit.uniqueResult();
        return patient;
    }

    public Boolean checkEmail(String email) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(Credentials.class);
        crit.add(Restrictions.eq("email", email));
        Credentials cred = (Credentials) crit.uniqueResult();
        return (cred == null);
    }

    public PatientMessageType findPatientMessageTypeById(int id) throws Exception {
        return (PatientMessageType) this.findById(PatientMessageType.class, id);
    }

    public PatientMedicalTest findPatientMessageTestById(int id) throws Exception {
        return (PatientMedicalTest) this.findById(PatientMedicalTest.class, id);
    }

    public List<PatientMedicalTestComponent> findPatientMedicalTestComponentByTestId(int id) throws Exception {
        PatientMedicalTest patientMedicalTest = findPatientMessageTestById(id);
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientMedicalTestComponent.class);
        crit.add(Expression.eq("patientMedicalTest", patientMedicalTest));
        List<PatientMedicalTestComponent> list = crit.list();
        return list;
    }

    public PatientMessage findPatientMessageById(int id) throws Exception {
        PatientMessage patientMessage = (PatientMessage) this.findById(PatientMessage.class, id);
        if (patientMessage.getFromClinician() == true) {
            patientMessage.setReadByRecipient(true);
            update(patientMessage);
        }
        return patientMessage;
    }

    public PatientLetter findPatientLetterById(int id, int patientId) throws Exception {
        PatientLetter patientLetter = (PatientLetter) this.findById(PatientLetter.class, id);
        patientLetter.setReadByRecipient(true);
        update(patientLetter);
        return patientLetter;
    }

    public Clinician findClinicianById(int id) throws Exception {
        return (Clinician) this.findById(Clinician.class, id);
    }

    public Patient findPatientBySessionId(String sessionId) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientSession.class);
        crit.add(Restrictions.eq("sessionId", sessionId));
        PatientSession patientSession = (PatientSession) crit.uniqueResult();
        return (Patient) this.findById(Patient.class, patientSession.getPatient().getId());
    }

    public void deletePatientSession(String sessionId) {
        Session session = this.getSession();
        String hql = "delete from PatientSession ps where ps.sessionId = :sessionId";
        Query query = session.createQuery(hql);
        query.setParameter("sessionId", sessionId);
        query.executeUpdate();
    }

    public void deleteExpiredPatientSessions() throws Exception {
        Session session = getSession();
        Calendar timeoutThreshold = Calendar.getInstance();
        timeoutThreshold.add(Calendar.MINUTE, 0 - Core.sessionTimeout);
        Date expireTime = timeoutThreshold.getTime();
        String hql = "delete from PatientSession ps where ps.lastAccessTime < :expireTime";
        Query query = session.createQuery(hql);
        query.setParameter("expireTime", expireTime);
        query.executeUpdate();
    }

    public Patient authenticatePatient(String username, String password) throws Exception {
        log.info("testing username: " + username);
        Patient patient = findPatientByUsername(username);
        if (patient == null) {
            patient = new Patient();
            Credentials cred = new Credentials();
            cred.setAuthStatus(Patient.STATUS_NOT_FOUND);
            patient.setCred(cred);
            return patient;
        }
        String encodedPassword = OneWayPasswordEncoder.getInstance().encode(password, patient.getCred().getSalt());

        Session session = this.getSession();
        Criteria crit = session.createCriteria(Credentials.class);
        crit.add(Expression.eq("username", username));
        crit.add(Expression.eq("password", encodedPassword));
        Credentials cred = (Credentials) crit.uniqueResult();
        crit = session.createCriteria(Patient.class);
        crit.add(Expression.eq("cred", cred));
        patient = (Patient) crit.uniqueResult();
        if (patient != null) {
            patient.getCred().setAuthStatus(Patient.STATUS_AUTHORIZED);
            if (patient.getCred().getStatus().getId() == PatientStatus.INACTIVE) {
                patient.getCred().setAuthStatus(Patient.STATUS_INACTIVE);
            } else {
                DateFormat df = new SimpleDateFormat("EEE, MMM d, yyyy h:mm a");
                cred = patient.getCred();
                cred.setPreviousLoginTime(patient.getCred().getLastLoginTime() != null
                        ? df.format(patient.getCred().getLastLoginTime().getTime())
                        : "");
                cred.setLastLoginTime(new Date());
                cred.setSessionId(UUID.randomUUID().toString());
                update(cred);
            }
        } else {
            patient = new Patient();
            cred = new Credentials();
            cred.setAuthStatus(Patient.STATUS_INVALID_PASSWORD);
            patient.setCred(cred);
        }
        return patient;
    }

    public Patient authenticatePatientViaActivationCode(String activationCode) throws Exception {
        Patient patient = findPatientByActivationCode(activationCode);
        if (patient == null) {
            patient = new Patient();
            Credentials cred = new Credentials();
            cred.setAuthStatus(Patient.STATUS_NOT_FOUND);
            patient.setCred(cred);
            return patient;
        } else {
            patient.getCred().setAuthStatus(Patient.STATUS_AUTHORIZED);
            if (patient.getCred().getStatus().getId() == PatientStatus.INACTIVE) {
                patient.getCred().setAuthStatus(Patient.STATUS_INACTIVE);
            } else {
                DateFormat df = new SimpleDateFormat("EEE, MMM d, yyyy h:mm a");
                Credentials cred = patient.getCred();
                cred.setPreviousLoginTime(patient.getCred().getLastLoginTime() != null
                        ? df.format(patient.getCred().getLastLoginTime().getTime())
                        : "");
                cred.setLastLoginTime(new Date());
                cred.setSessionId(UUID.randomUUID().toString());
                update(cred);
            }
        }
        return patient;
    }

    public Patient findPatientByUsername(String username) throws Exception {
        Session session = this.getSession();
        Patient patient = null;
        Criteria crit = session.createCriteria(Credentials.class);
        crit.add(Expression.eq("username", username));
        Credentials cred = (Credentials) crit.uniqueResult();
        crit = session.createCriteria(Patient.class);
        crit.add(Expression.eq("cred", cred));
        patient = (Patient) crit.uniqueResult();
        return patient;
    }

    public Patient findPatientByActivationCode(String code) throws Exception {
        Session session = this.getSession();
        Patient patient = null;
        Criteria crit = session.createCriteria(Credentials.class);
        crit.add(Expression.eq("activationCode", code));
        Credentials cred = (Credentials) crit.uniqueResult();
        crit = session.createCriteria(Patient.class);
        crit.add(Expression.eq("cred", cred));
        patient = (Patient) crit.uniqueResult();
        return patient;
    }

    public PatientSession findPatientSessionBySessionId(String sessionId) throws Exception {
        Session session = this.getSession();
        PatientSession item = null;
        Criteria crit = session.createCriteria(PatientSession.class);
        crit.add(Expression.eq("sessionId", sessionId));
        item = (PatientSession) crit.uniqueResult();
        return item;
    }

    public List<PatientClinician> getPatientClinicians(Patient patient) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(PatientClinician.class);
        crit.add(Restrictions.eq("patient", patient));
        List<PatientClinician> list = crit.list();
        return list;
    }

    public List<USState> getUSStates() throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(USState.class);
        crit.addOrder(Order.asc("name"));
        List<USState> list = crit.list();
        return list;
    }

    public Gender findGenderByCode(String code) throws Exception {
        Session session = getSession();
        Criteria crit = session.createCriteria(Gender.class);
        crit.add(Restrictions.eq("code", code));
        return (Gender) crit.uniqueResult();
    }

    public Race findRaceById(Integer id) throws Exception {
        return (Race) this.findById(Race.class, id);
    }

    public Credentials findCredentialsById(Integer id) throws Exception {
        return (Credentials) this.findById(Credentials.class, id);
    }

    public MaritalStatus findMaritalStatusById(Integer id) throws Exception {
        return (MaritalStatus) this.findById(MaritalStatus.class, id);
    }

    public Ethnicity findEthnicityById(Integer id) throws Exception {
        return (Ethnicity) this.findById(Ethnicity.class, id);
    }

    public USState findUSStateById(int id) throws Exception {
        return (USState) this.findById(USState.class, id);
    }

    public void updateCredentials(Credentials credValues, boolean updatePassword, boolean updateEmail)
            throws Exception {
        Credentials cred = findCredentialsById(credValues.getId());
        if (updateEmail) {
            cred.setEmail(credValues.getEmail());
            cred.setUsername(credValues.getEmail());
        }
        if (updatePassword) {
            cred.setPassword(credValues.getPassword());
            cred.setSalt(credValues.getSalt());
        }
        cred.setFirstName(credValues.getFirstName());
        cred.setMiddleName(credValues.getMiddleName());
        cred.setLastName(credValues.getLastName());
        cred.setActivationCode("");

        Session session = this.getSession();
        session.update(cred);
    }

    public void updatePatientProfileImage(Patient patient, String path) throws Exception {
        Session session = this.getSession();
        Demographics demo = patient.getDemo();
        demo.setProfileImagePath(path);
        session.update(demo);
    }

    public List<Appointment> getAllAppointments() throws Exception {
        return this.findAll(Appointment.class);
    }

    public List<Appointment> getAllAppointmentsByPatient(Patient patient) throws Exception {
        Session session = this.getSession();
        Criteria crit = session.createCriteria(Appointment.class);
        crit.add(Restrictions.eq("patient", patient));
        List<Appointment> list = crit.list();
        return list;
    }

    public Appointment findAppointmentById(int id) throws Exception {
        return (Appointment) this.findById(Appointment.class, id);
    }

}