/**
* 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.resultvalidation.action.util;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.action.DynaActionForm;
import us.mn.state.health.lims.common.action.IActionConstants;
import us.mn.state.health.lims.common.paging.IPageDivider;
import us.mn.state.health.lims.common.paging.IPageFlattener;
import us.mn.state.health.lims.common.paging.IPageUpdater;
import us.mn.state.health.lims.common.paging.PagingBean;
import us.mn.state.health.lims.common.paging.PagingUtility;
import us.mn.state.health.lims.common.util.IdValuePair;
import us.mn.state.health.lims.resultvalidation.bean.AnalysisItem;
public class ResultValidationPaging {
public static final int VALIDATION_PAGING_SIZE = 240;
private PagingUtility<List<AnalysisItem>> paging = new PagingUtility<List<AnalysisItem>>();
private static AnalysisItemPageHelper pagingHelper = new AnalysisItemPageHelper();
public void setDatabaseResults(HttpServletRequest request, DynaActionForm dynaForm, List<AnalysisItem> analysisItems)
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
paging.setDatabaseResults(request.getSession(), analysisItems, pagingHelper);
List<AnalysisItem> resultPage = paging.getPage(1, request.getSession());
if (resultPage != null) {
PropertyUtils.setProperty(dynaForm, "resultList", resultPage);
PropertyUtils.setProperty(dynaForm, "paging", paging.getPagingBeanWithSearchMapping(1, request.getSession()));
}
}
public void page(HttpServletRequest request, DynaActionForm dynaForm, String newPage) throws IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
request.getSession().setAttribute(IActionConstants.SAVE_DISABLED, IActionConstants.FALSE);
List<AnalysisItem> clientAnalysis = (List<AnalysisItem>) dynaForm.get("resultList");
PagingBean bean = (PagingBean) dynaForm.get("paging");
String testSectionId = (request.getParameter("testSectionId"));
paging.updatePagedResults(request.getSession(), clientAnalysis, bean, pagingHelper);
int page = Integer.parseInt(newPage);
List<AnalysisItem> resultPage = paging.getPage(page, request.getSession());
if (resultPage != null) {
PropertyUtils.setProperty(dynaForm, "resultList", resultPage);
PropertyUtils.setProperty(dynaForm, "testSectionId", testSectionId);
PropertyUtils.setProperty(dynaForm, "paging", paging.getPagingBeanWithSearchMapping(page, request.getSession()));
}
}
public void updatePagedResults(HttpServletRequest request, DynaActionForm dynaForm) {
List<AnalysisItem> clientAnalysis = (List<AnalysisItem>) dynaForm.get("resultList");
PagingBean bean = (PagingBean) dynaForm.get("paging");
paging.updatePagedResults(request.getSession(), clientAnalysis, bean, pagingHelper);
}
public List<AnalysisItem> getResults(HttpServletRequest request) {
return paging.getAllResults(request.getSession(), pagingHelper);
}
private static class AnalysisItemPageHelper implements IPageDivider<List<AnalysisItem>>, IPageUpdater<List<AnalysisItem>>,
IPageFlattener<List<AnalysisItem>> {
public void createPages(List<AnalysisItem> analysisList, List<List<AnalysisItem>> pagedResults) {
List<AnalysisItem> page = new ArrayList<AnalysisItem>();
String currentAccessionNumber = null;
int resultCount = 0;
for (AnalysisItem item : analysisList) {
if (currentAccessionNumber != null && !currentAccessionNumber.equals(item.getAccessionNumber())) {
resultCount = 0;
currentAccessionNumber = null;
pagedResults.add(page);
page = new ArrayList<AnalysisItem>();
}
if (resultCount >= VALIDATION_PAGING_SIZE) {
currentAccessionNumber = item.getAccessionNumber();
}
page.add(item);
resultCount++;
}
if (!page.isEmpty() || pagedResults.isEmpty()) {
pagedResults.add(page);
}
}
public void updateCache(List<AnalysisItem> cacheItems, List<AnalysisItem> clientItems) {
for (int i = 0; i < clientItems.size(); i++) {
cacheItems.set(i, clientItems.get(i));
}
}
public List<AnalysisItem> flattenPages(List<List<AnalysisItem>> pages) {
List<AnalysisItem> allResults = new ArrayList<AnalysisItem>();
for (List<AnalysisItem> page : pages) {
for (AnalysisItem item : page) {
allResults.add(item);
}
}
return allResults;
}
@Override
public List<IdValuePair> createSearchToPageMapping(List<List<AnalysisItem>> allPages) {
List<IdValuePair> mappingList = new ArrayList<IdValuePair>();
int page = 0;
for( List<AnalysisItem> analysisList : allPages){
page++;
String pageString = String.valueOf(page);
String currentAccession = null;
for( AnalysisItem analysisItem : analysisList){
if( !analysisItem.getAccessionNumber().equals(currentAccession)){
currentAccession = analysisItem.getAccessionNumber();
mappingList.add( new IdValuePair(currentAccession, pageString));
}
}
}
return mappingList;
}
}
}