/**
* 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.testmanagement.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 us.mn.state.health.lims.action.dao.ActionDAO;
import us.mn.state.health.lims.action.daoimpl.ActionDAOImpl;
import us.mn.state.health.lims.action.valueholder.Action;
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.analysisqaeventaction.dao.AnalysisQaEventActionDAO;
import us.mn.state.health.lims.analysisqaeventaction.daoimpl.AnalysisQaEventActionDAOImpl;
import us.mn.state.health.lims.analysisqaeventaction.valueholder.AnalysisQaEventAction;
import us.mn.state.health.lims.common.action.BaseAction;
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.*;
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.organization.dao.OrganizationDAO;
import us.mn.state.health.lims.organization.daoimpl.OrganizationDAOImpl;
import us.mn.state.health.lims.organization.valueholder.Organization;
import us.mn.state.health.lims.patient.dao.PatientDAO;
import us.mn.state.health.lims.patient.daoimpl.PatientDAOImpl;
import us.mn.state.health.lims.patient.valueholder.Patient;
import us.mn.state.health.lims.person.dao.PersonDAO;
import us.mn.state.health.lims.person.daoimpl.PersonDAOImpl;
import us.mn.state.health.lims.person.valueholder.Person;
import us.mn.state.health.lims.project.dao.ProjectDAO;
import us.mn.state.health.lims.project.daoimpl.ProjectDAOImpl;
import us.mn.state.health.lims.project.valueholder.Project;
import us.mn.state.health.lims.provider.dao.ProviderDAO;
import us.mn.state.health.lims.provider.daoimpl.ProviderDAOImpl;
import us.mn.state.health.lims.provider.valueholder.Provider;
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.samplehuman.dao.SampleHumanDAO;
import us.mn.state.health.lims.samplehuman.daoimpl.SampleHumanDAOImpl;
import us.mn.state.health.lims.samplehuman.valueholder.SampleHuman;
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.sampleorganization.dao.SampleOrganizationDAO;
import us.mn.state.health.lims.sampleorganization.daoimpl.SampleOrganizationDAOImpl;
import us.mn.state.health.lims.sampleorganization.valueholder.SampleOrganization;
import us.mn.state.health.lims.sampleproject.dao.SampleProjectDAO;
import us.mn.state.health.lims.sampleproject.daoimpl.SampleProjectDAOImpl;
import us.mn.state.health.lims.sampleproject.valueholder.SampleProject;
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.systemuser.dao.SystemUserDAO;
import us.mn.state.health.lims.systemuser.daoimpl.SystemUserDAOImpl;
import us.mn.state.health.lims.systemuser.valueholder.SystemUser;
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.sql.Timestamp;
import java.util.*;
/**
* @author aiswarya raman
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates. To enable and disable the creation of type
* comments go to Window>Preferences>Java>Code Generation.
*/
public class SampleDemographicsUpdateAction extends BaseAction {
protected ActionForward performAction(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
//System.out.println("I am in SampleDemographicsUpdateAction ");
String forward = FWD_SUCCESS;
request.setAttribute(ALLOW_EDITS_KEY, "true");
BaseActionForm testManagementForm = (BaseActionForm) form;
// server-side validation (validation.xml)
ActionMessages errors = testManagementForm.validate(mapping, request);
try {
errors = validateAll(request, errors, testManagementForm);
} catch (Exception e) {
//bugzilla 2154
LogEvent.logError("SampleDemographicsUpdateAction","performAction()",e.toString());
ActionError error = new ActionError("errors.ValidationException",
null, null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
// end of zip/city combination check
if (errors != null && errors.size() > 0) {
saveErrors(request, errors);
// since we forward to jsp - not Action we don't need to repopulate
// the lists here
return mapping.findForward(FWD_FAIL);
}
String accessionNumber = (String) testManagementForm
.get("accessionNumber");
String typeOfSample = (String) testManagementForm
.get("typeOfSampleDesc");
String sourceOfSample = (String) testManagementForm
.get("sourceOfSampleDesc");
List typeOfSamples = new ArrayList();
List sourceOfSamples = new ArrayList();
if (testManagementForm.get("typeOfSamples") != null) {
typeOfSamples = (List) testManagementForm.get("typeOfSamples");
} else {
TypeOfSampleDAO typeOfSampleDAO = new TypeOfSampleDAOImpl();
typeOfSamples = typeOfSampleDAO.getAllTypeOfSamples();
}
if (testManagementForm.get("sourceOfSamples") != null) {
sourceOfSamples = (List) testManagementForm.get("sourceOfSamples");
} else {
SourceOfSampleDAO sourceOfSampleDAO = new SourceOfSampleDAOImpl();
sourceOfSamples = sourceOfSampleDAO.getAllSourceOfSamples();
}
String projectIdOrName = (String) testManagementForm
.get("projectIdOrName");
String project2IdOrName = (String) testManagementForm
.get("project2IdOrName");
String projectNameOrId = (String) testManagementForm
.get("projectNameOrId");
String project2NameOrId = (String) testManagementForm
.get("project2NameOrId");
String projectId = null;
String project2Id = null;
if (projectIdOrName != null && projectNameOrId != null) {
try {
Integer i = Integer.valueOf(projectIdOrName);
projectId = projectIdOrName;
} catch (NumberFormatException nfe) {
//bugzilla 2154
LogEvent.logError("SampleDemographicsUpdateAction","performAction()",nfe.toString());
projectId = projectNameOrId;
}
}
if (project2IdOrName != null && project2NameOrId != null) {
try {
Integer i = Integer.valueOf(project2IdOrName);
project2Id = project2IdOrName;
} catch (NumberFormatException nfe) {
//bugzilla 2154
LogEvent.logError("SampleDemographicsUpdateAction","performAction()",nfe.toString());
project2Id = project2NameOrId;
}
}
// set current date for validation of dates
Date today = Calendar.getInstance().getTime();
String dateAsText = DateUtil.formatDateAsText(today);
PersonDAO personDAO = new PersonDAOImpl();
PatientDAO patientDAO = new PatientDAOImpl();
ProviderDAO providerDAO = new ProviderDAOImpl();
SampleDAO sampleDAO = new SampleDAOImpl();
SampleItemDAO sampleItemDAO = new SampleItemDAOImpl();
SampleHumanDAO sampleHumanDAO = new SampleHumanDAOImpl();
SampleOrganizationDAO sampleOrganizationDAO = new SampleOrganizationDAOImpl();
AnalysisDAO analysisDAO = new AnalysisDAOImpl();
SampleProjectDAO sampleProjectDAO = new SampleProjectDAOImpl();
ProjectDAO projectDAO = new ProjectDAOImpl();
AnalysisQaEventDAO analysisQaEventDAO = new AnalysisQaEventDAOImpl();
AnalysisQaEventActionDAO analysisQaEventActionDAO = new AnalysisQaEventActionDAOImpl();
QaEventDAO qaEventDAO = new QaEventDAOImpl();
ActionDAO actionDAO = new ActionDAOImpl();
Patient patient = new Patient();
Person person = new Person();
Provider provider = new Provider();
Person providerPerson = new Person();
Sample sample = new Sample();
SampleHuman sampleHuman = new SampleHuman();
SampleOrganization sampleOrganization = new SampleOrganization();
List oldSampleProjects = new ArrayList();
List newSampleProjects = new ArrayList();
SampleItem sampleItem = new SampleItem();
List analyses = new ArrayList();
// GET ORIGINAL DATA
try {
sample.setAccessionNumber(accessionNumber);
sampleDAO.getSampleByAccessionNumber(sample);
if (!StringUtil.isNullorNill(sample.getId())) {
sampleHuman.setSampleId(sample.getId());
sampleHumanDAO.getDataBySample(sampleHuman);
sampleOrganization.setSample(sample);
sampleOrganizationDAO.getDataBySample(sampleOrganization);
// bugzilla 1773 need to store sample not sampleId for use in
// sorting
sampleItem.setSample(sample);
sampleItemDAO.getDataBySample(sampleItem);
patient.setId(sampleHuman.getPatientId());
patientDAO.getData(patient);
person = patient.getPerson();
personDAO.getData(person);
provider.setId(sampleHuman.getProviderId());
providerDAO.getData(provider);
providerPerson = provider.getPerson();
personDAO.getData(providerPerson);
//bugzilla 2227
analyses = analysisDAO.getMaxRevisionAnalysesBySample(sampleItem);
oldSampleProjects = sample.getSampleProjects();
}
} catch (LIMSRuntimeException lre) {
// if error then forward to fail and don't update to blank page
// = false
//bugzilla 2154
LogEvent.logError("SampleDemographicsUpdateAction","performAction()",lre.toString());
errors = new ActionMessages();
ActionError error = null;
error = new ActionError("errors.GetException", 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);
}
// UPDATE DATA FROM FORM
// populate valueholder from form
PropertyUtils.copyProperties(sample, testManagementForm);
PropertyUtils.copyProperties(person, testManagementForm);
PropertyUtils.copyProperties(patient, testManagementForm);
PropertyUtils.copyProperties(provider, testManagementForm);
PropertyUtils.copyProperties(sampleHuman, testManagementForm);
PropertyUtils.copyProperties(sampleOrganization, testManagementForm);
PropertyUtils.copyProperties(sampleItem, testManagementForm);
TypeOfSample typeOfSamp = null;
// get the right typeOfSamp to update sampleitem with
for (int i = 0; i < typeOfSamples.size(); i++) {
TypeOfSample s = (TypeOfSample) typeOfSamples.get(i);
if (s.getDescription().equalsIgnoreCase(typeOfSample)) {
typeOfSamp = s;
break;
}
}
SourceOfSample sourceOfSamp = null;
// get the right sourceOfSamp to update sampleitem with
for (int i = 0; i < sourceOfSamples.size(); i++) {
SourceOfSample s = (SourceOfSample) sourceOfSamples.get(i);
if (s.getDescription().equalsIgnoreCase(sourceOfSample)) {
sourceOfSamp = s;
break;
}
}
Organization org = new Organization();
//bugzilla 2069
org.setOrganizationLocalAbbreviation((String) testManagementForm.get("organizationLocalAbbreviation"));
OrganizationDAO organizationDAO = new OrganizationDAOImpl();
org = organizationDAO.getOrganizationByLocalAbbreviation(org, true);
sampleOrganization.setOrganization(org);
// if there was a first sampleProject id entered
// ****Added a Try catch block to validate integer because..
// ****When a project is deleted, the name of the project is passed in
// as its id which causes error
try {
Integer i = Integer.valueOf(projectId);
if (!StringUtil.isNullorNill(projectId)) {
SampleProject sampleProject = new SampleProject();
Project p = new Project();
//bugzilla 2438
p.setLocalAbbreviation(projectId);
p = projectDAO.getProjectByLocalAbbreviation(p, true);
sampleProject.setProject(p);
sampleProject.setSample(sample);
sampleProject.setIsPermanent(NO);
newSampleProjects.add(sampleProject);
}
} catch (NumberFormatException nfe) {
//bugzilla 2154
LogEvent.logError("SampleDemographicsUpdateAction","performAction()",nfe.toString());
}
// in case there was a second sampleProject id entered
try {
Integer i = Integer.valueOf(project2Id);
if (!StringUtil.isNullorNill(project2Id)) {
SampleProject sampleProject2 = new SampleProject();
Project p2 = new Project();
//bugzilla 2438
p2.setLocalAbbreviation(project2Id);
p2 = projectDAO.getProjectByLocalAbbreviation(p2, true);
sampleProject2.setProject(p2);
sampleProject2.setSample(sample);
sampleProject2.setIsPermanent(NO);
newSampleProjects.add(sampleProject2);
}
} catch (NumberFormatException nfe) {
//bugzilla 2154
LogEvent.logError("SampleDemographicsUpdateAction","performAction()",nfe.toString());
}
// set the provider person manually as we have two Person
// valueholders
// to populate and copyProperties() can only handle one per form
providerPerson.setFirstName((String) testManagementForm
.get("providerFirstName"));
providerPerson.setLastName((String) testManagementForm
.get("providerLastName"));
// format workPhone for storage
String workPhone = (String) testManagementForm.get("providerWorkPhone");
String ext = (String) testManagementForm
.get("providerWorkPhoneExtension");
String formattedPhone = StringUtil.formatPhone(workPhone, ext);
// phone is stored as 999/999-9999.9999
// area code/phone - number.extension
providerPerson.setWorkPhone(formattedPhone);
String date = (String) testManagementForm
.get("collectionDateForDisplay");
if (!StringUtil.isNullorNill(date)) {
//System.out.println("I am here");
// set collection time
String time = (String) testManagementForm
.get("collectionTimeForDisplay");
if (StringUtil.isNullorNill(time)) {
time = "00:00";
}
sample.setCollectionTimeForDisplay(time);
sample.setCollectionDateForDisplay(date);
Timestamp d = sample.getCollectionDate();
if (time.indexOf(":") > 0) {
// bugzilla 1857 deprecated stuff
Calendar cal = Calendar.getInstance();
cal.setTime(d);
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(
time.substring(0, 2)).intValue());
cal.set(Calendar.MINUTE, Integer.valueOf(time.substring(3, 5))
.intValue());
// d.setHours(Integer.valueOf(time.substring(0, 2)).intValue());
// d.setMinutes(Integer.valueOf(time.substring(3,
// 5)).intValue());
d = new Timestamp(cal.getTimeInMillis());
sample.setCollectionDate(d);
}
}
// sampleItem
sampleItem.setSortOrder("1");
// set the typeOfSample
sampleItem.setTypeOfSample(typeOfSamp);
// set the sourceOfSample
sampleItem.setSourceOfSample(sourceOfSamp);
sample.setSampleProjects(newSampleProjects);
// get sysUserId from login module
UserSessionData usd = (UserSessionData)request.getSession().getAttribute(USER_SESSION_DATA);
String sysUserId = String.valueOf(usd.getSystemUserId());
org.hibernate.Transaction tx = HibernateUtil.getSession()
.beginTransaction();
//bugzilla 2481, 2496 Action Owner
SystemUser systemUser = new SystemUser();
systemUser.setId(sysUserId);
SystemUserDAO systemUserDAO = new SystemUserDAOImpl();
systemUserDAO.getData(systemUser);
List newIds = new ArrayList();
List oldIds = new ArrayList();
if (newSampleProjects != null) {
for (int i = 0; i < newSampleProjects.size(); i++) {
SampleProject sp = (SampleProject) newSampleProjects.get(i);
newIds.add(sp.getId());
}
}
if (oldSampleProjects != null) {
List listOfOldOnesToRemove = new ArrayList();
for (int i = 0; i < oldSampleProjects.size(); i++) {
SampleProject sp = (SampleProject) oldSampleProjects.get(i);
oldIds.add(sp.getId());
if (!newIds.contains(sp.getId())) {
// remove ones that are to be deleted
listOfOldOnesToRemove.add(new Integer(i));
}
}
int decreaseOSPIndexBy = 0;
int decreaseOIIndexBy = 0;
List listOfSampleProjectObjectsToDelete = new ArrayList();
for (int i = 0; i < listOfOldOnesToRemove.size(); i++) {
SampleProject sp = (SampleProject) oldSampleProjects
.remove(((Integer) listOfOldOnesToRemove.get(i))
.intValue()
- decreaseOSPIndexBy++);
//bugzilla 1926
sp.setSysUserId(sysUserId);
listOfSampleProjectObjectsToDelete.add(sp);
oldIds.remove(((Integer) listOfOldOnesToRemove.get(i))
.intValue()
- decreaseOIIndexBy++);
}
sampleProjectDAO.deleteData(listOfSampleProjectObjectsToDelete);
}
if (newSampleProjects != null) {
for (int j = 0; j < newSampleProjects.size(); j++) {
SampleProject saPr = (SampleProject) newSampleProjects.get(j);
int index = oldIds.indexOf(saPr.getId());
if (index >= 0) {
SampleProject sampleProjectClone = (SampleProject) oldSampleProjects
.get(index);
PropertyUtils.copyProperties(sampleProjectClone, saPr);
Sample smplClone = (Sample) sampleProjectClone.getSample();
sampleProjectClone.setSample(smplClone);
Project pClone = (Project) sampleProjectClone.getProject();
sampleProjectClone.setProject(pClone);
PropertyUtils.setProperty(sampleProjectClone,
"lastupdated", (Timestamp) testManagementForm
.get("sampleProject1Lastupdated"));
sampleProjectClone.setSysUserId(sysUserId);
sampleProjectDAO.updateData(sampleProjectClone);
oldSampleProjects.set(index, sampleProjectClone);
} else {
SampleProject sampleProjectClone = new SampleProject();
PropertyUtils.copyProperties(sampleProjectClone, saPr);
Sample smplClone = (Sample) sampleProjectClone.getSample();
sampleProjectClone.setSample(smplClone);
Project pClone = (Project) sampleProjectClone.getProject();
sampleProjectClone.setProject(pClone);
PropertyUtils.setProperty(sampleProjectClone,
"lastupdated", (Timestamp) testManagementForm
.get("sampleProject2Lastupdated"));
//bugzilla 1926
sampleProjectClone.setSysUserId(sysUserId);
sampleProjectDAO.insertData(sampleProjectClone);
oldSampleProjects.add(sampleProjectClone);
}
}
}
sample.setSampleProjects(oldSampleProjects);
// END DIANE
try {
// set last updated from form
PropertyUtils.setProperty(person, "lastupdated",
(Timestamp) testManagementForm.get("personLastupdated"));
PropertyUtils.setProperty(patient, "lastupdated",
(Timestamp) testManagementForm.get("patientLastupdated"));
PropertyUtils.setProperty(sample, "lastupdated",
(Timestamp) testManagementForm.get("lastupdated"));
PropertyUtils.setProperty(providerPerson, "lastupdated",
(Timestamp) testManagementForm
.get("providerPersonLastupdated"));
PropertyUtils.setProperty(provider, "lastupdated",
(Timestamp) testManagementForm.get("providerLastupdated"));
PropertyUtils
.setProperty(sampleItem, "lastupdated",
(Timestamp) testManagementForm
.get("sampleItemLastupdated"));
PropertyUtils.setProperty(sampleHuman, "lastupdated",
(Timestamp) testManagementForm
.get("sampleHumanLastupdated"));
PropertyUtils.setProperty(sampleOrganization, "lastupdated",
(Timestamp) testManagementForm
.get("sampleOrganizationLastupdated"));
person.setSysUserId(sysUserId);
patient.setSysUserId(sysUserId);
providerPerson.setSysUserId(sysUserId);
provider.setSysUserId(sysUserId);
sample.setSysUserId(sysUserId);
sampleHuman.setSysUserId(sysUserId);
sampleOrganization.setSysUserId(sysUserId);
sampleItem.setSysUserId(sysUserId);
personDAO.updateData(person);
patient.setPerson(person);
patientDAO.updateData(patient);
personDAO.updateData(providerPerson);
provider.setPerson(providerPerson);
providerDAO.updateData(provider);
sampleDAO.updateData(sample);
sampleHuman.setSampleId(sample.getId());
sampleHuman.setPatientId(patient.getId());
sampleHuman.setProviderId(provider.getId());
sampleHumanDAO.updateData(sampleHuman);
sampleOrganization.setSample(sample);
sampleOrganizationDAO.updateData(sampleOrganization);
// bugzilla 1773 need to store sample not sampleId for use in
// sorting
sampleItem.setSample(sample);
sampleItemDAO.updateData(sampleItem);
// Analysis table
for (int i = 0; i < analyses.size(); i++) {
Analysis analysis = (Analysis) analyses.get(i);
analysis.setSampleItem(sampleItem);
analysis.setSysUserId(sysUserId);
analysisDAO.updateData(analysis);
}
// bugzilla 3032/2028 qa event logic needs to be executed for new and
// existing analyses for this sample
// ADDITIONAL REQUIREMENT ADDED 8/30: only for HSE2 Completed Status (see bugzilla 2032)
boolean isSampleStatusReadyForQaEvent = false;
if (!StringUtil.isNullorNill(sample.getStatus()) && (sample.getStatus().equals(SystemConfiguration.getInstance().getSampleStatusReleased()))
|| sample.getStatus().equals(SystemConfiguration.getInstance().getSampleStatusEntry2Complete())) {
isSampleStatusReadyForQaEvent = true;
}
if (isSampleStatusReadyForQaEvent) {
// bugzilla 2028 need additional information for qa events
typeOfSamp = sampleItem.getTypeOfSample();
sampleOrganization.setSample(sample);
sampleOrganizationDAO.getDataBySample(sampleOrganization);
//bugzilla 2589
String submitterNumber = "";
if (sampleOrganization != null && sampleOrganization.getOrganization() != null) {
submitterNumber = sampleOrganization.getOrganization()
.getId();
}
//bugzilla 2227
List allAnalysesForSample = analysisDAO
.getMaxRevisionAnalysesBySample(sampleItem);
// bugzilla 2028 get the possible qa events
QaEvent qaEventForNoCollectionDate = new QaEvent();
qaEventForNoCollectionDate.setQaEventName(SystemConfiguration
.getInstance().getQaEventCodeForRequestNoCollectionDate());
qaEventForNoCollectionDate = qaEventDAO
.getQaEventByName(qaEventForNoCollectionDate);
QaEvent qaEventForNoSampleType = new QaEvent();
qaEventForNoSampleType.setQaEventName(SystemConfiguration
.getInstance().getQaEventCodeForRequestNoSampleType());
qaEventForNoSampleType = qaEventDAO
.getQaEventByName(qaEventForNoSampleType);
QaEvent qaEventForUnknownSubmitter = new QaEvent();
qaEventForUnknownSubmitter.setQaEventName(SystemConfiguration
.getInstance().getQaEventCodeForRequestUnknownSubmitter());
qaEventForUnknownSubmitter = qaEventDAO
.getQaEventByName(qaEventForUnknownSubmitter);
// end bugzilla 2028
// bugzilla 2028 get the possible qa event actions
Action actionForNoCollectionDate = new Action();
actionForNoCollectionDate.setCode(SystemConfiguration.getInstance()
.getQaEventActionCodeForRequestNoCollectionDate());
actionForNoCollectionDate = actionDAO
.getActionByCode(actionForNoCollectionDate);
Action actionForNoSampleType = new Action();
actionForNoSampleType.setCode(SystemConfiguration.getInstance()
.getQaEventActionCodeForRequestNoSampleType());
actionForNoSampleType = actionDAO
.getActionByCode(actionForNoSampleType);
Action actionForUnknownSubmitter = new Action();
actionForUnknownSubmitter.setCode(SystemConfiguration.getInstance()
.getQaEventActionCodeForRequestUnknownSubmitter());
actionForUnknownSubmitter = actionDAO
.getActionByCode(actionForUnknownSubmitter);
// end bugzilla 2028
for (int i = 0; i < allAnalysesForSample.size(); i++) {
Analysis analysis = (Analysis) allAnalysesForSample.get(i);
// bugzilla 2028 QA_EVENT COLLECTIONDATE
if (sample.getCollectionDate() == null) {
AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForNoCollectionDate);
analysisQaEvent = analysisQaEventDAO
.getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent);
if (analysisQaEvent == null) {
analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForNoCollectionDate);
analysisQaEvent.setCompletedDate(null);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.insertData(analysisQaEvent);
} else {
if (analysisQaEvent.getCompletedDate() != null) {
analysisQaEvent.setCompletedDate(null);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.updateData(analysisQaEvent);
}
}
} else {
AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForNoCollectionDate);
analysisQaEvent = analysisQaEventDAO
.getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent);
// if we don't find a record in ANALYSIS_QAEVENT (or
// completed date is not null) then this is already
// fixed
if (analysisQaEvent != null
&& analysisQaEvent.getCompletedDate() == null) {
AnalysisQaEventAction analysisQaEventAction = new AnalysisQaEventAction();
analysisQaEventAction
.setAnalysisQaEvent(analysisQaEvent);
analysisQaEventAction
.setAction(actionForNoCollectionDate);
analysisQaEventAction = analysisQaEventActionDAO
.getAnalysisQaEventActionByAnalysisQaEventAndAction(analysisQaEventAction);
// if we found a record in ANALYSIS_QAEVENT_ACTION
// then this has been fixed
if (analysisQaEventAction == null) {
// insert a record in ANALYSIS_QAEVENT_ACTION
AnalysisQaEventAction analQaEventAction = new AnalysisQaEventAction();
analQaEventAction
.setAnalysisQaEvent(analysisQaEvent);
analQaEventAction
.setAction(actionForNoCollectionDate);
analQaEventAction
.setCreatedDateForDisplay(dateAsText);
analQaEventAction.setSysUserId(sysUserId);
//bugzilla 2496
analQaEventAction.setSystemUser(systemUser);
analysisQaEventActionDAO
.insertData(analQaEventAction);
}
// update the found
// ANALYSIS_QAEVENT.COMPLETED_DATE with current
// date stamp
analysisQaEvent
.setCompletedDateForDisplay(dateAsText);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.updateData(analysisQaEvent);
}
}
// bugzilla 2028 QA_EVENT SAMPLETYPE
if (typeOfSamp.getDescription().equals(SAMPLE_TYPE_NOT_GIVEN)) {
AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForNoSampleType);
analysisQaEvent = analysisQaEventDAO
.getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent);
if (analysisQaEvent == null) {
analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForNoSampleType);
analysisQaEvent.setCompletedDate(null);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.insertData(analysisQaEvent);
} else {
if (analysisQaEvent.getCompletedDate() != null) {
analysisQaEvent.setCompletedDate(null);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.updateData(analysisQaEvent);
}
}
} else {
AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForNoSampleType);
analysisQaEvent = analysisQaEventDAO
.getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent);
// if we don't find a record in ANALYSIS_QAEVENT (or
// completed date is not null) then this is already
// fixed
if (analysisQaEvent != null
&& analysisQaEvent.getCompletedDate() == null) {
AnalysisQaEventAction analysisQaEventAction = new AnalysisQaEventAction();
analysisQaEventAction
.setAnalysisQaEvent(analysisQaEvent);
analysisQaEventAction
.setAction(actionForNoSampleType);
analysisQaEventAction = analysisQaEventActionDAO
.getAnalysisQaEventActionByAnalysisQaEventAndAction(analysisQaEventAction);
// if we found a record in ANALYSIS_QAEVENT_ACTION
// then this has been fixed
if (analysisQaEventAction == null) {
// insert a record in ANALYSIS_QAEVENT_ACTION
AnalysisQaEventAction analQaEventAction = new AnalysisQaEventAction();
analQaEventAction
.setAnalysisQaEvent(analysisQaEvent);
analQaEventAction
.setAction(actionForNoSampleType);
analQaEventAction
.setCreatedDateForDisplay(dateAsText);
analQaEventAction.setSysUserId(sysUserId);
//bugzilla 2496
analQaEventAction.setSystemUser(systemUser);
analysisQaEventActionDAO
.insertData(analQaEventAction);
}
// update the found
// ANALYSIS_QAEVENT.COMPLETED_DATE with current
// date stamp
analysisQaEvent
.setCompletedDateForDisplay(dateAsText);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.updateData(analysisQaEvent);
}
}
// bugzilla 2028 QA_EVENT UNKNOWN SUBMITTER
//bugzilla 2589
if (submitterNumber.equals(SystemConfiguration.getInstance()
.getUnknownSubmitterNumberForQaEvent())) {
AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForUnknownSubmitter);
analysisQaEvent = analysisQaEventDAO
.getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent);
if (analysisQaEvent == null) {
analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForUnknownSubmitter);
analysisQaEvent.setCompletedDate(null);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.insertData(analysisQaEvent);
} else {
if (analysisQaEvent.getCompletedDate() != null) {
analysisQaEvent.setCompletedDate(null);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.updateData(analysisQaEvent);
}
}
} else {
AnalysisQaEvent analysisQaEvent = new AnalysisQaEvent();
analysisQaEvent.setAnalysis(analysis);
analysisQaEvent.setQaEvent(qaEventForUnknownSubmitter);
analysisQaEvent = analysisQaEventDAO
.getAnalysisQaEventByAnalysisAndQaEvent(analysisQaEvent);
// if we don't find a record in ANALYSIS_QAEVENT (or
// completed date is not null) then this is already
// fixed
if (analysisQaEvent != null
&& analysisQaEvent.getCompletedDate() == null) {
AnalysisQaEventAction analysisQaEventAction = new AnalysisQaEventAction();
analysisQaEventAction
.setAnalysisQaEvent(analysisQaEvent);
analysisQaEventAction
.setAction(actionForUnknownSubmitter);
analysisQaEventAction = analysisQaEventActionDAO
.getAnalysisQaEventActionByAnalysisQaEventAndAction(analysisQaEventAction);
// if we found a record in ANALYSIS_QAEVENT_ACTION
// then this has been fixed
if (analysisQaEventAction == null) {
// insert a record in ANALYSIS_QAEVENT_ACTION
AnalysisQaEventAction analQaEventAction = new AnalysisQaEventAction();
analQaEventAction
.setAnalysisQaEvent(analysisQaEvent);
analQaEventAction
.setAction(actionForUnknownSubmitter);
analQaEventAction
.setCreatedDateForDisplay(dateAsText);
analQaEventAction.setSysUserId(sysUserId);
//bugzilla 2496
analQaEventAction.setSystemUser(systemUser);
analysisQaEventActionDAO
.insertData(analQaEventAction);
}
// update the found
// ANALYSIS_QAEVENT.COMPLETED_DATE with current
// date stamp
analysisQaEvent
.setCompletedDateForDisplay(dateAsText);
analysisQaEvent.setSysUserId(sysUserId);
analysisQaEventDAO.updateData(analysisQaEvent);
}
}
}
}
tx.commit();
// done updating return to menu
forward = FWD_CLOSE;
} catch (LIMSRuntimeException lre) {
//bugzilla 2154
LogEvent.logError("SampleDemographicsUpdateAction","performAction()",lre.toString());
tx.rollback();
// if error then forward to fail and don't update to blank page
// = false
errors = new ActionMessages();
ActionError error = null;
if (lre.getException() instanceof org.hibernate.StaleObjectStateException) {
// how can I get popup instead of struts error at the top of
// page?
// ActionMessages errors = testManagementForm.validate(mapping,
// request);
error = new ActionError("errors.OptimisticLockException", null,
null);
} else {
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");
forward = FWD_FAIL;
} finally {
HibernateUtil.closeSession();
}
if (forward.equals(FWD_FAIL))
return mapping.findForward(FWD_FAIL);
if ("true".equalsIgnoreCase(request.getParameter("close"))) {
forward = FWD_CLOSE;
}
if (sample.getId() != null && !sample.getId().equals("0")) {
request.setAttribute(ID, sample.getId());
}
if (forward.equals(FWD_SUCCESS)) {
request.setAttribute("menuDefinition", "default");
}
return mapping.findForward(forward);
}
protected String getPageTitleKey() {
return "testmanagement.sampledemographics.title";
}
protected String getPageSubtitleKey() {
return "testmanagement.sampledemographics.subtitle";
}
//bugzilla 1765 changes to city state zip validation
protected ActionMessages validateAll(HttpServletRequest request,
ActionMessages errors, BaseActionForm dynaForm) throws Exception {
String result;
String messageKey;
//bugzilla 1978: changed to use Basic Provider which allows active and inactive projs
BasicProjectIdOrNameValidationProvider projIdOrNameValidator = new BasicProjectIdOrNameValidationProvider();
String projNum = (String) dynaForm.get("projectIdOrName");
if (!StringUtil.isNullorNill(projNum)) {
// project ID validation against database (reusing ajax
// validation logic)
result = projIdOrNameValidator.validate((String) dynaForm
.get("projectIdOrName"));
messageKey = "humansampleone.projectNumber";
if (result.startsWith("valid")) {
result = projIdOrNameValidator.validate((String) dynaForm
.get("projectNameOrId"));
if (result.equals("invalid")) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
} else {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
}
String proj2Num = (String) dynaForm.get("project2IdOrName");
if (!StringUtil.isNullorNill(proj2Num)) {
result = projIdOrNameValidator.validate((String) dynaForm
.get("project2IdOrName"));
messageKey = "humansampleone.project2Number";
if (result.startsWith("valid")) {
result = projIdOrNameValidator.validate((String) dynaForm
.get("project2NameOrId"));
if (result.equals("invalid")) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
} else {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
}
// organization ID (submitter) validation against database (reusing ajax
// validation logic)
//bugzilla 2069
//bugzilla 2531
OrganizationLocalAbbreviationValidationProvider organizationLocalAbbreviationValidator = new OrganizationLocalAbbreviationValidationProvider();
result = organizationLocalAbbreviationValidator.validate((String) dynaForm
.get("organizationLocalAbbreviation"),null);
messageKey = "humansampleone.provider.organization.localAbbreviation";
if (result.equals("invalid")) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
boolean cityValid = true;
boolean zipValid = true;
boolean stateValid = true;
// state validation against database (reusing ajax validation logic
StateValidationProvider stateValidator = new StateValidationProvider();
result = stateValidator.validate((String) dynaForm.get("state"));
messageKey = "person.state";
if (result.equals("invalid")) {
stateValid = false;
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
// city validation against database (reusing ajax validation logic
CityValidationProvider cityValidator = new CityValidationProvider();
result = cityValidator.validate((String) dynaForm.get("city"));
messageKey = "person.city";
if (result.equals("invalid")) {
cityValid = false;
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
// zip validation against database (reusing ajax validation logic
ZipValidationProvider zipValidator = new ZipValidationProvider();
result = zipValidator.validate((String) dynaForm.get("zipCode"));
messageKey = "person.zipCode";
if (result.equals("invalid")) {
zipValid = false;
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
if (cityValid && stateValid && zipValid) {
String messageKey1 = "person.city";
String messageKey2 = "person.zipCode";
String messageKey3 = "person.state";
// city validation against database (reusing ajax validation logic
CityStateZipComboValidationProvider cityStateZipComboValidator = new CityStateZipComboValidationProvider();
result = cityStateZipComboValidator.validate((String) dynaForm
.get("city"), (String) dynaForm.get("state"),
(String) dynaForm.get("zipCode"));
// combination is invalid if result is invalid
if ("invalid".equals(result)) {
ActionError error = new ActionError("errors.combo.3.invalid",
getMessageForKey(messageKey1),
getMessageForKey(messageKey2),
getMessageForKey(messageKey3), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
}
// sample type validation against database (reusing ajax validation
// logic
// do this "invalid" only when filled in. otherwise, "required" error
String typeOfSample = (String) dynaForm.get("typeOfSampleDesc");
if (!StringUtil.isNullorNill(typeOfSample)) {
HumanSampleTypeValidationProvider typeValidator = new HumanSampleTypeValidationProvider();
result = typeValidator.validate((String) dynaForm
.get("typeOfSampleDesc"));
messageKey = "sampleitem.typeOfSample";
if (result.equals("invalid")) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
} else {
ActionError error = new ActionError("errors.required",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
// sample source validation against database (reusing ajax validation
// logic
HumanSampleSourceValidationProvider sourceValidator = new HumanSampleSourceValidationProvider();
result = sourceValidator.validate((String) dynaForm
.get("sourceOfSampleDesc"));
messageKey = "sampleitem.sourceOfSample";
if (result.equals("invalid")) {
ActionError error = new ActionError("errors.invalid",
getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
return errors;
}
}