package org.akaza.openclinica.view.form; import org.akaza.openclinica.bean.submit.DisplayItemBean; import org.akaza.openclinica.bean.submit.ItemDataBean; import org.akaza.openclinica.core.SessionManager; import org.akaza.openclinica.dao.submit.ItemDataDAO; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; /** * A class that handles persistent values that must appear in forms when they * are generated. */ public class ViewPersistanceHandler { private List<ItemDataBean> itemDataBeans; private ViewBuilderUtil viewBuilderUtil; public ViewPersistanceHandler() { super(); itemDataBeans = new ArrayList<ItemDataBean>(); viewBuilderUtil = new ViewBuilderUtil(); } public List<ItemDataBean> fetchPersistedData(int sectionId, int eventcrfId) { //SessionManager sessionManager = new SessionManager(); ItemDataDAO itemDataDAO = new ItemDataDAO(SessionManager.getStaticDataSource()); List<ItemDataBean> itemDataBeans = itemDataDAO.findAllActiveBySectionIdAndEventCRFId(sectionId, eventcrfId); return itemDataBeans == null ? new ArrayList<ItemDataBean>() : itemDataBeans; } /** * * @param disBeans * @param hasGroupedItems * @return */ public List<DisplayItemBean> loadDataIntoDisplayBeans(List<DisplayItemBean> disBeans, boolean hasGroupedItems) { List<ItemDataBean> dataBeans = getItemDataBeans(); if (dataBeans.isEmpty() || disBeans == null || disBeans.isEmpty()) { return new ArrayList<DisplayItemBean>(); } // The process is straightforward if the display beans are not involved // with a // group-type matrix table that has persistent repeated rows dataItem: for (DisplayItemBean itemBean : disBeans) { for (ItemDataBean iDataBean : dataBeans) { // We're not handling persistent repeated rows at this point; // Just the first row of data. // see this.handleExtraGroupRows if (iDataBean.getOrdinal() == 1 && iDataBean.getItemId() == itemBean.getItem().getId()) { itemBean.setData(iDataBean); continue dataItem; } } } return disBeans; // Just return the DisplayBeans unchanged if they have persistent // repeated rows. // Another method handles that condition; see this.handleExtraGroupRows // return disBeans; } public boolean hasPersistentRepeatedRows(List<DisplayItemBean> itemBeans) { // if ItemDataBeans have any ordinal values > 1, and // at least one display item has data in this collection, then they // have repeated rows in the database for (DisplayItemBean disBean : itemBeans) { for (ItemDataBean dataBean : this.getItemDataBeans()) { if (disBean.getItem().getId() == dataBean.getItemId() && dataBean.getOrdinal() > 1) { return true; } } } return false; } /** * * @return * @see org.akaza.openclinica.view.form.ViewPersistanceHandler * loadDataIntoDisplayBeans() */ public SortedMap<Integer, List<ItemDataBean>> handleExtraGroupRows() { // handle duplicate item ids in itemdatabeans // A sorted map with the ordinal as the index, and the related // ItemDataBean as value. // All of the contained ItemDataBeans have the same Item id List<ItemDataBean> dataBeans = this.getItemDataBeans(); SortedMap<Integer, List<ItemDataBean>> ordinalItemDataMap = new TreeMap<Integer, List<ItemDataBean>>(); List<ItemDataBean> innerDataBeanList = new ArrayList<ItemDataBean>(); int tracker = 0; List<Integer> listOrdinal = new ArrayList<Integer>(); int currentOrdinal = 0; int tempOrdinal; // Populate the SortedMap with ordinal --> List of ItemDataBeans for (ItemDataBean itemDataBean : dataBeans) { // an ordinal > 1 means the databean represents a repeated row tempOrdinal = itemDataBean.getOrdinal(); if (tempOrdinal > 1) { tracker++; if (tracker == 1) { // first data bean found innerDataBeanList.add(itemDataBean); listOrdinal.add(tempOrdinal); // currentOrdinal = tempOrdinal; ordinalItemDataMap.put(tempOrdinal, innerDataBeanList); } else { // if tempOrdinal is the same as currentOrdinal, then just // add the data bean // to the existing List. if (listOrdinal.contains(tempOrdinal)) { // if(tempOrdinal == currentOrdinal) { ordinalItemDataMap.get(tempOrdinal).add(itemDataBean); } else { listOrdinal.add(tempOrdinal); // currentOrdinal = tempOrdinal; innerDataBeanList = new ArrayList<ItemDataBean>(); innerDataBeanList.add(itemDataBean); ordinalItemDataMap.put(tempOrdinal, innerDataBeanList); } } }// tempOrdinal > 0 }// for each dataBean return ordinalItemDataMap; } public Map<Integer, List<DisplayItemBean>> sortDuplicatesIntoRows(List<DisplayItemBean> displayBeans) { // We know a DisplayItemBean is part of a duplicate row because its: // 1. ItemDataBean ordinal is greater than 1 and // 2. it shares the same ordinal with other members of its row. Map<Integer, List<DisplayItemBean>> rowMap = new HashMap<Integer, List<DisplayItemBean>>(); List<DisplayItemBean> mapList = new ArrayList<DisplayItemBean>(); List<DisplayItemBean> dupesList = new ArrayList<DisplayItemBean>(); for (DisplayItemBean disBean : displayBeans) { if (disBean.getData().getOrdinal() > 1) { dupesList.add(disBean); } } // Now separate clusters of the same ordinal into different Lists int currentOrdinal = 0; int currentItemId = 0; for (DisplayItemBean disBean : dupesList) { if (currentItemId == 0) { currentItemId = disBean.getItem().getId(); currentOrdinal = disBean.getData().getOrdinal(); mapList.add(disBean); rowMap.put(currentItemId, mapList); continue; } if (disBean.getData().getOrdinal() == currentOrdinal) { mapList.add(disBean); } else { // A different ordinal means create a new row currentOrdinal = disBean.getData().getOrdinal(); mapList = new ArrayList<DisplayItemBean>(); mapList.add(disBean); rowMap.put(disBean.getItem().getId(), mapList); } } return rowMap; } private boolean listContainsDisplayItem(List<DisplayItemBean> beanList, DisplayItemBean singleBean) { for (DisplayItemBean disBean : beanList) { if (singleBean.getItem().getId() == disBean.getItem().getId()) { return true; } } return false; } public List<ItemDataBean> getItemDataBeans() { return itemDataBeans; } public void setItemDataBeans(List<ItemDataBean> itemDataBeans) { this.itemDataBeans = itemDataBeans; } public ViewBuilderUtil getViewBuilderUtil() { return viewBuilderUtil; } public void setViewBuilderUtil(ViewBuilderUtil viewBuilderUtil) { this.viewBuilderUtil = viewBuilderUtil; } }