/**
* 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.result.action;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.Globals;
import org.apache.struts.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.analyte.valueholder.Analyte;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.exception.LIMSCannotDeleteDependentRecordExistsException;
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.ResultsValueValidationProvider;
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.dictionary.dao.DictionaryDAO;
import us.mn.state.health.lims.dictionary.daoimpl.DictionaryDAOImpl;
import us.mn.state.health.lims.dictionary.valueholder.Dictionary;
import us.mn.state.health.lims.hibernate.HibernateUtil;
import us.mn.state.health.lims.login.valueholder.UserSessionData;
import us.mn.state.health.lims.note.dao.NoteDAO;
import us.mn.state.health.lims.note.daoimpl.NoteDAOImpl;
import us.mn.state.health.lims.note.valueholder.Note;
import us.mn.state.health.lims.referencetables.valueholder.ReferenceTables;
import us.mn.state.health.lims.result.dao.ResultDAO;
import us.mn.state.health.lims.result.daoimpl.ResultDAOImpl;
import us.mn.state.health.lims.result.valueholder.Result;
import us.mn.state.health.lims.result.valueholder.TestAnalyte_TestResults;
import us.mn.state.health.lims.result.valueholder.Test_TestAnalyte;
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.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.testanalyte.dao.TestAnalyteDAO;
import us.mn.state.health.lims.testanalyte.daoimpl.TestAnalyteDAOImpl;
import us.mn.state.health.lims.testanalyte.valueholder.TestAnalyte;
import us.mn.state.health.lims.testresult.dao.TestResultDAO;
import us.mn.state.health.lims.testresult.daoimpl.TestResultDAOImpl;
import us.mn.state.health.lims.testresult.valueholder.TestResult;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
/**
* @author diane benz
* //AIS - bugzilla 1797
//AIS - bugzilla 1891
* //bugzilla 1802 - results entry redesign
* bugzilla 1942 status changes
* 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 ResultsEntryUpdateAction extends ResultsEntryBaseAction {
private boolean isNew = false;
protected ActionForward performAction(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// this is used if user has clicked notes icon and decides to update
// (all results get updated, but we need to know which results to
// display notes for)
String notesAnalyteId = (String) request.getParameter("analyteId");
String notesRefId = null;
String forward = FWD_SUCCESS;
request.setAttribute(ALLOW_EDITS_KEY, "true");
request.setAttribute(PREVIOUS_DISABLED, "true");
request.setAttribute(NEXT_DISABLED, "true");
String refId = null;
if (request.getAttribute(NOTES_REFID) != null) {
refId = (String) request.getAttribute(NOTES_REFID);
}
//bugzilla 2227
String amendedAnalysisId = null;
if (request.getParameter(ANALYSIS_ID) != null) {
amendedAnalysisId = (String) request.getParameter(ANALYSIS_ID);
}
BaseActionForm dynaForm = (BaseActionForm) form;
String accessionNumber = (String) dynaForm.get("accessionNumber");
String[] selectedTestResultIds = (String[]) dynaForm
.get("selectedTestResultIds");
String[] resultValueN = (String[]) dynaForm.get("resultValueN");
String[] selectedResultIsReportableFlags = (String[]) dynaForm
.get("selectedResultIsReportableFlags");
List testTestAnalytes = (List) dynaForm.get("testTestAnalytes");
String addedReflexTestIds = (String) dynaForm.get("addedReflexTestIds");
String addedReflexTestParentResultIds = (String) dynaForm
.get("addedReflexTestParentResultIds");
// bugzilla 1882
String addedReflexTestParentAnalyteIds = (String) dynaForm
.get("addedReflexTestParentAnalyteIds");
String addedReflexTestParentAnalysisIds = (String) dynaForm
.get("addedReflexTestParentAnalysisIds");
String[] selectedTestIsReportableFlags = (String[]) dynaForm
.get("selectedTestIsReportableFlags");
String domain = (String) dynaForm.get("domain");
//bugzilla 2254
String hasNewUnsatisfactoryResult = (String) dynaForm.get("hasNewUnsatisfactoryResult");
//bugzilla 1798: if coming from popup to link a parent test - this will have information
String linkedParentInformationString = (String) dynaForm.get("linkedParentInformationString");
//bugzilla 1798: if User has clicked UNLINK FROM PARENT this string will have information
String unlinkedParentInformationString = (String) dynaForm.get("unlinkedParentInformationString");
int pageResultCounter = 0;
for (int j = 0; j < testTestAnalytes.size(); j++) {
Test_TestAnalyte testTestAnalyte = (Test_TestAnalyte) testTestAnalytes
.get(j);
TestAnalyte_TestResults[] testAnalyteTestResults = (TestAnalyte_TestResults[]) testTestAnalyte
.getTestAnalyteTestResults();
// remove the testresultid added by default for those numeric types
for (int i = 0; i < testAnalyteTestResults.length; i++) {
TestAnalyte_TestResults taTr = (TestAnalyte_TestResults) testAnalyteTestResults[i];
List testResults = taTr.getTestResults();
//bugzila 1908 fixing a bug where null and size not checked (this was found while testing 1908)
if (testResults != null && testResults.size() > 0) {
TestResult testresult = (TestResult) testResults.get(0);
//bugzilla 2220 - Added titer type results to this logic (numeric and titer are in one category)
if (testresult.getTestResultType().equalsIgnoreCase(SystemConfiguration.getInstance().getNumericType()) ||
testresult.getTestResultType().equalsIgnoreCase(SystemConfiguration.getInstance().getTiterType())) {
if (StringUtil.isNullorNill(resultValueN[pageResultCounter])) {
selectedTestResultIds[pageResultCounter] = "";
}
}
}
pageResultCounter++;
}
}
// server side validation of accessionNumber
// validate on server-side sample accession number
ActionMessages errors = null;
try {
errors = new ActionMessages();
errors = validateAll(request, errors, dynaForm);
// System.out.println("Just validated accessionNumber");
} catch (Exception e) {
//bugzilla 2154
LogEvent.logError("ResultsEntryUpdateAction","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);
//bugzilla 2361
if (domain.equals(SystemConfiguration.getInstance().getHumanDomain())) {
return mapping.findForward(FWD_FAIL_HUMAN);
} else {
return mapping.findForward(FWD_FAIL);
}
}
// initialize the form
dynaForm.initialize(mapping);
// 1926 get sysUserId from login module
UserSessionData usd = (UserSessionData)request.getSession().getAttribute(USER_SESSION_DATA);
String sysUserId = String.valueOf(usd.getSystemUserId());
Date today = Calendar.getInstance().getTime();
String dateAsText = DateUtil.formatDateAsText(today);
org.hibernate.Transaction tx = HibernateUtil.getSession()
.beginTransaction();
if (!StringUtil.isNullorNill(accessionNumber)) {
ResultDAO resultDAO = new ResultDAOImpl();
TestResultDAO testResultDAO = new TestResultDAOImpl();
AnalysisDAO analysisDAO = new AnalysisDAOImpl();
TestDAO testDAO = new TestDAOImpl();
NoteDAO noteDAO = new NoteDAOImpl();
TestAnalyteDAO testAnalyteDAO = new TestAnalyteDAOImpl();
SampleDAO sampleDAO = new SampleDAOImpl();
DictionaryDAO dictDAO = new DictionaryDAOImpl();
try {
//bugzilla 1798 (added functionality to link a parent test to child test)
//parse data from popup (link test) for subsequent update of child analysis
String childAnalysisId = "";
Analysis linkedParentAnalysis = new Analysis();
Result linkedParentResult = new Result();
if (!StringUtil.isNullorNill(linkedParentInformationString)) {
String idSeparator = SystemConfiguration.getInstance()
.getDefaultIdSeparator();
StringTokenizer st = new StringTokenizer(linkedParentInformationString, idSeparator);
String parentAnalysisId = "";
String parentResultId = "";
List listOfIds = new ArrayList();
while (st.hasMoreElements()) {
String id = (String) st.nextElement();
listOfIds.add(id);
}
//see resultsEntryLinkChildTestToParentTestResultPopup.jsp
childAnalysisId = (String)listOfIds.get(0);
parentAnalysisId = (String)listOfIds.get(1);
parentResultId = (String)listOfIds.get(2);
linkedParentAnalysis.setId(parentAnalysisId);
linkedParentResult.setId(parentResultId);
analysisDAO.getData(linkedParentAnalysis);
resultDAO.getData(linkedParentResult);
}
//end 1798
Sample sample = new Sample();
sample.setAccessionNumber(accessionNumber);
sample = sampleDAO.getSampleByAccessionNumber(accessionNumber);
int pageResultIndex = 0;
// pre-process the reflex tests
List listOfTestsThatTriggeredReflex = new ArrayList();
List listOfTestResultsThatTriggeredReflex = new ArrayList();
// bugzilla 1882
List listOfAnalytesThatTriggeredReflex = new ArrayList();
List listOfAnalysesThatTriggeredReflex = new ArrayList();
List listOfResultsThatTriggeredReflex = new ArrayList();
List listOfAddedTests = new ArrayList();
if (!StringUtil.isNullorNill(addedReflexTestIds)
&& !StringUtil
.isNullorNill(addedReflexTestParentResultIds)) {
String idSeparator = SystemConfiguration.getInstance()
.getDefaultIdSeparator();
// populate list of parent results
StringTokenizer parentResultTokenizer = new StringTokenizer(
addedReflexTestParentResultIds, idSeparator);
while (parentResultTokenizer.hasMoreElements()) {
String testResultId = (String) parentResultTokenizer
.nextElement();
TestResult testResult = new TestResult();
testResult.setId(testResultId);
testResultDAO.getData(testResult);
listOfTestResultsThatTriggeredReflex.add(testResult);
String testId = testResult.getTest().getId();
listOfTestsThatTriggeredReflex.add(testId);
}
StringTokenizer addedTestTokenizer = new StringTokenizer(
addedReflexTestIds, idSeparator);
while (addedTestTokenizer.hasMoreElements()) {
String testId = (String) addedTestTokenizer
.nextElement();
// System.out
// .println("This is a addedTestToken " + testId);
Test test = new Test();
test.setId(testId);
testDAO.getData(test);
listOfAddedTests.add(test);
}
// bugzilla 1882 populate list of parent analytes
StringTokenizer parentAnalyteTokenizer = new StringTokenizer(
addedReflexTestParentAnalyteIds, idSeparator);
while (parentAnalyteTokenizer.hasMoreElements()) {
String testAnalyteId = (String) parentAnalyteTokenizer
.nextElement();
TestAnalyte testAnalyte = new TestAnalyte();
testAnalyte.setId(testAnalyteId);
testAnalyteDAO.getData(testAnalyte);
listOfAnalytesThatTriggeredReflex.add(testAnalyte);
}
// bugzilla 1882 populate list of parent analyses
StringTokenizer parentAnalysisTokenizer = new StringTokenizer(
addedReflexTestParentAnalysisIds, idSeparator);
while (parentAnalysisTokenizer.hasMoreElements()) {
String analysisId2 = (String) parentAnalysisTokenizer
.nextElement();
Analysis analysis2 = new Analysis();
analysis2.setId(analysisId2);
listOfAnalysesThatTriggeredReflex.add(analysis2);
}
}
for (int x = 0; x < testTestAnalytes.size(); x++) {
Test_TestAnalyte test_testAnalyte = (Test_TestAnalyte) testTestAnalytes
.get(x);
TestAnalyte_TestResults[] testAnalyteTestResults = (TestAnalyte_TestResults[]) test_testAnalyte
.getTestAnalyteTestResults();
Analysis analysis = test_testAnalyte.getAnalysis();
//bugzilla 1942 (if results for all REQUIRED test analytes have been entered then results entry is considered complete)
boolean areResultsForRequiredTestAnalytesEntered = true;
//bugzilla 1942 completedDate on analysis should only be update if
// results entry is completed = areResultsForRequiredTestAnalytesEntered is true
// AND if at least one result has changed
boolean atLeastOneRequiredResultHasChanged = false;
for (int i = 0; i < testAnalyteTestResults.length; i++) {
TestAnalyte_TestResults taTr = (TestAnalyte_TestResults) testAnalyteTestResults[i];
String selectedTestResultId = taTr
.getSelectedTestResultId();
TestAnalyte ta = taTr.getTestAnalyte();
Result result = new Result();
Result[] resultsFromTestTestAnalyte = test_testAnalyte
.getResults();
for (int j = 0; j < resultsFromTestTestAnalyte.length; j++) {
Result res = (Result) resultsFromTestTestAnalyte[j];
if (res != null
&& !StringUtil.isNullorNill(res.getId())) {
if (res.getAnalyte().getId().equals(
ta.getAnalyte().getId())) {
result = res;
break;
}
}
}
// bugzilla 1926
result.setSysUserId(sysUserId);
//bugzilla 1942
boolean noResult = true;
if (!StringUtil.isNullorNill(selectedTestResultId)) {
if (!StringUtil
.isNullorNill(selectedTestResultIds[pageResultIndex])) {
noResult = false;
TestResult tr = new TestResult();
tr.setId(selectedTestResultIds[pageResultIndex]);
testResultDAO.getData(tr);
//bugzilla 1942: find out if required results have changed on this test (needed to determine whether to update completed date)
if (result.getIsReportable() != null && result.getIsReportable().equals(YES)) {
if (result.getTestResult() != null && !StringUtil.isNullorNill(result.getTestResult().getValue())) {
String oldResult = result.getTestResult().getValue();
if (!oldResult.equals(tr.getValue())) {
atLeastOneRequiredResultHasChanged = true;
}
}
}
// update existing selection
result.setTestResult(tr);
if (tr.getTestResultType()
.equalsIgnoreCase(SystemConfiguration.getInstance().getNumericType())) {
result.setValue(resultValueN[pageResultIndex]);
} else if (tr.getTestResultType()
.equalsIgnoreCase(SystemConfiguration.getInstance().getTiterType())){
String setTiter = "1:"+ resultValueN[pageResultIndex];
result.setValue(setTiter);
} else {
result.setValue(tr.getValue());
//bugzilla 2028 check for UNSATISFACTORY dictionary type results
// get from dictionary
Dictionary dictionary = new Dictionary();
dictionary.setId(result.getValue());
dictDAO.getData(dictionary);
}
result.setAnalysis(analysis);
result
.setIsReportable(selectedResultIsReportableFlags[pageResultIndex]);
if (!StringUtil.isNullorNill(notesAnalyteId)) {
if (result.getAnalyte().getId().equals(
notesAnalyteId)) {
notesRefId = result.getId();
}
}
resultDAO.updateData(result);
} else {
// bugzilla 1942: delete existing result
List results = new ArrayList();
//bugzilla 1942 check if result has notes - THEN DON'T ALLOW DELETE (per Christina/Nancy)
Note note = new Note();
List notesByResult = new ArrayList();
//bugzilla 2571 go through ReferenceTablesDAO to get reference tables info
ReferenceTables referenceTables = new ReferenceTables();
referenceTables.setId(SystemConfiguration
.getInstance()
.getResultReferenceTableId());
//bugzilla 2571 go through ReferenceTablesDAO to get reference tables info
note
.setReferenceTables(referenceTables);
note.setReferenceId(result.getId());
notesByResult = noteDAO
.getAllNotesByRefIdRefTable(note);
//bugzilla 1798
List childAnalysesByResult = new ArrayList();
childAnalysesByResult = analysisDAO.getAllChildAnalysesByResult(result);
if (notesByResult != null && notesByResult.size() > 0) {
Exception e = new LIMSCannotDeleteDependentRecordExistsException(
"Cannot delete - dependent record exists for "
+ result.getId());
throw new LIMSRuntimeException(
"Error in Result updateData()", e);
}
//bugzilla 1798
else if (childAnalysesByResult != null && childAnalysesByResult.size() > 0) {
Exception e = new LIMSCannotDeleteDependentRecordExistsException(
"Cannot delete - dependent record exists for "
+ result.getId());
throw new LIMSRuntimeException(
"Error in Result updateData()", e);
} else {
results.add(result);
resultDAO.deleteData(results);
}
}
} else {
if (!StringUtil
.isNullorNill(selectedTestResultIds[pageResultIndex])) {
// insert new result
noResult = false;
TestResult tr = new TestResult();
tr.setId(selectedTestResultIds[pageResultIndex]);
testResultDAO.getData(tr);
// insert
Analyte analyte = ta.getAnalyte();
result.setAnalyte(analyte);
result.setAnalysis(analysis);
result.setTestResult(tr);
if (tr.getTestResultType()
.equalsIgnoreCase(SystemConfiguration.getInstance().getNumericType())) {
result.setValue(resultValueN[pageResultIndex]);
} else if (tr.getTestResultType()
.equalsIgnoreCase(SystemConfiguration.getInstance().getTiterType())) {
String setTiter = "1:"+ resultValueN[pageResultIndex];
result.setValue(setTiter);
} else {
result.setValue(tr.getValue());
//bugzilla 2028 check for UNSATISFACTORY dictionary type results
// get from dictionary
Dictionary dictionary = new Dictionary();
dictionary.setId(result.getValue());
dictDAO.getData(dictionary);
}
result.setResultType(tr.getTestResultType());
result
.setIsReportable(selectedResultIsReportableFlags[pageResultIndex]);
result.setSortOrder(ta.getSortOrder());
//bugzilla 1942: find out if required results have changed on this test (needed to determine whether to update completed date)
//this result has changed for sure
if (ta.getIsReportable() != null && ta.getIsReportable().equals(YES)) {
atLeastOneRequiredResultHasChanged = true;
}
resultDAO.insertData(result);
// need to add this new result to
// test_testAnalyte
// for display on right side of screen after
// update
// on route to notes popup
resultsFromTestTestAnalyte[i] = result;
test_testAnalyte
.setResults(resultsFromTestTestAnalyte);
if (!StringUtil.isNullorNill(notesAnalyteId)) {
if (result.getAnalyte().getId().equals(
notesAnalyteId)) {
notesRefId = result.getId();
}
}
} else {
// do nothing
}
}
//bugzilla 1942 (if results for all REQUIRED test analytes have been entered then results entry is considered complete)
// per Christina - all reportable results must have a value for a test otherwise results entry is not completed
// need to check test_analyte for isReportable flag if there is NO result record
if (noResult && !StringUtil.isNullorNill(ta.getIsReportable()) && ta.getIsReportable().equals(YES)){
areResultsForRequiredTestAnalytesEntered = false;
}
// if this is analyte that notes icon was selected for
// then
// set the result id (IActionConstants.NOTES_REFID) in
// the
// request
// this can be used in NotesPopupAction
pageResultIndex++;
}
// bugzilla 1926
analysis.setSysUserId(sysUserId);
analysis.setIsReportable(selectedTestIsReportableFlags[x]);
//bugzilla 1942 (if results for all REQUIRED test analytes have been entered then results entry is considered complete)
if (areResultsForRequiredTestAnalytesEntered) {
//bugzilla 1967 only if not already released
//bugzilla 1942 AND if at least one result has changed
if (!analysis.getStatus().equals(SystemConfiguration.getInstance().getAnalysisStatusReleased()) &&
atLeastOneRequiredResultHasChanged) {
analysis.setStatus(SystemConfiguration.getInstance()
.getAnalysisStatusResultCompleted());
analysis.setCompletedDateForDisplay(dateAsText);
}
} else {
analysis.setStatus(SystemConfiguration.getInstance()
.getAnalysisStatusAssigned());
analysis.setCompletedDateForDisplay(null);
}
//bugzilla 1798 also update parent analysis/parent result if link was requested for this analysis
//link
if (!StringUtil.isNullorNill(linkedParentInformationString) && childAnalysisId.equals(analysis.getId())) {
analysis.setParentAnalysis(linkedParentAnalysis);
analysis.setParentResult(linkedParentResult);
}
//unlink
if (!StringUtil.isNullorNill(unlinkedParentInformationString) && unlinkedParentInformationString.equals(analysis.getId())) {
analysis.setParentAnalysis(null);
analysis.setParentResult(null);
}
analysisDAO.updateData(analysis);
}
// bugzilla 1882
if (listOfAnalytesThatTriggeredReflex.size() > 0) {
//create listOfResultsThatTriggeredReflex from analysis/analyte
for (int i = 0; i < listOfAnalysesThatTriggeredReflex
.size(); i++) {
Analysis analysisThatTriggered = (Analysis) listOfAnalysesThatTriggeredReflex
.get(i);
TestAnalyte analyteThatTriggered = (TestAnalyte) listOfAnalytesThatTriggeredReflex
.get(i);
Result result = new Result();
resultDAO.getResultByAnalysisAndAnalyte(result,
analysisThatTriggered, analyteThatTriggered);
listOfResultsThatTriggeredReflex.add(result);
}
// Are there any added tests (reflex tests)
for (int i = 0; i < listOfAnalytesThatTriggeredReflex
.size(); i++) {
Analysis analysisThatTriggered = (Analysis) listOfAnalysesThatTriggeredReflex
.get(i);
analysisDAO.getData(analysisThatTriggered);
TestAnalyte analyteThatTriggered = (TestAnalyte) listOfAnalytesThatTriggeredReflex
.get(i);
Result result = (Result) listOfResultsThatTriggeredReflex
.get(i);
Test test = (Test) listOfAddedTests.get(i);
Analysis newAnalysis = new Analysis();
// TODO: need to populate this with actual data!!!
newAnalysis.setAnalysisType("TEST");
newAnalysis.setSampleItem(analysisThatTriggered.getSampleItem());
newAnalysis.setTest(test);
newAnalysis.setTestSection(test.getTestSection());
newAnalysis.setStatus(SystemConfiguration.getInstance()
.getAnalysisStatusAssigned());
newAnalysis.setParentAnalysis(analysisThatTriggered);
newAnalysis.setParentResult(result);
newAnalysis.setIsReportable(test.getIsReportable());
// bugzilla 1926
newAnalysis.setSysUserId(sysUserId);
//bugzilla 2064
newAnalysis.setRevision(SystemConfiguration.getInstance().getAnalysisDefaultRevision());
//bugzilla 2013 added duplicateCheck parameter
analysisDAO.insertData(newAnalysis, false);
}
}
tx.commit();
// bugzilla 1703: introducing a confirmation message after
// updates and inserts have succeeded!
errors = new ActionMessages();
ActionError error = null;
error = new ActionError("resultsentry.confirmupdate.message",
null, null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
saveErrors(request, errors);
request.setAttribute(Globals.ERROR_KEY, errors);
// end bugzilla 1703
} catch (LIMSRuntimeException lre) {
//bugzilla 2154
LogEvent.logError("ResultsEntryUpdateAction","performAction()",lre.toString());
tx.rollback();
errors = new ActionMessages();
ActionError error = null;
if (lre.getException() instanceof org.hibernate.StaleObjectStateException) {
error = new ActionError("errors.OptimisticLockException",
null, null);
} else if (lre.getException() instanceof LIMSCannotDeleteDependentRecordExistsException) {
error = new ActionError(
"resultsentry.changetonoresult.error", 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);
// bugzilla 1485
// request.setAttribute(IActionConstants.ALLOW_EDITS_KEY,
// "false");
//bugzilla 2361
if (domain.equals(SystemConfiguration.getInstance().getHumanDomain())) {
forward = FWD_FAIL_HUMAN;
} else {
forward = FWD_FAIL;
}
} finally {
HibernateUtil.closeSession();
}
}
PropertyUtils.setProperty(dynaForm, "accessionNumber", accessionNumber);
PropertyUtils.setProperty(dynaForm, "selectedTestResultIds",
selectedTestResultIds);
PropertyUtils.setProperty(dynaForm, "resultValueN", resultValueN);
PropertyUtils.setProperty(dynaForm, "selectedResultIsReportableFlags",
selectedResultIsReportableFlags);
PropertyUtils.setProperty(dynaForm, "selectedTestIsReportableFlags",
selectedTestIsReportableFlags);
PropertyUtils.setProperty(dynaForm, "domain", domain);
PropertyUtils.setProperty(dynaForm, "testTestAnalytes",
testTestAnalytes);
if (!StringUtil.isNullorNill(notesAnalyteId)) {
request.setAttribute(NOTES_REFID, notesRefId);
request.setAttribute(NOTES_REFTABLE,
SystemConfiguration.getInstance()
.getResultReferenceTableId());
} else {
request.setAttribute(NOTES_REFID, refId);
request.setAttribute(NOTES_REFTABLE,
SystemConfiguration.getInstance()
.getResultReferenceTableId());
}
//bugzilla 2311
//bugzilla 2361
if (!forward.equals(FWD_FAIL) && !forward.equals(FWD_FAIL_HUMAN)) {
//bugzilla 2028 Qa Events - if any of the results are UNSATISFACTORY then route to QAEvents Entry
//bugzilla 2227 - don't route to qa events if Note or Amend were clicked
//bugzilla 2254
if (hasNewUnsatisfactoryResult.equals(TRUE) && !mapping.getPath().contains("Note") && !mapping.getPath().contains("Amend")) {
forward = FWD_SUCCESS_QA_EVENTS_ENTRY;
return getForward(mapping.findForward(forward), accessionNumber);
}
//bugzilla 2227
if (!StringUtil.isNullorNill(amendedAnalysisId)) {
return getForward(mapping.findForward(forward), accessionNumber, amendedAnalysisId);
}
}
return mapping.findForward(forward);
}
protected String getPageTitleKey() {
if (isNew) {
return "resultsentry.add.title";
} else {
return "resultsentry.edit.title";
}
}
protected String getPageTitleKeyParameter(HttpServletRequest request,
ActionForm form) {
BaseActionForm dynaForm = (BaseActionForm) form;
String accn = "";
if (dynaForm.get("accessionNumber") != null) {
accn = (String) dynaForm.get("accessionNumber");
}
return accn;
}
protected String getPageSubtitleKey() {
if (isNew) {
return "resultsentry.add.subtitle";
} else {
return "resultsentry.edit.subtitle";
}
}
//bugzilla 2028
protected ActionForward getForward(ActionForward forward, String accessionNumber) {
ActionRedirect redirect = new ActionRedirect(forward);
if (!StringUtil.isNullorNill(accessionNumber))
redirect.addParameter(ACCESSION_NUMBER, accessionNumber);
return redirect;
}
protected ActionForward getForward(ActionForward forward, String accessionNumber, String analysisId) {
ActionRedirect redirect = new ActionRedirect(forward);
if (!StringUtil.isNullorNill(accessionNumber))
redirect.addParameter(ACCESSION_NUMBER, accessionNumber);
if (!StringUtil.isNullorNill(analysisId))
redirect.addParameter(ANALYSIS_ID, analysisId);
return redirect;
}
//2227
//1856: cleanup - this method does not need to be in BaseAction
private ActionMessages validateAll(HttpServletRequest request,
ActionMessages errors, BaseActionForm dynaForm) throws Exception {
// accession number validation against database (reusing ajax
// validation logic)
errors = validateAccessionNumber(request, errors, dynaForm);
String messageKey = "";
// isReportableFlag must be set if a result was selected
List testTestAnalytes = (List) dynaForm.get("testTestAnalytes");
String[] selectedTestResultIds = (String[]) dynaForm
.get("selectedTestResultIds");
String[] selectedResultIsReportableFlags = (String[]) dynaForm
.get("selectedResultIsReportableFlags");
for (int j = 0; j < testTestAnalytes.size(); j++) {
Test_TestAnalyte testTestAnalyte = (Test_TestAnalyte) testTestAnalytes
.get(j);
TestAnalyte_TestResults[] testAnalyteTestResults = (TestAnalyte_TestResults[]) testTestAnalyte
.getTestAnalyteTestResults();
for (int i = 0; i < testAnalyteTestResults.length; i++) {
TestAnalyte_TestResults taTr = (TestAnalyte_TestResults) testAnalyteTestResults[i];
String selectedTestResultId = taTr.getSelectedTestResultId();
if (!StringUtil.isNullorNill(selectedTestResultId)) {
if (!StringUtil.isNullorNill(selectedTestResultIds[i])) {
if (StringUtil
.isNullorNill(selectedResultIsReportableFlags[i])) {
messageKey = "result.isReportable";
ActionError error = new ActionError(
"errors.invalid", getMessageForKey(messageKey), null);
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
}
}
}
}
// verify if "N" type values are validated
String[] resultValueN = (String[]) dynaForm.get("resultValueN");
ResultsValueValidationProvider resultsValueValidator = new ResultsValueValidationProvider();
//bugzilla 2347, 2361 fix error message handling
for (int i = 0; i < resultValueN.length; i++) {
//bugzilla 2016: added bug fix where we were not checking to make sure selectedTestResultIds[i] is not null before validating
//bugzilla 2439 need to check for null resultValueN[i] - best to use StringUtil.isNullorNill()
if ((!StringUtil.isNullorNill(resultValueN[i]) && !resultValueN[i].equalsIgnoreCase("-1"))
&& !StringUtil.isNullorNill(selectedTestResultIds[i])) {
String message = resultsValueValidator.validate(
resultValueN[i], selectedTestResultIds[i], null);
String[] msgArray = message.split(SystemConfiguration.getInstance().getDefaultIdSeparator());
String errorMess = msgArray[0];
if (errorMess.equalsIgnoreCase("invalid")) {
ActionError error = null;
if (msgArray[1].equals(SystemConfiguration.getInstance().getTiterType())) {
error = new ActionError("resultsentry.invalidresultvalue.titer.message",
msgArray[2], msgArray[3], null);
} else {
error = new ActionError("resultsentry.invalidresultvalue.numeric.message",
msgArray[2], msgArray[3], null);
}
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
}
}
}
return errors;
}
}