/** * 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) ITECH, University of Washington, Seattle WA. All Rights Reserved. * */ package us.mn.state.health.lims.audittrail.action.workers; import org.apache.commons.validator.GenericValidator; 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.services.PatientService; import us.mn.state.health.lims.common.services.SampleOrderService; import us.mn.state.health.lims.common.services.historyservices.*; import us.mn.state.health.lims.common.util.StringUtil; import us.mn.state.health.lims.patient.action.bean.PatientManagementBridge; import us.mn.state.health.lims.patient.action.bean.PatientManagementInfo; import us.mn.state.health.lims.patient.util.PatientUtil; import us.mn.state.health.lims.patient.valueholder.Patient; 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.sample.bean.SampleOrderItem; import us.mn.state.health.lims.sample.daoimpl.SampleDAOImpl; import us.mn.state.health.lims.sample.valueholder.Sample; import java.util.*; public class AuditTrailViewWorker { private AnalysisDAO analysisDAO = new AnalysisDAOImpl(); private ResultDAO resultDAO = new ResultDAOImpl(); private String accessionNumber = null; private Sample sample; public AuditTrailViewWorker(String accessionNumber) { this.accessionNumber = accessionNumber; sample = null; } public List<AuditTrailItem> getAuditTrail() throws IllegalStateException { if (GenericValidator.isBlankOrNull(accessionNumber)) { throw new IllegalStateException("AuditTrialViewWorker is not initialized"); } getSample(); List<AuditTrailItem> items = new ArrayList<AuditTrailItem>(); if (sample != null) { items.addAll(addOrders()); items.addAll(addSamples()); items.addAll(addTestsAndResults()); items.addAll(addReports()); items.addAll(addPatientHistory()); items.addAll(addNotes()); items.addAll(addQAEvents()); } sortItemsByTime(items); return items; } public SampleOrderItem getSampleOrderSnapshot(){ if (GenericValidator.isBlankOrNull(accessionNumber)) { throw new IllegalStateException("AuditTrialViewWorker is not initialized"); } SampleOrderService orderService = new SampleOrderService( accessionNumber, true ); return orderService.getSampleOrderItem(); } public PatientManagementInfo getPatientSnapshot(){ if (GenericValidator.isBlankOrNull(accessionNumber)) { throw new IllegalStateException("AuditTrialViewWorker is not initialized"); } getSample(); if( sample != null){ PatientService patientService = new PatientService( sample ); return new PatientManagementBridge().getPatientManagementInfoFor( patientService.getPatient(), true ); }else{ return new PatientManagementInfo(); } } public List<AuditTrailItem> getPatientHistoryAuditTrail() throws IllegalStateException{ if (GenericValidator.isBlankOrNull(accessionNumber)) { throw new IllegalStateException("AuditTrialViewWorker is not initialized"); } getSample(); List<AuditTrailItem> items = new ArrayList<AuditTrailItem>(); if (sample != null) { items.addAll(addPatientHistory()); } return items; } private void getSample(){ if( sample == null ){ sample = new SampleDAOImpl().getSampleByAccessionNumber(accessionNumber); } } private Collection<AuditTrailItem> addReports() { List<AuditTrailItem> items = new ArrayList<AuditTrailItem>(); if (sample != null) { HistoryService historyService = new ReportHistoryService(sample); items.addAll(historyService.getAuditTrailItems()); //sortItemsByTime(items); } for( AuditTrailItem auditTrailItem : items){ auditTrailItem.setClassName("reportAudit"); setAttributeNewIfInsert(auditTrailItem); } return items; } private Collection<AuditTrailItem> addSamples() { List<AuditTrailItem> sampleItems = new ArrayList<AuditTrailItem>(); if (sample != null) { HistoryService historyService = new SampleHistoryService(sample); sampleItems.addAll(historyService.getAuditTrailItems()); //sortItems(sampleItems); for( AuditTrailItem auditTrailItem : sampleItems){ auditTrailItem.setClassName("sampleAudit"); setAttributeNewIfInsert(auditTrailItem); } } return sampleItems; } private Collection<AuditTrailItem> addOrders() { List<AuditTrailItem> orderItems = new ArrayList<AuditTrailItem>(); if (sample != null) { HistoryService historyService = new OrderHistoryService(sample); orderItems.addAll(historyService.getAuditTrailItems()); //sortItems(orderItems); for( AuditTrailItem auditTrailItem : orderItems){ auditTrailItem.setClassName("orderAudit"); setAttributeNewIfInsert(auditTrailItem); } } return orderItems; } private void setAttributeNewIfInsert(AuditTrailItem auditTrailItem) { if( auditTrailItem.getAction().equals("I")){ auditTrailItem.setAttribute(StringUtil.getMessageForKey("auditTrail.action.new")); } } private List<AuditTrailItem> addTestsAndResults() { List<AuditTrailItem> items = new ArrayList<AuditTrailItem>(); List<Analysis> analysisList = analysisDAO.getAnalysesBySampleId(sample.getId()); for (Analysis analysis : analysisList) { List<Result> resultList = resultDAO.getResultsByAnalysis(analysis); HistoryService historyService = new AnalysisHistoryService(analysis); List<AuditTrailItem> resultItems = historyService.getAuditTrailItems(); items.addAll(resultItems); for (Result result : resultList) { historyService = new ResultHistoryService(result, analysis); resultItems = historyService.getAuditTrailItems(); items.addAll(resultItems); } } //sortItems(items); for( AuditTrailItem auditTrailItem : items){ auditTrailItem.setClassName("testResultAudit"); setAttributeNewIfInsert(auditTrailItem); } return items; } private Collection<AuditTrailItem> addPatientHistory() { List<AuditTrailItem> items = new ArrayList<AuditTrailItem>(); HistoryService historyService; Patient patient = PatientUtil.getPatientForSample(sample); if( patient != null) { historyService = new PatientHistoryService(patient); items.addAll(historyService.getAuditTrailItems()); } // historyService = new HistoryService(sample, HistoryType.PERSON); // items.addAll(historyService.getAuditTrailItems()); historyService = new PatientHistoryHistoryService(sample); items.addAll(historyService.getAuditTrailItems()); //sortItems(items); for( AuditTrailItem auditTrailItem : items){ auditTrailItem.setClassName("patientHistoryAudit"); setAttributeNewIfInsert(auditTrailItem); } return items; } private Collection<AuditTrailItem> addNotes() { List<AuditTrailItem> notes = new ArrayList<AuditTrailItem>(); if (sample != null) { HistoryService historyService = new NoteHistoryService(sample); notes.addAll(historyService.getAuditTrailItems()); //sortItems(notes); for( AuditTrailItem auditTrailItem : notes){ auditTrailItem.setClassName("noteAudit"); setAttributeNewIfInsert(auditTrailItem); } } return notes; } private Collection<AuditTrailItem> addQAEvents() { List<AuditTrailItem> qaEvents = new ArrayList<AuditTrailItem>(); if (sample != null) { QaHistoryService qaService = new QaHistoryService(sample); qaEvents = qaService.getAuditTrailItems(); for( AuditTrailItem auditTrailItem : qaEvents){ auditTrailItem.setClassName("qaEvent"); setAttributeNewIfInsert(auditTrailItem); } } return qaEvents; } private void sortItems(List<AuditTrailItem> items) { Collections.sort(items, new Comparator<AuditTrailItem>() { @Override public int compare(AuditTrailItem o1, AuditTrailItem o2) { int sort = o1.getIdentifier().compareTo(o2.getIdentifier()); if (sort != 0) { return sort; } sort = o1.getTimeStamp().compareTo(o2.getTimeStamp()); if (sort != 0) { return sort; } return o1.getAction().compareTo(o2.getAction()); } }); } private void sortItemsByTime(List<AuditTrailItem> items) { Collections.sort(items, new Comparator<AuditTrailItem>() { @Override public int compare(AuditTrailItem o1, AuditTrailItem o2) { return o1.getTimeStamp().compareTo(o2.getTimeStamp()); } }); } }