Java tutorial
/** * 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) CIRG, University of Washington, Seattle WA. All Rights Reserved. * */ package us.mn.state.health.lims.result.action; import org.apache.commons.validator.GenericValidator; import org.apache.struts.Globals; import org.apache.struts.action.*; import org.hibernate.StaleObjectStateException; import org.hibernate.Transaction; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; 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.common.action.BaseAction; import us.mn.state.health.lims.common.action.BaseActionForm; import us.mn.state.health.lims.common.action.IActionConstants; import us.mn.state.health.lims.common.exception.LIMSRuntimeException; import us.mn.state.health.lims.common.formfields.FormFields; import us.mn.state.health.lims.common.formfields.FormFields.Field; import us.mn.state.health.lims.common.services.*; import us.mn.state.health.lims.common.services.DisplayListService.ListType; import us.mn.state.health.lims.common.services.NoteService.NoteType; import us.mn.state.health.lims.common.services.StatusService.AnalysisStatus; import us.mn.state.health.lims.common.services.StatusService.OrderStatus; import us.mn.state.health.lims.common.services.beanAdapters.ResultSaveBeanAdapter; import us.mn.state.health.lims.common.services.registration.ResultUpdateRegister; import us.mn.state.health.lims.common.services.registration.interfaces.IResultUpdate; import us.mn.state.health.lims.common.services.serviceBeans.ResultSaveBean; 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.common.util.DateUtil; import us.mn.state.health.lims.common.util.IdValuePair; import us.mn.state.health.lims.common.util.StringUtil; import us.mn.state.health.lims.common.util.validator.ActionError; import us.mn.state.health.lims.hibernate.HibernateUtil; 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.patient.valueholder.Patient; import us.mn.state.health.lims.referral.dao.ReferralDAO; import us.mn.state.health.lims.referral.dao.ReferralResultDAO; import us.mn.state.health.lims.referral.dao.ReferralTypeDAO; import us.mn.state.health.lims.referral.daoimpl.ReferralDAOImpl; import us.mn.state.health.lims.referral.daoimpl.ReferralResultDAOImpl; import us.mn.state.health.lims.referral.daoimpl.ReferralTypeDAOImpl; import us.mn.state.health.lims.referral.valueholder.Referral; import us.mn.state.health.lims.referral.valueholder.ReferralResult; import us.mn.state.health.lims.referral.valueholder.ReferralType; import us.mn.state.health.lims.result.action.util.*; import us.mn.state.health.lims.result.dao.ResultDAO; import us.mn.state.health.lims.result.dao.ResultInventoryDAO; import us.mn.state.health.lims.result.dao.ResultSignatureDAO; import us.mn.state.health.lims.result.daoimpl.ResultDAOImpl; import us.mn.state.health.lims.result.daoimpl.ResultInventoryDAOImpl; import us.mn.state.health.lims.result.daoimpl.ResultSignatureDAOImpl; import us.mn.state.health.lims.result.valueholder.Result; import us.mn.state.health.lims.result.valueholder.ResultInventory; import us.mn.state.health.lims.result.valueholder.ResultSignature; import us.mn.state.health.lims.resultlimits.dao.ResultLimitDAO; import us.mn.state.health.lims.resultlimits.daoimpl.ResultLimitDAOImpl; import us.mn.state.health.lims.resultlimits.valueholder.ResultLimit; 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.beanItems.TestResultItem; import us.mn.state.health.lims.testreflex.action.util.TestReflexBean; import us.mn.state.health.lims.testreflex.action.util.TestReflexUtil; import us.mn.state.health.lims.typeoftestresult.valueholder.TypeOfTestResult.ResultType; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.sql.Timestamp; import java.util.*; public class ResultsLogbookUpdateAction extends BaseAction { private AnalysisDAO analysisDAO = new AnalysisDAOImpl(); private ResultDAO resultDAO = new ResultDAOImpl(); private ResultSignatureDAO resultSigDAO = new ResultSignatureDAOImpl(); private ResultInventoryDAO resultInventoryDAO = new ResultInventoryDAOImpl(); private NoteDAO noteDAO = new NoteDAOImpl(); private SampleDAO sampleDAO = new SampleDAOImpl(); private ReferralDAO referralDAO = new ReferralDAOImpl(); private ReferralResultDAO referralResultDAO = new ReferralResultDAOImpl(); private ResultLimitDAO resultLimitDAO = new ResultLimitDAOImpl(); private static final String RESULT_SUBJECT = "Result Note"; private static String REFERRAL_CONFORMATION_ID; private boolean useTechnicianName = ConfigurationProperties.getInstance() .isPropertyValueEqual(Property.resultTechnicianName, "true"); private boolean alwaysValidate = ConfigurationProperties.getInstance() .isPropertyValueEqual(Property.ALWAYS_VALIDATE_RESULTS, "true"); private boolean supportReferrals = FormFields.getInstance().useField(Field.ResultsReferral); private String statusRuleSet = ConfigurationProperties.getInstance() .getPropertyValueUpperCase(Property.StatusRules); static { ReferralTypeDAO referralTypeDAO = new ReferralTypeDAOImpl(); ReferralType referralType = referralTypeDAO.getReferralTypeByName("Confirmation"); if (referralType != null) { REFERRAL_CONFORMATION_ID = referralType.getId(); } } protected ActionForward performAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String forward = FWD_SUCCESS; List<IResultUpdate> updaters = ResultUpdateRegister.getRegisteredUpdaters(); BaseActionForm dynaForm = (BaseActionForm) form; ResultsPaging paging = new ResultsPaging(); paging.updatePagedResults(request, dynaForm); List<TestResultItem> tests = paging.getResults(request); ResultsUpdateDataSet actionDataSet = new ResultsUpdateDataSet(currentUserId); actionDataSet.filterModifiedItems(tests); ActionMessages errors = actionDataSet.validateModifiedItems(); if (errors.size() > 0) { saveErrors(request, errors); request.setAttribute(Globals.ERROR_KEY, errors); return mapping.findForward(FWD_VALIDATION_ERROR); } createResultsFromItems(actionDataSet); createAnalysisOnlyUpdates(actionDataSet); Transaction tx = HibernateUtil.getSession().beginTransaction(); try { for (Note note : actionDataSet.getNoteList()) { noteDAO.insertData(note); } for (ResultSet resultSet : actionDataSet.getNewResults()) { resultDAO.insertData(resultSet.result); if (resultSet.signature != null) { resultSet.signature.setResultId(resultSet.result.getId()); resultSigDAO.insertData(resultSet.signature); } if (resultSet.testKit != null && resultSet.testKit.getInventoryLocationId() != null) { resultSet.testKit.setResultId(resultSet.result.getId()); resultInventoryDAO.insertData(resultSet.testKit); } } for (Referral referral : actionDataSet.getSavableReferrals()) { if (referral != null) { saveReferralsWithRequiredObjects(referral); } } for (ResultSet resultSet : actionDataSet.getModifiedResults()) { resultDAO.updateData(resultSet.result); if (resultSet.signature != null) { resultSet.signature.setResultId(resultSet.result.getId()); if (resultSet.alwaysInsertSignature) { resultSigDAO.insertData(resultSet.signature); } else { resultSigDAO.updateData(resultSet.signature); } } if (resultSet.testKit != null && resultSet.testKit.getInventoryLocationId() != null) { resultSet.testKit.setResultId(resultSet.result.getId()); if (resultSet.testKit.getId() == null) { resultInventoryDAO.insertData(resultSet.testKit); } else { resultInventoryDAO.updateData(resultSet.testKit); } } } for (Analysis analysis : actionDataSet.getModifiedAnalysis()) { analysisDAO.updateData(analysis); } ResultSaveService.removeDeletedResultsInTransaction(actionDataSet.getDeletableResults(), currentUserId); setTestReflexes(actionDataSet); setSampleStatus(actionDataSet); for (IResultUpdate updater : updaters) { updater.transactionalUpdate(actionDataSet); } tx.commit(); } catch (LIMSRuntimeException lre) { tx.rollback(); ActionError error; if (lre.getException() instanceof StaleObjectStateException) { error = new ActionError("errors.OptimisticLockException", null, null); } else { lre.printStackTrace(); error = new ActionError("errors.UpdateException", null, null); } errors.add(ActionMessages.GLOBAL_MESSAGE, error); saveErrors(request, errors); request.setAttribute(Globals.ERROR_KEY, errors); return mapping.findForward(FWD_FAIL); } for (IResultUpdate updater : updaters) { updater.postTransactionalCommitUpdate(actionDataSet); } setSuccessFlag(request, forward); if (GenericValidator.isBlankOrNull(dynaForm.getString("logbookType"))) { return mapping.findForward(forward); } else { Map<String, String> params = new HashMap<String, String>(); params.put("type", dynaForm.getString("logbookType")); params.put("forward", forward); return getForwardWithParameters(mapping.findForward(forward), params); } } private void saveReferralsWithRequiredObjects(Referral referral) { if (referral.getId() != null) { referralDAO.updateData(referral); } else { referralDAO.insertData(referral); ReferralResult referralResult = new ReferralResult(); referralResult.setReferralId(referral.getId()); referralResult.setSysUserId(currentUserId); referralResultDAO.insertData(referralResult); } } protected void setTestReflexes(ResultsUpdateDataSet actionDataSet) { TestReflexUtil testReflexUtil = new TestReflexUtil(); testReflexUtil.setCurrentUserId(currentUserId); testReflexUtil.addNewTestsToDBForReflexTests(convertToTestReflexBeanList(actionDataSet.getNewResults())); testReflexUtil.updateModifiedReflexes(convertToTestReflexBeanList(actionDataSet.getModifiedResults())); } private List<TestReflexBean> convertToTestReflexBeanList(List<ResultSet> resultSetList) { List<TestReflexBean> reflexBeanList = new ArrayList<TestReflexBean>(); for (ResultSet resultSet : resultSetList) { TestReflexBean reflex = new TestReflexBean(); reflex.setPatient(resultSet.patient); if (resultSet.triggersToSelectedReflexesMap.size() > 0 && resultSet.multipleResultsForAnalysis) { for (String trigger : resultSet.triggersToSelectedReflexesMap.keySet()) { if (trigger.equals(resultSet.result.getValue())) { HashMap<String, List<String>> reducedMap = new HashMap<String, List<String>>(1); reducedMap.put(trigger, resultSet.triggersToSelectedReflexesMap.get(trigger)); reflex.setTriggersToSelectedReflexesMap(reducedMap); } } if (reflex.getTriggersToSelectedReflexesMap() == null) { reflex.setTriggersToSelectedReflexesMap(new HashMap<String, List<String>>()); } } else { reflex.setTriggersToSelectedReflexesMap(resultSet.triggersToSelectedReflexesMap); } reflex.setResult(resultSet.result); reflex.setSample(resultSet.sample); reflexBeanList.add(reflex); } return reflexBeanList; } private void setSampleStatus(ResultsUpdateDataSet actionDataSet) { Set<Sample> sampleSet = new HashSet<Sample>(); for (ResultSet resultSet : actionDataSet.getNewResults()) { sampleSet.add(resultSet.sample); } String sampleTestingStartedId = StatusService.getInstance().getStatusID(OrderStatus.Started); String sampleNonConformingId = StatusService.getInstance() .getStatusID(OrderStatus.NonConforming_depricated); for (Sample sample : sampleSet) { if (!(sample.getStatusId().equals(sampleNonConformingId) || sample.getStatusId().equals(sampleTestingStartedId))) { Sample newSample = new Sample(); newSample.setId(sample.getId()); sampleDAO.getData(newSample); newSample.setStatusId(sampleTestingStartedId); newSample.setSysUserId(currentUserId); sampleDAO.updateData(newSample); } } } private void createAnalysisOnlyUpdates(ResultsUpdateDataSet actionDataSet) { for (TestResultItem testResultItem : actionDataSet.getAnalysisOnlyChangeResults()) { AnalysisService analysisService = new AnalysisService(testResultItem.getAnalysisId()); analysisService.getAnalysis().setSysUserId(currentUserId); analysisService.getAnalysis() .setCompletedDate(DateUtil.convertStringDateToSqlDate(testResultItem.getTestDate())); analysisService.getAnalysis().setAnalysisType(testResultItem.getAnalysisMethod()); actionDataSet.getModifiedAnalysis().add(analysisService.getAnalysis()); } } private void createResultsFromItems(ResultsUpdateDataSet actionDataSet) { for (TestResultItem testResultItem : actionDataSet.getModifiedItems()) { AnalysisService analysisService = new AnalysisService(testResultItem.getAnalysisId()); analysisService.getAnalysis().setStatusId(getStatusForTestResult(testResultItem)); analysisService.getAnalysis().setSysUserId(currentUserId); handleReferrals(testResultItem, analysisService.getAnalysis(), actionDataSet); actionDataSet.getModifiedAnalysis().add(analysisService.getAnalysis()); NoteService noteService = new NoteService(analysisService.getAnalysis()); actionDataSet.addToNoteList(noteService.createSavableNote(NoteType.INTERNAL, testResultItem.getNote(), RESULT_SUBJECT, currentUserId)); if (testResultItem.isShadowRejected()) { String rejectedReasonId = testResultItem.getRejectReasonId(); for (IdValuePair rejectReason : DisplayListService.getList(ListType.REJECTION_REASONS)) { if (rejectedReasonId.equals(rejectReason.getId())) { actionDataSet.addToNoteList(noteService.createSavableNote(NoteType.REJECTION_REASON, rejectReason.getValue(), RESULT_SUBJECT, currentUserId)); break; } } } ResultSaveBean bean = ResultSaveBeanAdapter.fromTestResultItem(testResultItem); ResultSaveService resultSaveService = new ResultSaveService(analysisService.getAnalysis(), currentUserId); //deletable Results will be written to, not read List<Result> results = resultSaveService.createResultsFromTestResultItem(bean, actionDataSet.getDeletableResults()); analysisService.getAnalysis().setCorrectedSincePatientReport( resultSaveService.isUpdatedResult() && analysisService.patientReportHasBeenDone()); if (analysisService.hasBeenCorrectedSinceLastPatientReport()) { actionDataSet.addToNoteList(noteService.createSavableNote(NoteType.EXTERNAL, StringUtil.getMessageForKey("note.corrected.result"), RESULT_SUBJECT, currentUserId)); } //If there is more than one result then each user selected reflex gets mapped to that result for (Result result : results) { addResult(result, testResultItem, analysisService.getAnalysis(), results.size() > 1, actionDataSet); if (analysisShouldBeUpdated(testResultItem, result)) { updateAnalysis(testResultItem, testResultItem.getTestDate(), analysisService.getAnalysis()); } } } } private void handleReferrals(TestResultItem testResultItem, Analysis analysis, ResultsUpdateDataSet actionDataSet) { if (supportReferrals) { Referral referral = null; // referredOut means the referral checkbox was checked, repeating // analysis means that we have multi-select results, so only do one. if (testResultItem.isShadowReferredOut() && !actionDataSet.getReferredAnalysisIds().contains(analysis.getId())) { actionDataSet.getReferredAnalysisIds().add(analysis.getId()); // If it is a new result or there is no referral ID that means // that a new referral has to be created if it was checked and // it was canceled then we are un-canceling a canceled referral if (testResultItem.getResultId() == null || GenericValidator.isBlankOrNull(testResultItem.getReferralId())) { referral = new Referral(); referral.setReferralTypeId(REFERRAL_CONFORMATION_ID); referral.setSysUserId(currentUserId); referral.setRequestDate(new Timestamp(new Date().getTime())); referral.setRequesterName(testResultItem.getTechnician()); referral.setAnalysis(analysis); referral.setReferralReasonId(testResultItem.getReferralReasonId()); } else if (testResultItem.isReferralCanceled()) { referral = referralDAO.getReferralById(testResultItem.getReferralId()); referral.setCanceled(false); referral.setSysUserId(currentUserId); referral.setRequesterName(testResultItem.getTechnician()); referral.setReferralReasonId(testResultItem.getReferralReasonId()); } actionDataSet.getSavableReferrals().add(referral); } } } protected boolean analysisShouldBeUpdated(TestResultItem testResultItem, Result result) { return result != null && !GenericValidator.isBlankOrNull(result.getValue()) || (supportReferrals && ResultUtil.isReferred(testResultItem)) || ResultUtil.isForcedToAcceptance(testResultItem) || testResultItem.isShadowRejected(); } private void addResult(Result result, TestResultItem testResultItem, Analysis analysis, boolean multipleResultsForAnalysis, ResultsUpdateDataSet actionDataSet) { boolean newResult = result.getId() == null; boolean newAnalysisInLoop = analysis != actionDataSet.getPreviousAnalysis(); ResultSignature technicianResultSignature = null; if (useTechnicianName && newAnalysisInLoop) { technicianResultSignature = createTechnicianSignatureFromResultItem(testResultItem); } ResultInventory testKit = createTestKitLinkIfNeeded(testResultItem, ResultsLoadUtility.TESTKIT); analysis.setReferredOut(testResultItem.isReferredOut()); analysis.setEnteredDate(DateUtil.getNowAsTimestamp()); if (newResult) { analysis.setEnteredDate(DateUtil.getNowAsTimestamp()); analysis.setRevision("1"); } else if (newAnalysisInLoop) { analysis.setRevision(String.valueOf(Integer.parseInt(analysis.getRevision()) + 1)); } SampleService sampleService = new SampleService(testResultItem.getAccessionNumber()); Patient patient = sampleService.getPatient(); Map<String, List<String>> triggersToReflexesMap = new HashMap<String, List<String>>(); getSelectedReflexes(testResultItem.getReflexJSONResult(), triggersToReflexesMap); if (newResult) { actionDataSet.getNewResults().add(new ResultSet(result, technicianResultSignature, testKit, patient, sampleService.getSample(), triggersToReflexesMap, multipleResultsForAnalysis)); } else { actionDataSet.getModifiedResults().add(new ResultSet(result, technicianResultSignature, testKit, patient, sampleService.getSample(), triggersToReflexesMap, multipleResultsForAnalysis)); } actionDataSet.setPreviousAnalysis(analysis); } private void getSelectedReflexes(String reflexJSONResult, Map<String, List<String>> triggersToReflexesMap) { if (!GenericValidator.isBlankOrNull(reflexJSONResult)) { JSONParser parser = new JSONParser(); try { JSONObject jsonResult = (JSONObject) parser.parse(reflexJSONResult.replaceAll("'", "\"")); for (Object compoundReflexes : jsonResult.values()) { if (compoundReflexes != null) { String triggerIds = (String) ((JSONObject) compoundReflexes).get("triggerIds"); List<String> selectedReflexIds = new ArrayList<String>(); JSONArray selectedReflexes = (JSONArray) ((JSONObject) compoundReflexes).get("selected"); for (Object selectedReflex : selectedReflexes) { selectedReflexIds.add(((String) selectedReflex)); } triggersToReflexesMap.put(triggerIds.trim(), selectedReflexIds); } } } catch (ParseException e) { e.printStackTrace(); } } } private String getStatusForTestResult(TestResultItem testResult) { if (testResult.isShadowRejected()) { return StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalRejected); } else if (alwaysValidate || !testResult.isValid() || ResultUtil.isForcedToAcceptance(testResult)) { return StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalAcceptance); } else if (noResults(testResult.getShadowResultValue(), testResult.getMultiSelectResultValues(), testResult.getResultType())) { return StatusService.getInstance().getStatusID(AnalysisStatus.NotStarted); } else { ResultLimit resultLimit = resultLimitDAO.getResultLimitById(testResult.getResultLimitId()); if (resultLimit != null && resultLimit.isAlwaysValidate()) { return StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalAcceptance); } return StatusService.getInstance().getStatusID(AnalysisStatus.Finalized); } } private boolean noResults(String value, String multiSelectValue, String type) { return (GenericValidator.isBlankOrNull(value) && GenericValidator.isBlankOrNull(multiSelectValue)) || (ResultType.DICTIONARY.matches(type) && "0".equals(value)); } private ResultInventory createTestKitLinkIfNeeded(TestResultItem testResult, String testKitName) { ResultInventory testKit = null; if ((TestResultItem.ResultDisplayType.SYPHILIS == testResult.getRawResultDisplayType() || TestResultItem.ResultDisplayType.HIV == testResult.getRawResultDisplayType()) && ResultsLoadUtility.TESTKIT.equals(testKitName)) { testKit = createTestKit(testResult, testKitName, testResult.getTestKitId()); } return testKit; } private ResultInventory createTestKit(TestResultItem testResult, String testKitName, String testKitId) throws LIMSRuntimeException { ResultInventory testKit; testKit = new ResultInventory(); if (!GenericValidator.isBlankOrNull(testKitId)) { testKit.setId(testKitId); resultInventoryDAO.getData(testKit); } testKit.setInventoryLocationId(testResult.getTestKitInventoryId()); testKit.setDescription(testKitName); testKit.setSysUserId(currentUserId); return testKit; } private void updateAnalysis(TestResultItem testResultItem, String testDate, Analysis analysis) { analysis.setAnalysisType(testResultItem.getAnalysisMethod()); analysis.setStartedDateForDisplay(testDate); // This needs to be refactored -- part of the logic is in // getStatusForTestResult. RetroCI over rides to whatever was set before if (statusRuleSet.equals(IActionConstants.STATUS_RULES_RETROCI)) { if (!StatusService.getInstance().getStatusID(AnalysisStatus.Canceled).equals(analysis.getStatusId())) { analysis.setCompletedDate(DateUtil.convertStringDateToSqlDate(testDate)); analysis.setStatusId(StatusService.getInstance().getStatusID(AnalysisStatus.TechnicalAcceptance)); } } else if (StatusService.getInstance().matches(analysis.getStatusId(), AnalysisStatus.Finalized) || StatusService.getInstance().matches(analysis.getStatusId(), AnalysisStatus.TechnicalAcceptance) || (analysis.isReferredOut() && !GenericValidator.isBlankOrNull(testResultItem.getShadowResultValue()))) { analysis.setCompletedDate(DateUtil.convertStringDateToSqlDate(testDate)); } } private ResultSignature createTechnicianSignatureFromResultItem(TestResultItem testResult) { ResultSignature sig = null; // The technician signature may be blank if the user changed a // conclusion and then changed it back. It will be dirty // but will not need a signature if (!GenericValidator.isBlankOrNull(testResult.getTechnician())) { sig = new ResultSignature(); if (!GenericValidator.isBlankOrNull(testResult.getTechnicianSignatureId())) { sig.setId(testResult.getTechnicianSignatureId()); resultSigDAO.getData(sig); } sig.setIsSupervisor(false); sig.setNonUserName(testResult.getTechnician()); sig.setSysUserId(currentUserId); } return sig; } 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; } @Override protected String getPageSubtitleKey() { return "banner.menu.results"; } @Override protected String getPageTitleKey() { return "banner.menu.results"; } }