/**
* 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.
*/
package us.mn.state.health.lims.sample.action;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;
import org.hibernate.StaleObjectStateException;
import org.hibernate.Transaction;
import us.mn.state.health.lims.analysis.dao.AnalysisDAO;
import us.mn.state.health.lims.analysis.daoimpl.AnalysisDAOImpl;
import us.mn.state.health.lims.analysis.valueholder.Analysis;
import us.mn.state.health.lims.analysisqaevent.dao.AnalysisQaEventDAO;
import us.mn.state.health.lims.analysisqaevent.daoimpl.AnalysisQaEventDAOImpl;
import us.mn.state.health.lims.analysisqaevent.valueholder.AnalysisQaEvent;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.exception.LIMSRuntimeException;
import us.mn.state.health.lims.common.log.LogEvent;
import us.mn.state.health.lims.common.provider.validation.QuickEntryAccessionNumberValidationProvider;
import us.mn.state.health.lims.common.provider.validation.QuickEntrySampleSourceValidationProvider;
import us.mn.state.health.lims.common.provider.validation.QuickEntrySampleTypeValidationProvider;
import us.mn.state.health.lims.common.services.StatusService;
import us.mn.state.health.lims.common.services.StatusService.SampleStatus;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.common.util.StringUtil;
import us.mn.state.health.lims.common.util.SystemConfiguration;
import us.mn.state.health.lims.common.util.validator.ActionError;
import us.mn.state.health.lims.hibernate.HibernateUtil;
import us.mn.state.health.lims.login.valueholder.UserSessionData;
import us.mn.state.health.lims.qaevent.dao.QaEventDAO;
import us.mn.state.health.lims.qaevent.daoimpl.QaEventDAOImpl;
import us.mn.state.health.lims.qaevent.valueholder.QaEvent;
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.sampleitem.dao.SampleItemDAO;
import us.mn.state.health.lims.sampleitem.daoimpl.SampleItemDAOImpl;
import us.mn.state.health.lims.sampleitem.valueholder.SampleItem;
import us.mn.state.health.lims.sourceofsample.dao.SourceOfSampleDAO;
import us.mn.state.health.lims.sourceofsample.daoimpl.SourceOfSampleDAOImpl;
import us.mn.state.health.lims.sourceofsample.valueholder.SourceOfSample;
import us.mn.state.health.lims.test.dao.TestDAO;
import us.mn.state.health.lims.test.daoimpl.TestDAOImpl;
import us.mn.state.health.lims.test.valueholder.Test;
import us.mn.state.health.lims.typeofsample.dao.TypeOfSampleDAO;
import us.mn.state.health.lims.typeofsample.daoimpl.TypeOfSampleDAOImpl;
import us.mn.state.health.lims.typeofsample.valueholder.TypeOfSample;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
/**
* The QuickEntryUpdateAction class represents the Update Action for the
* QuickEntry form of the application.
*
* @author - Ken Rosha 08/29/2006 02/21/2007 - bugzilla 1757: clean up overly
* complex code and fix bug with received date 08/02/2007 - bugzilla
* 1813 add batch functionality
*/
public class QuickEntryUpdateAction extends BatchSampleProcessingBaseAction {
protected ActionForward performAction(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String forward = FWD_SUCCESS;
request.setAttribute(ALLOW_EDITS_KEY, "true");
BaseActionForm dynaForm = (BaseActionForm) form;
// Perform server-side validation (validation.xml)
ActionMessages errors = dynaForm.validate(mapping, request);
try {
errors = validateAll(request, errors, dynaForm);
} catch (Exception e) {
//bugzilla 2154
LogEvent.logError("QuickEntryUpdateAction","performAction()",e.toString());
ActionError error = new ActionError("errors.ValidationException",
null, null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
if ((errors != null) && (errors.size() > 0)) {
saveErrors(request, errors);
return mapping.findForward(FWD_FAIL);
}
String accessionNumber = (String) dynaForm.get("accessionNumber");
String accessionNumber2 = (String) dynaForm.get("accessionNumber2");
String receivedDate = (String) dynaForm.get("receivedDateForDisplay");
String typeOfSample = (String) dynaForm.get("typeOfSampleDesc");
String sourceOfSample = (String) dynaForm.get("sourceOfSampleDesc");
//bugzilla 1778
String sourceOther = (String) dynaForm.get("sourceOther");
String stringOfTestIds = (String) dynaForm.get("selectedTestIds");
Sample sample = null;
List accessionNumbers = populateAccessionNumberList(accessionNumber,
accessionNumber2, null);
SampleItem sampleItem = new SampleItem();
sampleItem.setStatusId(StatusService.getInstance().getStatusID(SampleStatus.Entered));
// 1926 get sysUserId from login module
UserSessionData usd = (UserSessionData)request.getSession().getAttribute(USER_SESSION_DATA);
String sysUserId = String.valueOf(usd.getSystemUserId());
Transaction tx = HibernateUtil.getSession().beginTransaction();
try {
SampleDAO sampleDAO = new SampleDAOImpl();
SampleItemDAO sampleItemDAO = new SampleItemDAOImpl();
AnalysisDAO analysisDAO = new AnalysisDAOImpl();
TypeOfSampleDAO typeOfSampleDAO = new TypeOfSampleDAOImpl();
SourceOfSampleDAO sourceOfSampleDAO = new SourceOfSampleDAOImpl();
AnalysisQaEventDAO analysisQaEventDAO = new AnalysisQaEventDAOImpl();
QaEventDAO qaEventDAO = new QaEventDAOImpl();
for (int j = 0; j < accessionNumbers.size(); j++) {
sample = new Sample();
sample.setAccessionNumber((String) accessionNumbers.get(j));
sampleDAO.getSampleByAccessionNumber(sample);
// if we are in batch mode we need to make
// sure that the samples being updated are
// in the correct status
if (SystemConfiguration.getInstance()
.getSampleStatusLabelPrinted().equals(
sample.getStatus())) {
String[] listOfTestIds = stringOfTestIds.split(
SystemConfiguration.getInstance()
.getDefaultIdSeparator(), -1);
List analyses = new ArrayList();
for (int i = 0; i < listOfTestIds.length; i++) {
if (!StringUtil.isNullorNill(listOfTestIds[i])) {
Analysis analysis = new Analysis();
Test test = new Test();
String testId = (String) listOfTestIds[i];
test.setId(testId);
TestDAO testDAO = new TestDAOImpl();
testDAO.getData(test);
analysis.setTest(test);
// bgm - bugzilla 1495 setting analysis status here
// from
// above
analysis.setStatus(SystemConfiguration
.getInstance().getAnalysisStatusAssigned());
//bugzilla 1942
analysis.setIsReportable(test.getIsReportable());
/** TODO: need to populate this with actual data!!! */
analysis.setAnalysisType("TEST");
analyses.add(analysis);
}
}
sample.setAccessionNumber((String) accessionNumbers.get(j));
sample.setStatus(SystemConfiguration.getInstance()
.getSampleStatusQuickEntryComplete());
sample.setReceivedDateForDisplay(receivedDate);
sample.setCollectionTimeForDisplay("00:00");
// Set entered date to today's date
Date today = Calendar.getInstance().getTime();
String dateAsText = DateUtil.formatDateAsText(today);
sample.setEnteredDateForDisplay(dateAsText);
//bugzilla 2528
String newbornTypeOfSample = SystemConfiguration.getInstance().getNewbornTypeOfSample();
if ( typeOfSample.equals(newbornTypeOfSample) )
sample.setDomain(SystemConfiguration.getInstance().getNewbornDomain());
else
sample.setDomain(SystemConfiguration.getInstance().getHumanDomain());
sampleItem.setSortOrder("1");
if (!StringUtil.isNullorNill(typeOfSample)) {
TypeOfSample typeOfSamp = new TypeOfSample();
typeOfSamp.setDescription(typeOfSample);
typeOfSamp.setDomain(SystemConfiguration.getInstance()
.getHumanDomain());
typeOfSamp = typeOfSampleDAO
.getTypeOfSampleByDescriptionAndDomain(
typeOfSamp, true);
sampleItem.setTypeOfSample(typeOfSamp);
}
if (!StringUtil.isNullorNill(sourceOfSample)) {
SourceOfSample sourceOfSamp = new SourceOfSample();
sourceOfSamp.setDescription(sourceOfSample);
//bugzilla 2528
if ( typeOfSample.equals(newbornTypeOfSample) )
sourceOfSamp.setDomain(SystemConfiguration.getInstance().getNewbornDomain());
else
sourceOfSamp.setDomain(SystemConfiguration.getInstance().getHumanDomain());
String sourceOfSampleId = dynaForm.getString("sourceOfSampleId");
sourceOfSamp = sourceOfSampleDAO.getSourceOfSampleByDescriptionAndDomain(sourceOfSamp, true);
sampleItem.setSourceOfSampleId(sourceOfSampleId);
}
//bugzilla 1778
if (!StringUtil.isNullorNill(sourceOther)) {
sampleItem.setSourceOther(sourceOther);
}
// bugzilla 1926
sample.setSysUserId(sysUserId);
sampleItem.setSysUserId(sysUserId);
if (!StringUtil.isNullorNill(sample.getId())) {
// Now update
sampleDAO.updateData(sample);
// bugzilla 1773 need to store sample not sampleId for
// use in sorting
sampleItem.setSample(sample);
} else {
sampleDAO.insertDataWithAccessionNumber(sample);
// bugzilla 1773 need to store sample not sampleId for
// use in sorting
sampleItem.setSample(sample);
}
sampleItemDAO.insertData(sampleItem);
// Analysis table
for (int i = 0; i < analyses.size(); i++) {
Analysis analysis = (Analysis) analyses.get(i);
analysis.setSampleItem(sampleItem);
// bugizlla 1926
analysis.setSysUserId(sysUserId);
//bugzilla 2064
analysis.setRevision(SystemConfiguration.getInstance().getAnalysisDefaultRevision());
//bugzilla 2013 added duplicateCheck parameter
analysisDAO.insertData(analysis, false);
//bugzilla 2028: If Sample Type NOT GIVE then create ANALYSIS_QA_EVENT for each added test
if (typeOfSample.equals(SAMPLE_TYPE_NOT_GIVEN)) {
QaEvent qaEvent = new QaEvent();
qaEvent.setQaEventName(SystemConfiguration.getInstance().getQaEventCodeForRequestNoSampleType());
qaEvent = qaEventDAO.getQaEventByName(qaEvent);
AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEvent);
analysisQaEvent.setCompletedDate(null);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.insertData(analysisQaEvent);
}
}
}
}
tx.commit();
} catch (LIMSRuntimeException lre) {
//bugzilla 2154
LogEvent.logError("QuickEntryUpdateAction","performAction()",lre.toString());
tx.rollback();
errors = new ActionMessages();
ActionError error = null;
if (lre.getException() instanceof StaleObjectStateException) {
error = new ActionError("errors.OptimisticLockException", null,
null);
} else {
//bugzilla 2154
LogEvent.logError("QuickEntryUpdateAction","performAction()",lre.toString());
error = new ActionError("errors.UpdateException", null, null);
}
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
saveErrors(request, errors);
request.setAttribute(Globals.ERROR_KEY, errors);
request.setAttribute(ALLOW_EDITS_KEY, "false");
return mapping.findForward(FWD_FAIL);
} finally {
HibernateUtil.closeSession();
}
// initialize the form
dynaForm.initialize(mapping);
PropertyUtils.copyProperties(dynaForm, sample);
dynaForm.set("accessionNumber", accessionNumber);
dynaForm.set("accessionNumber2", accessionNumber2);
// PropertyUtils.setProperty(dynaForm, "sysUsers", sysUsers);
if ("true".equalsIgnoreCase(request.getParameter("close"))) {
forward = FWD_CLOSE;
}
if (forward.equals(FWD_SUCCESS)) {
request.setAttribute("menuDefinition", "default");
}
return mapping.findForward(forward);
}
// ==============================================================
protected String getPageTitleKey() {
return "quick.entry.add.title";
}
// ==============================================================
protected String getPageSubtitleKey() {
return "quick.entry.add.title";
}
// ==============================================================
protected ActionMessages validateAll(HttpServletRequest request,
ActionMessages errors, BaseActionForm dynaForm) throws Exception {
String result;
String messageKey;
// Accession number validation against database (reusing ajax validation
// logic)
// The specified accession number SHOULD NOT exist in the database.
QuickEntryAccessionNumberValidationProvider accessionValidator = new QuickEntryAccessionNumberValidationProvider();
result = accessionValidator.validate((String) dynaForm
.get("accessionNumber"));
messageKey = "quick.entry.accession.number";
if (result.equals("invalid")) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
//only validate if not null or blank (this is not a required field)
if (!StringUtil.isNullorNill((String) dynaForm.get("accessionNumber2"))) {
result = accessionValidator.validate((String) dynaForm
.get("accessionNumber2"));
messageKey = "quick.entry.accession.number.2";
if (result.equals("invalid")
|| !fromAccessionLessThanThruAccession((String) dynaForm
.get("accessionNumber"), (String) dynaForm
.get("accessionNumber2"))) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
}
// Sample type validation against database (reusing ajax validation
// logic)
QuickEntrySampleTypeValidationProvider typeValidator = new QuickEntrySampleTypeValidationProvider();
result = typeValidator.validate((String) dynaForm
.get("typeOfSampleDesc"));
messageKey = "quick.entry.sample.type";
if (result.equals("invalid")) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
/*
* AIS - bugzilla 1396 Added if constraint-- to check if it is invalid,
* only when it is filled in
*/
if (!dynaForm.get("sourceOfSampleDesc").equals("")) {
// Sample source validation against database (reusing ajax
// validation logic)
QuickEntrySampleSourceValidationProvider sourceValidator = new QuickEntrySampleSourceValidationProvider();
result = sourceValidator.validate((String) dynaForm
.get("sourceOfSampleDesc"));
messageKey = "quick.entry.sample.source";
if (result.equals("invalid")) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
}
return errors;
}
private boolean fromAccessionLessThanThruAccession(String from, String thru) {
int fromInt = Integer.parseInt(from);
int thruInt = Integer.parseInt(thru);
if (fromInt < thruInt) {
return true;
}
return false;
}
}