us.mn.state.health.lims.common.provider.query.PatientSearchProvider.java Source code

Java tutorial

Introduction

Here is the source code for us.mn.state.health.lims.common.provider.query.PatientSearchProvider.java

Source

/**
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations under
 * the License.
 *
 * The Original Code is OpenELIS code.
 *
 * Copyright (C) The Minnesota Department of Health.  All Rights Reserved.
 *
 * Contributor(s): CIRG, University of Washington, Seattle WA.
 */
package us.mn.state.health.lims.common.provider.query;

import org.apache.commons.validator.GenericValidator;
import us.mn.state.health.lims.common.action.IActionConstants;
import us.mn.state.health.lims.common.provider.query.workerObjects.PatientSearchLocalAndClinicWorker;
import us.mn.state.health.lims.common.provider.query.workerObjects.PatientSearchLocalWorker;
import us.mn.state.health.lims.common.provider.query.workerObjects.PatientSearchWorker;
import us.mn.state.health.lims.common.services.ObservationHistoryService;
import us.mn.state.health.lims.common.services.ObservationHistoryService.ObservationType;
import us.mn.state.health.lims.common.services.PatientService;
import us.mn.state.health.lims.common.servlet.validation.AjaxServlet;
import us.mn.state.health.lims.common.util.ConfigurationProperties;
import us.mn.state.health.lims.common.util.ConfigurationProperties.Property;
import us.mn.state.health.lims.login.valueholder.UserSessionData;
import us.mn.state.health.lims.patient.valueholder.Patient;
import us.mn.state.health.lims.sample.dao.SampleDAO;
import us.mn.state.health.lims.sample.daoimpl.SampleDAOImpl;
import us.mn.state.health.lims.sample.valueholder.Sample;
import us.mn.state.health.lims.samplehuman.dao.SampleHumanDAO;
import us.mn.state.health.lims.samplehuman.daoimpl.SampleHumanDAOImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;

public class PatientSearchProvider extends BaseQueryProvider {

    protected AjaxServlet ajaxServlet = null;

    @Override
    public void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String lastName = request.getParameter("lastName");
        String firstName = request.getParameter("firstName");
        String STNumber = request.getParameter("STNumber");
        // N.B. This is a bad name, it is other than STnumber
        String subjectNumber = request.getParameter("subjectNumber");
        String nationalID = request.getParameter("nationalID");
        String labNumber = request.getParameter("labNumber");
        String guid = request.getParameter("guid");
        String suppressExternalSearch = request.getParameter("suppressExternalSearch");
        String patientID = null;

        String result = VALID;
        StringBuilder xml = new StringBuilder();
        // If we have a lab number then the patient is in the system and we just
        // have to get the patient and format the xml
        if (!GenericValidator.isBlankOrNull(labNumber)) {
            Patient patient = getPatientForLabNumber(labNumber);
            if (patient == null || GenericValidator.isBlankOrNull(patient.getId())) {
                result = IActionConstants.INVALID;
                xml.append("No results were found for search.  Check spelling or remove some of the fields");
            } else {
                PatientSearchResults searchResults = getSearchResultsForPatient(patient);
                PatientSearchWorker localWorker = new PatientSearchLocalWorker();
                localWorker.appendSearchResultRow(searchResults, xml);
            }
        } else {

            PatientSearchWorker worker = getAppropriateWorker(request, "true".equals(suppressExternalSearch));

            if (worker != null) {
                result = worker.createSearchResultXML(lastName, firstName, STNumber, subjectNumber, nationalID,
                        patientID, guid, xml);
            } else {
                result = INVALID;
                xml.append("System is not configured correctly for searching for patients. Contact Administrator");
            }
        }
        ajaxServlet.sendData(xml.toString(), result, request, response);

    }

    private PatientSearchResults getSearchResultsForPatient(Patient patient) {
        PatientService service = new PatientService(patient);

        return new PatientSearchResults(BigDecimal.valueOf(Long.parseLong(patient.getId())), service.getFirstName(),
                service.getLastName(), service.getGender(), service.getDOB(), service.getNationalId(),
                patient.getExternalId(), service.getSTNumber(), service.getSubjectNumber(), service.getGUID(),
                ObservationHistoryService.getMostRecentValueForPatient(ObservationType.REFERRERS_PATIENT_ID,
                        service.getPatientId()));
    }

    private Patient getPatientForLabNumber(String labNumber) {

        SampleDAO sampleDAO = new SampleDAOImpl();
        Sample sample = sampleDAO.getSampleByAccessionNumber(labNumber);

        if (sample != null && !GenericValidator.isBlankOrNull(sample.getId())) {
            SampleHumanDAO sampleHumanDAO = new SampleHumanDAOImpl();
            return sampleHumanDAO.getPatientForSample(sample);
        }

        return new Patient();
    }

    private PatientSearchWorker getAppropriateWorker(HttpServletRequest request, boolean suppressExternalSearch) {

        if (ConfigurationProperties.getInstance().isCaseInsensitivePropertyValueEqual(
                Property.UseExternalPatientInfo, "false") || suppressExternalSearch) {
            return new PatientSearchLocalWorker();
        } else {
            UserSessionData usd = (UserSessionData) request.getSession().getAttribute(USER_SESSION_DATA);

            return new PatientSearchLocalAndClinicWorker(String.valueOf(usd.getSystemUserId()));
        }
    }

    @Override
    public void setServlet(AjaxServlet as) {
        this.ajaxServlet = as;
    }

    @Override
    public AjaxServlet getServlet() {
        return this.ajaxServlet;
    }

}