/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
* copyright 2003-2005 Akaza Research
*/
package org.akaza.openclinica.control.extract;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Set;
import org.akaza.openclinica.bean.admin.CRFBean;
import org.akaza.openclinica.bean.core.DatasetItemStatus;
import org.akaza.openclinica.bean.core.NumericComparisonOperator;
import org.akaza.openclinica.bean.core.Role;
import org.akaza.openclinica.bean.core.Status;
import org.akaza.openclinica.bean.core.TermType;
import org.akaza.openclinica.bean.extract.DatasetBean;
import org.akaza.openclinica.bean.extract.FilterBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean;
import org.akaza.openclinica.bean.managestudy.StudyGroupClassBean;
import org.akaza.openclinica.bean.submit.ItemBean;
import org.akaza.openclinica.control.core.SecureController;
import org.akaza.openclinica.control.form.FormProcessor;
import org.akaza.openclinica.control.form.Validator;
import org.akaza.openclinica.core.form.StringUtil;
import org.akaza.openclinica.dao.admin.CRFDAO;
import org.akaza.openclinica.dao.extract.DatasetDAO;
import org.akaza.openclinica.dao.extract.FilterDAO;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDAO;
import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO;
import org.akaza.openclinica.dao.managestudy.StudyGroupClassDAO;
import org.akaza.openclinica.dao.submit.EventCRFDAO;
import org.akaza.openclinica.dao.submit.ItemDAO;
import org.akaza.openclinica.service.crfdata.HideCRFManager;
import org.akaza.openclinica.view.Page;
import org.akaza.openclinica.web.InsufficientPermissionException;
import org.akaza.openclinica.web.SQLInitServlet;
import org.akaza.openclinica.web.bean.EntityBeanTable;
import org.akaza.openclinica.web.bean.FilterRow;
/**
* Creates a dataset by building a query based on study events, CRFs and items
*
* @author jxu
* @author thickerson
*
*/
public class CreateDatasetServlet extends SecureController {
public static final String BEAN_YEARS = "years";
public static final String BEAN_MONTHS = "months";
public static final String EVENTS_FOR_CREATE_DATASET = "eventsForCreateDataset";
public static final String SAVE_BUTTON = "save";
public static final String SAVE_CONTINUE_BUTTON = "saveContinue";
public static final String DOB = "dob";
public static final String GENDER = "gender";
public static final String EVENT_LOCATION = "location";
public static final String EVENT_START = "start";
public static final String EVENT_END = "end";
//
// adding: subj_status, unique_identifier, age_at_event
public static final String SUBJ_STATUS = "subj_status";
public static final String UNIQUE_ID = "unique_identifier";
public static final String AGE_AT_EVENT = "age_at_event";
public static final String SUBJ_SECONDARY_ID = "subj_secondary_id";
public static final String GROUP_INFORMATION = "group_information";
public static final String EVENT_STATUS = "event_status";
public static final String DISCREPANCY_INFORMATION = "disc";
public static final String CRF_STATUS = "crf_status";
public static final String CRF_VERSION = "crf_version";
public static final String INTERVIEWER_NAME = "interviewer";
public static final String INTERVIEWER_DATE = "interviewer_date";
@Override
public void mayProceed() throws InsufficientPermissionException {
if (ub.isSysAdmin()) {
return;
}
if (currentRole.getRole().equals(Role.STUDYDIRECTOR) || currentRole.getRole().equals(Role.COORDINATOR)
|| currentRole.getRole().equals(Role.INVESTIGATOR) || currentRole.getRole().equals(Role.MONITOR)) {
return;
}
addPageMessage(respage.getString("no_have_correct_privilege_current_study") + respage.getString("change_study_contact_sysadmin"));
throw new InsufficientPermissionException(Page.MENU, resexception.getString("not_allowed_access_extract_data_servlet"), "1");// TODO
}
/*
* public void setUpStudyGroups() { StudyDAO studydao = new
* StudyDAO(sm.getDataSource()); StudyGroupClassDAO sgclassdao = new
* StudyGroupClassDAO(sm.getDataSource()); StudyBean theStudy =
* (StudyBean)studydao.findByPK(sm.getUserBean().getActiveStudyId());
* ArrayList sgclasses = sgclassdao.findAllActiveByStudy(theStudy);
* //StudyGroupClassBean sgclass = (StudyGroupClassBean)sgclasses.get(0);
* //get the first one and test its name //logger.info("found study class
* "+sgclass.getName()); request.setAttribute("sgclasses", sgclasses); }
*/
public ArrayList setUpStudyGroups() {
StudyDAO studydao = new StudyDAO(sm.getDataSource());
StudyGroupClassDAO sgclassdao = new StudyGroupClassDAO(sm.getDataSource());
StudyBean theStudy = (StudyBean) studydao.findByPK(sm.getUserBean().getActiveStudyId());
ArrayList sgclasses = sgclassdao.findAllActiveByStudy(theStudy);
// StudyGroupClassBean sgclass = (StudyGroupClassBean)sgclasses.get(0);
// get the first one and test its name
// logger.info("found study class "+sgclass.getName());
return sgclasses;
}
@Override
public void processRequest() throws Exception {
FormProcessor fp = new FormProcessor(request);
String action = fp.getString("action");
if (StringUtil.isBlank(action)) {
// step 1 -- instructions, and continue button
session.setAttribute("newDataset", new DatasetBean());
session.setAttribute("allItems", new ArrayList());
session.setAttribute("crf", new CRFBean());
session.setAttribute("allSelectedItems", new ArrayList());
forwardPage(Page.CREATE_DATASET_1);
} else {
StudyBean studyWithEventDefs = currentStudy;
if (currentStudy.getParentStudyId() > 0) {
studyWithEventDefs = new StudyBean();
studyWithEventDefs.setId(currentStudy.getParentStudyId());
}
if ("begin".equalsIgnoreCase(action)) {
// step 2 -- select study events/crfs
StudyEventDAO sedao = new StudyEventDAO(sm.getDataSource());
StudyEventDefinitionDAO seddao = new StudyEventDefinitionDAO(sm.getDataSource());
EventCRFDAO ecdao = new EventCRFDAO(sm.getDataSource());
StudyBean studyWithEventDefinitions = currentStudy;
if (currentStudy.getParentStudyId() > 0) {
studyWithEventDefinitions = new StudyBean();
studyWithEventDefinitions.setId(currentStudy.getParentStudyId());
}
ArrayList seds = seddao.findAllActiveByStudy(studyWithEventDefinitions);
CRFDAO crfdao = new CRFDAO(sm.getDataSource());
HashMap events = new LinkedHashMap();
for (int i = 0; i < seds.size(); i++) {
StudyEventDefinitionBean sed = (StudyEventDefinitionBean) seds.get(i);
ArrayList<CRFBean> crfs = (ArrayList<CRFBean>) crfdao.findAllActiveByDefinition(sed);
if (currentStudy.getParentStudyId() > 0) {
// sift through these CRFs and see which ones are hidden
HideCRFManager hideCRFs = HideCRFManager.createHideCRFManager();
crfs = hideCRFs.removeHiddenCRFBeans(studyWithEventDefinitions, sed, crfs, sm.getDataSource());
}
if (!crfs.isEmpty()) {
events.put(sed, crfs);
}
}
// logger.info("how many events =" +
// events.keySet().size());
// determine if events are empty or not, redirect to view
// datasets
if (events.isEmpty()) {
addPageMessage(respage.getString("not_have_study_definitions_assigned"));
forwardPage(Page.CREATE_DATASET_1);
} else {
crfdao = new CRFDAO(sm.getDataSource());
ItemDAO idao = new ItemDAO(sm.getDataSource());
ArrayList sedItemIds = CreateDatasetServlet.allSedItemIdsInStudy(events, crfdao, idao);
session.setAttribute("numberOfStudyItems", Integer.toString(sedItemIds.size()));
request.setAttribute("eventlist", events);
session.setAttribute(EVENTS_FOR_CREATE_DATASET, events);
session.setAttribute("newDataset", new DatasetBean());
session.setAttribute("allItems", new ArrayList());
session.setAttribute("crf", new CRFBean());
forwardPage(Page.CREATE_DATASET_2);
}
} else if ("beginsubmit".equalsIgnoreCase(action)) {
String saveItems = fp.getString(SAVE_BUTTON);
String saveContinue = fp.getString(SAVE_CONTINUE_BUTTON);
DatasetBean db = (DatasetBean) session.getAttribute("newDataset");
if (db == null) {
db = new DatasetBean();
}
extractIdsFromForm(db);
extractEventIds(db);
session.setAttribute("newDataset", db);
// session.setAttribute("itemSelectedNum",db.getItemIds().size()
// +"");
if (!StringUtil.isBlank(saveItems)) {
request.setAttribute("eventlist", session.getAttribute(EVENTS_FOR_CREATE_DATASET));
// BWP 3095>>
String summary = respage.getString("you_have_selected") + " " + db.getItemIds().size() + " " + respage.getString("items_so_far");
summary += genAttMsg(db);
addPageMessage(summary);
int crfId = fp.getInt("crfId");
if (crfId > 0) {
// user choose a crf and select items
forwardPage(Page.CREATE_DATASET_2);
} else {
ArrayList sgclasses = (ArrayList) session.getAttribute("allSelectedGroups");
if (sgclasses == null || sgclasses.size() == 0) {
sgclasses = setUpStudyGroups();
}
session.setAttribute("allSelectedGroups", sgclasses);
request.setAttribute("allSelectedGroups", sgclasses);
// TODO push out list of subject groups here???
// form submitted from "view selected item ' or
// attribute page, so
// forward back to "view selected item " page
forwardPage(Page.CREATE_DATASET_VIEW_SELECTED);
}
} else {
if (db.getItemIds().size() == 0) {
request.setAttribute("eventlist", session.getAttribute(EVENTS_FOR_CREATE_DATASET));
addPageMessage(respage.getString("should_select_one_item_to_create_dataset"));
forwardPage(Page.CREATE_DATASET_2);
} else {
String summary =
respage.getString("you_have_selected") + " " + db.getItemIds().size() + " " + respage.getString("items_totally_for_this_dataset");
summary += genAttMsg(db);
addPageMessage(summary);
fp.addPresetValue("firstmonth", 0);// 0 means using
// default month
fp.addPresetValue("firstyear", 1900);
fp.addPresetValue("lastmonth", 0);
fp.addPresetValue("lastyear", 2100);
setPresetValues(fp.getPresetValues());
logger.warn("found preset values while setting date: " + fp.getPresetValues().toString());
request.setAttribute(BEAN_MONTHS, getMonths());
request.setAttribute(BEAN_YEARS, getYears());
forwardPage(Page.CREATE_DATASET_3);
}
}
} else if ("scopesubmit".equalsIgnoreCase(action)) {
ArrayList months = getMonths();
ArrayList years = getYears();
int firstMonth = fp.getInt("firstmonth");
int firstYear = fp.getInt("firstyear");
int lastMonth = fp.getInt("lastmonth");
int lastYear = fp.getInt("lastyear");
if (fp.getInt("firstmonth") == 0) {
firstMonth = 1;// default value
}
if (fp.getInt("lastmonth") == 0) {
lastMonth = 12;// default value
}
errors = new HashMap();
if (fp.getInt("firstmonth") > 0 && firstYear == 1900) {
Validator.addError(errors, "firstmonth", restext.getString("if_specify_month_also_specify_year"));
}
if (fp.getInt("lastmonth") > 0 && lastYear == 2100) {
Validator.addError(errors, "lastmonth", restext.getString("if_specify_month_also_specify_year"));
}
Date dateStart = getFirstDayOfMonth(firstYear, firstMonth);
Date dateEnd = getLastDayOfMonth(lastYear, lastMonth);
if (dateEnd.compareTo(dateStart) < 0) {
Validator.addError(errors, "firstmonth", restext.getString("the_from_should_be_come_before_to"));
}
if (!errors.isEmpty()) {
String fieldNames[] = { "firstmonth", "firstyear", "lastmonth", "lastyear" };
fp.setCurrentIntValuesAsPreset(fieldNames);
setInputMessages(errors);
addPageMessage(respage.getString("errors_in_submission_see_below"));
setPresetValues(fp.getPresetValues());
request.setAttribute(BEAN_MONTHS, getMonths());
request.setAttribute(BEAN_YEARS, getYears());
forwardPage(Page.CREATE_DATASET_3);
} else {
DatasetBean dsb = (DatasetBean) session.getAttribute("newDataset");
dsb.setDateStart(dateStart);
dsb.setDateEnd(dateEnd);
session.setAttribute("newDataset", dsb);
if (fp.getString("submit").equals(resword.getString("continue_to_apply_filter"))) {
// FilterDAO fdao = new FilterDAO(sm.getDataSource());
// Collection filters = fdao.findAll();
// TODO make findAllByProject
// request.setAttribute("filters",filters);
EntityBeanTable table = getFilterTable();
session.setAttribute("partOfCreateDataset", new Integer(1));
// to be used in createFiltersThree servlet, tbh
request.setAttribute("table", table);
forwardPage(Page.APPLY_FILTER);
} else {
request.setAttribute("statuses", Status.toActiveArrayList());
// YW, 2-20-2008 <<these attributes will show on the
// CREATE_DATASET_4
String temp = dsb.getODMMetaDataVersionOid();
request.setAttribute("mdvOID", temp != null && temp.length() > 0 ? temp : "v1.0.0");
temp = dsb.getODMMetaDataVersionName();
request.setAttribute("mdvName", temp != null && temp.length() > 0 ? temp : "MetaDataVersion_v1.0.0");
request.setAttribute("mdvPrevStudy", dsb.getODMPriorStudyOid());
request.setAttribute("mdvPrevOID", dsb.getODMPriorMetaDataVersionOid());
// YW >>
forwardPage(Page.CREATE_DATASET_4);
}
}
} else if ("specifysubmit".equalsIgnoreCase(action)) {
Validator v = new Validator(request);
v.addValidation("dsName", Validator.NO_BLANKS);
v.addValidation("dsName", Validator.NO_SEMI_COLONS_OR_COLONS);
v.addValidation("dsDesc", Validator.NO_BLANKS);
v.addValidation("dsStatus", Validator.IS_VALID_TERM, TermType.STATUS);
v.addValidation("dsName", Validator.LENGTH_NUMERIC_COMPARISON, NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO, 255);
v.addValidation("dsDesc", Validator.LENGTH_NUMERIC_COMPARISON, NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO, 2000);
String mdvOID = fp.getString("mdvOID");
String mdvName = fp.getString("mdvName");
String mdvPrevStudy = fp.getString("mdvPrevStudy");
if (mdvPrevStudy != null && mdvPrevStudy.length() > 0) {
v.addValidation("mdvPrevOID", Validator.NO_BLANKS);
}
String mdvPrevOID = fp.getString("mdvPrevOID");
errors = v.validate();
String dsName = fp.getString("dsName");
if (!StringUtil.isBlank(dsName)) {
// YW, << 3-19-2008
if (dsName.contains("/") || dsName.contains("\\")) {
v.addError(errors, "dsName", restext.getString("slash_not_allowed"));
}
// 2-20-2008, no check for editing dataset
if (((DatasetBean) session.getAttribute("newDataset")).getId() <= 0) {
// YW >>
// logger.info("dsName" + fp.getString("dsName"));
DatasetDAO dsdao = new DatasetDAO(sm.getDataSource());
DatasetBean dsBean = (DatasetBean) dsdao.findByNameAndStudy(fp.getString("dsName").trim(), currentStudy);
if (dsBean.getId() > 0) {
Validator.addError(errors, "dsName", restext.getString("dataset_name_used_by_another_choose_unique"));
}
}
}
if (!errors.isEmpty()) {
String fieldNames[] = { "dsName", "dsDesc" };
fp.setCurrentStringValuesAsPreset(fieldNames);
fp.addPresetValue("dsStatusId", fp.getInt("dsStatus"));
fp.addPresetValue("mdvOID", mdvOID);
fp.addPresetValue("mdvName", mdvName);
fp.addPresetValue("mdvPrevStudy", mdvPrevStudy);
fp.addPresetValue("mdvPrevOID", mdvPrevOID);
addPageMessage(respage.getString("errors_in_submission_see_below"));
setInputMessages(errors);
setPresetValues(fp.getPresetValues());
request.setAttribute("statuses", Status.toActiveArrayList());
forwardPage(Page.CREATE_DATASET_4);
} else {
session.setAttribute("mdvOID", mdvOID);
session.setAttribute("mdvName", mdvName);
session.setAttribute("mdvPrevStudy", mdvPrevStudy);
session.setAttribute("mdvPrevOID", mdvPrevOID);
if (mdvPrevOID != null && mdvPrevOID.length() > 0 && (mdvPrevStudy == null || mdvPrevStudy.length() <= 0)) {
mdvPrevStudy = currentStudy.getId() + "";
}
DatasetBean dsb = (DatasetBean) session.getAttribute("newDataset");
dsb.setSQLStatement(dsb.generateQuery());
String dbName = SQLInitServlet.getField("dataBase");
if ("oracle".equals(dbName)) {
dsb.setSQLStatement(dsb.generateOracleQuery());
}
// TODO set up oracle syntax for the query, grab the
// database
// from the session manager and feed it to the dataset bean
// possibly done, tbh 1/4/2005
// TODO look for the filter here, re-create the sql
// statement
// and put it in here
// possibly done need to test, tbh 1/7/2005
FilterBean fb = (FilterBean) session.getAttribute("newFilter");
if (fb != null) {
// FilterDAO fDAO = new FilterDAO(sm.getDataSource());
dsb.setSQLStatement(dsb.getSQLStatement() + " " + fb.getSQLStatement());
}
// YW 2-21-2008 << editing dataset becomes creating a new
// dataset if dataset name has been changed.
if (dsb.getId() > 0 && !dsb.getName().equals(fp.getString("dsName"))) {
dsb.setId(0);
}
// YW >>
dsb.setODMMetaDataVersionName(mdvName);
dsb.setODMMetaDataVersionOid(mdvOID);
dsb.setODMPriorMetaDataVersionOid(mdvPrevOID);
dsb.setODMPriorStudyOid(mdvPrevStudy);
dsb.setName(fp.getString("dsName"));
dsb.setDescription(fp.getString("dsDesc"));
dsb.setStatus(Status.get(fp.getInt("dsStatus")));
dsb.setDatasetItemStatus(DatasetItemStatus.get(fp.getInt("itemStatus")));
session.removeAttribute("partOfCreateDataset");
Date ddate = new SimpleDateFormat("MM/dd/yyyy").parse("01/01/1900");
// done to remove the set up of going to get the filter, tbh
// set up dataset here, grab primary key???!!!???
// added by jxu
request.setAttribute("defaultStart", local_df.parse(local_df.format(ddate)));
request.setAttribute("defaultEnd", getLastDayOfMonth(2100, 12));
session.setAttribute("newDataset", dsb);
forwardPage(Page.CONFIRM_DATASET);
}
} else if ("confirmall".equalsIgnoreCase(action)) {
String submit = fp.getString("btnSubmit");
logger.info("reached confirm all");
if (!resword.getString("confirm_and_save").equalsIgnoreCase(submit)) {
// we're going back, so we should not destroy the
// data we've created, tbh
// session.removeAttribute("newDataset");
// session.removeAttribute("newFilter");
forwardPage(Page.CREATE_DATASET_4);
} else {
DatasetDAO ddao = new DatasetDAO(sm.getDataSource());
DatasetBean dsb = (DatasetBean) session.getAttribute("newDataset");
dsb.setStudyId(this.currentStudy.getId());
dsb.setOwner(ub);
// dsb.setOwnerId(ub.getId());
//
// at this point, dataset itemId will still be kept
// uniquely.
dsb = finalUpateDatasetBean(dsb);
if (dsb.getId() == 0) {
// if the bean hasn't been created already that is...
logger.info("*** about to create the dataset bean");
dsb = (DatasetBean) ddao.create(dsb);
logger.info("created dataset bean: " + dsb.getId() + ", name: " + dsb.getName());
if (!dsb.isActive()) {
addPageMessage(restext.getString("problem_creating_dataset_try_again"));
forwardPage(Page.EXTRACT_DATASETS_MAIN);
}
}
// YW, 2-20-2008 << for editing existing dataset
else if (dsb.getId() > 0) {
dsb = (DatasetBean) ddao.updateAll(dsb);
if (!dsb.isActive()) {
addPageMessage(restext.getString("problem_creating_dataset_try_again"));
forwardPage(Page.EXTRACT_DATASETS_MAIN);
}
dsb = (DatasetBean) ddao.updateGroupMap(dsb);
if (!dsb.isActive()) {
addPageMessage(restext.getString("problem_updating_subject_group_class_when_updating_dataset"));
forwardPage(Page.EXTRACT_DATASETS_MAIN);
}
}
// YW >>
logger.info("setting data set id here");
// may be easier to just set the dataset bean
// back into the session?
request.setAttribute("dataset", dsb);
forwardPage(Page.EXPORT_DATASETS);
}
} else {
// refine this bit to catch errors, hopefully
addPageMessage(restext.getString("creating_new_dataset_cancelled"));
forwardPage(Page.CREATE_DATASET_1);
}
}
}
public void extractIdsFromForm(DatasetBean db) {
FormProcessor fp = new FormProcessor(request);
int crfId = fp.getInt("crfId");
int defId = fp.getInt("defId");
boolean eventAttr = fp.getBoolean("eventAttr");
boolean subAttr = fp.getBoolean("subAttr");
boolean CRFAttr = fp.getBoolean("CRFAttr");
boolean groupAttr = fp.getBoolean("groupAttr");
// ArrayList allGroups = setUpStudyGroups();//new ArrayList();
// possible function call here
// ArrayList allSelectedGroups = new ArrayList();
// possible session call here
// boolean discAttr = fp.getBoolean("discAttr");
// we decide not to touch groups here, except in call from 'view
// selected'
ArrayList allItems = (ArrayList) session.getAttribute("allItems");
if (defId > 0 && !db.getEventIds().contains(new Integer(defId))) {
db.getEventIds().add(new Integer(defId));
}
StudyEventDefinitionDAO seddao = new StudyEventDefinitionDAO(sm.getDataSource());
String defName = "";
if (defId > 0 && crfId != -1) {
StudyEventDefinitionBean sed = (StudyEventDefinitionBean) seddao.findByPK(defId);
defName = sed.getName();
}
if (crfId == -1) {
// submit from 'view selected item' page
allItems = (ArrayList) session.getAttribute("allSelectedItems");
// need to add 'view selected groups' here as well, tbh
ArrayList allGroups = (ArrayList) session.getAttribute("allSelectedGroups");
//db.getItemIds().clear();
//db.getItemMap().clear();
//db.getItemDefCrf().clear();
} else if (crfId > 0) {// user chose a CRF and submitted items
// remove all old items first, since user submitted again
// so user can de-select items
for (int i = 0; i < allItems.size(); i++) {
ItemBean item = (ItemBean) allItems.get(i);
item.setSelected(false);
if (db.getItemMap().containsKey(defId + "_" + item.getId())) {
db.getItemIds().remove(new Integer(item.getId()));
db.getItemMap().remove(defId + "_" + item.getId());
for (int j = 0; j < db.getItemDefCrf().size(); ++j) {
ItemBean ib = (ItemBean) db.getItemDefCrf().get(j);
if (ib.getId() == item.getId()) {
db.getItemDefCrf().remove(j);
}
}
}
}
}
if (crfId != 0 && allItems != null) {
CRFDAO cdao = new CRFDAO(sm.getDataSource());
CRFBean crf = (CRFBean) cdao.findByPK(crfId);
ArrayList newSelectItems = new ArrayList();
for (int i = 0; i < allItems.size(); i++) {
String checked = fp.getString("itemSelected" + i);
String itemCrfName = fp.getString("itemCrfName" + i);
String itemDefName = fp.getString("itemDefName" + i);
ItemBean selectedItem = (ItemBean) allItems.get(i);
if (!StringUtil.isBlank(checked) && "yes".equalsIgnoreCase(checked.trim())) {
selectedItem.setSelected(true);
if (!"".equals(crf.getName())) {
selectedItem.setCrfName(crf.getName());
} else {
selectedItem.setCrfName(itemCrfName);
}
if (!"".equals(defName)) {
selectedItem.setDefName(defName);
} else {
selectedItem.setDefName(itemDefName);
}
newSelectItems.add(selectedItem);
if (!db.getItemMap().containsKey(selectedItem.getDatasetItemMapKey())) {
// logger.info("one item selected");
logger.info("one item selected");
db.getItemIds().add(new Integer(selectedItem.getId()));
if (selectedItem.getDefId() == 0) {
db.getItemMap().put(defId + "_" + selectedItem.getId(), selectedItem);
} else {
db.getItemMap().put(selectedItem.getDefId() + "_" + selectedItem.getId(), selectedItem);
}
db.getItemDefCrf().add(selectedItem);
}
} else {
if(crfId == -1) {
if(db.getItemMap().containsKey(selectedItem.getDatasetItemMapKey())) {
for (int j = 0; j < db.getItemDefCrf().size(); ++j) {
ItemBean ib = (ItemBean) db.getItemDefCrf().get(j);
if (ib.getId() == selectedItem.getId()) {
db.getItemDefCrf().remove(j);
}
}
db.getItemIds().remove(new Integer(selectedItem.getId()));
db.getItemMap().remove(selectedItem.getDatasetItemMapKey());
}
}
}
}
if (crfId == -1) {// from view selected page
getSubAttr(fp, db);
getEventAttr(fp, db);
getGroupAttr(fp, db);
// getDiscrepancyAttr(fp, db);
getCRFAttr(fp, db);
}
session.setAttribute("allSelectedItems", newSelectItems);
}
if (crfId == 0) {// event or subject attribute page
if (subAttr) {
getSubAttr(fp, db);
} else if (eventAttr) {
getEventAttr(fp, db);
} else if (groupAttr) {
getGroupAttr(fp, db);
} else if (CRFAttr) {
getCRFAttr(fp, db);
} // else if (discAttr) {
// getDiscrepancyAttr(fp, db);
// }
}
}
/**
* @param year
* The year part of the date.
* @param month
* The month part of the date.
* @return A Date object corresponding to the first day of the specified
* year and month.
*/
private Date getFirstDayOfMonth(int year, int month) {
// scale month down to 0 .. 11 range
month--;
Calendar c = Calendar.getInstance();
c.clear();
c.set(year, month, 1, 0, 0, 0);
return new Date(c.getTimeInMillis());
}
/**
* @param year
* The year part of the date.
* @param month
* The month part of the date.
* @return A Date object corresponding to the last day of the specified year
* and month.
*/
private Date getLastDayOfMonth(int year, int month) {
// scale month down to 0 .. 11 range
month--;
// the idea is to get the first day of the next month
// then subtract a day and let the Calendar class do the real work
Calendar c = Calendar.getInstance();
c.clear();
// get the first day of the current month and year, e.g.:
// a. Apr. 1 2001
// b. Feb. 1 2000
// c. Feb. 1 2001
// d. Dec. 1 1999
c.set(year, month, 1, 23, 59, 59);
// get the first day of the next month, e.g.:
// a. May 1 2001
// b. Mar. 1 2000
// c. Mar. 1 2001
// d. Jan. 1 2000 (note roll-over to next year)
c.add(Calendar.MONTH, 1);
// get the immediately preceding date, e.g.:
// a. Apr. 30 2001 (note that Calendar knows April is only 30 days)
// b. Feb. 29 2000 (note sensitivity to the leap year)
// c. Feb. 28 2001
// d. Dec. 31 1999 (note roll-back to the previous year)
c.add(Calendar.DATE, -1);
return new Date(c.getTimeInMillis());
}
private ArrayList getMonths() {
ArrayList answer = new ArrayList();
answer.add(resword.getString("January"));
answer.add(resword.getString("February"));
answer.add(resword.getString("March"));
answer.add(resword.getString("April"));
answer.add(resword.getString("May"));
answer.add(resword.getString("June"));
answer.add(resword.getString("July"));
answer.add(resword.getString("August"));
answer.add(resword.getString("September"));
answer.add(resword.getString("October"));
answer.add(resword.getString("November"));
answer.add(resword.getString("December"));
return answer;
}
private ArrayList getYears() {
ArrayList answer = new ArrayList();
Calendar currTime = Calendar.getInstance();
int currYear = currTime.get(Calendar.YEAR);
for (int i = 1980; i <= currYear; i++) {
answer.add(String.valueOf(i));
}
return answer;
}
private EntityBeanTable getFilterTable() {
FormProcessor fp = new FormProcessor(request);
FilterDAO fdao = new FilterDAO(sm.getDataSource());
EntityBeanTable table = fp.getEntityBeanTable();
ArrayList filters = (ArrayList) fdao.findAll();
ArrayList filterRows = FilterRow.generateRowsFromBeans(filters);
String[] columns =
{ resword.getString("filter_name"), resword.getString("description"), resword.getString("created_by"), resword.getString("created_date"),
resword.getString("status"), resword.getString("actions") };
table.setColumns(new ArrayList(Arrays.asList(columns)));
table.hideColumnLink(5);
table.setQuery("ApplyFilter", new HashMap());
table.setRows(filterRows);
table.computeDisplay();
return table;
}
private String genAttMsg(DatasetBean db) {
String summary = "";
if (db.isShowEventEnd() || db.isShowEventLocation() || db.isShowEventStart() || db.isShowEventStatus() || db.isShowSubjectAgeAtEvent()) {
summary = summary + respage.getString("you_choose_to_show_event_attributes");
if (db.isShowEventLocation()) {
summary = summary + resword.getString("location") + ", ";
}
if (db.isShowEventStart()) {
summary = summary + resword.getString("start_date") + ", ";
}
if (db.isShowEventEnd()) {
summary = summary + resword.getString("end_date") + ", ";
}
if (db.isShowEventStatus()) {
summary = summary + resword.getString("status") + ", ";
}
if (db.isShowSubjectAgeAtEvent()) {
summary = summary + " " + resword.getString("age_at_event") + ", ";
}
}
if (db.isShowSubjectDob() || db.isShowSubjectGender() || db.isShowSubjectStatus() || db.isShowSubjectUniqueIdentifier()
|| db.isShowSubjectSecondaryId()) {
summary = summary.trim();
summary = summary.endsWith(",") ? summary.substring(0, summary.length()-1) : summary;
summary += summary.length()>0 ? ". " : " ";
summary += respage.getString("you_choose_to_show_subject_attributes");
if (db.isShowSubjectDob()) {
summary = summary + resword.getString("date_year_of_birth") + ", ";
}
if (db.isShowSubjectGender()) {
summary = summary + resword.getString("gender") + ", ";
}
if (db.isShowSubjectStatus()) {
summary = summary + " " + resword.getString("status") + ", ";
}
if (db.isShowSubjectUniqueIdentifier()) {
summary = summary + " " + resword.getString("person_ID") + ", ";
}
if (db.isShowSubjectSecondaryId()) {
summary = summary + " " + resword.getString("secondary_ID") + ", ";
}
}
// newly added tbh
if (db.isShowCRFcompletionDate() || db.isShowCRFinterviewerDate() || db.isShowCRFinterviewerName() || db.isShowCRFstatus() || db.isShowCRFversion()) {
summary = summary.trim();
summary = summary.endsWith(",") ? summary.substring(0, summary.length()-1) : summary;
summary += summary.length()>0 ? ". " : " ";
summary += resword.getString("you_choose_to_show_CRF") + ": ";
if (db.isShowCRFcompletionDate()) {
summary = summary + " " + resword.getString("completion_date") + ", ";
}
if (db.isShowCRFinterviewerDate()) {
summary = summary + " " + resword.getString("interview_date") + ", ";
}
if (db.isShowCRFinterviewerName()) {
summary = summary + " " + resword.getString("interviewer_name") + ", ";
}
if (db.isShowCRFstatus()) {
summary = summary + " " + resword.getString("CRF_status") + ", ";
}
if (db.isShowCRFversion()) {
summary = summary + " " + resword.getString("CRF_version") + ", ";
}
}
summary = summary.trim();
summary = summary.endsWith(",") ? summary.substring(0, summary.length()-1) : summary;
summary += summary.length()>0 ? ". " : " ";
// if (db.isShowDiscrepancyInformation()) {
// summary = summary + "You choose to show Discrepancy Attributes. ";
// }
if (db.isShowSubjectGroupInformation()) {
summary += resword.getString("you_choose_to_show_subject_group");
}
return summary;
}
// TODO set up additional settings here, tbh
//
private void getSubAttr(FormProcessor fp, DatasetBean db) {
String dob = fp.getString(DOB);
if (!StringUtil.isBlank(dob) && "yes".equalsIgnoreCase(dob.trim())) {
db.setShowSubjectDob(true);
} else if (db.isShowSubjectDob()) {
db.setShowSubjectDob(false);
}
String gender = fp.getString(GENDER);
if (!StringUtil.isBlank(gender) && "yes".equalsIgnoreCase(gender.trim())) {
db.setShowSubjectGender(true);
} else if (db.isShowSubjectGender()) {
db.setShowSubjectGender(false);
}
String status = fp.getString(SUBJ_STATUS);
if (!StringUtil.isBlank(status) && "yes".equalsIgnoreCase(status.trim())) {
db.setShowSubjectStatus(true);
logger.info("added subject status");
} else if (db.isShowSubjectStatus()) {
db.setShowSubjectStatus(false);
}
String unique_id = fp.getString(UNIQUE_ID);
if (!StringUtil.isBlank(unique_id) && "yes".equalsIgnoreCase(unique_id.trim())) {
db.setShowSubjectUniqueIdentifier(true);
logger.info("added unique id");
} else if (db.isShowSubjectUniqueIdentifier()) {
db.setShowSubjectUniqueIdentifier(false);
}
String secondary_id = fp.getString(SUBJ_SECONDARY_ID);
if (!StringUtil.isBlank(secondary_id) && "yes".equalsIgnoreCase(secondary_id.trim())) {
db.setShowSubjectSecondaryId(true);
logger.info("added secondary id");
} else if (db.isShowSubjectSecondaryId()) {
db.setShowSubjectSecondaryId(false);
}
}
private void getEventAttr(FormProcessor fp, DatasetBean db) {
String location = fp.getString(EVENT_LOCATION);
if (!StringUtil.isBlank(location) && "yes".equalsIgnoreCase(location.trim())) {
db.setShowEventLocation(true);
} else if (db.isShowEventLocation()) {
// user unchecked event location on page
db.setShowEventLocation(false);
}
String start = fp.getString(EVENT_START);
if (!StringUtil.isBlank(start) && "yes".equalsIgnoreCase(start.trim())) {
db.setShowEventStart(true);
} else if (db.isShowEventStart()) {
db.setShowEventStart(false);
}
String end = fp.getString(EVENT_END);
if (!StringUtil.isBlank(end) && "yes".equalsIgnoreCase(end.trim())) {
db.setShowEventEnd(true);
} else if (db.isShowEventEnd()) {
db.setShowEventEnd(false);
}
// add here; event status
String status = fp.getString(EVENT_STATUS);
if (!StringUtil.isBlank(status) && "yes".equalsIgnoreCase(status.trim())) {
db.setShowEventStatus(true);
logger.info("added event status");
} else if (db.isShowEventStatus()) {
db.setShowEventStatus(false);
}
String ageatevent = fp.getString(AGE_AT_EVENT);
if (!StringUtil.isBlank(ageatevent) && "yes".equalsIgnoreCase(ageatevent.trim())) {
db.setShowSubjectAgeAtEvent(true);
logger.info("added age at event");
} else if (db.isShowSubjectAgeAtEvent()) {
db.setShowSubjectAgeAtEvent(false);
}
}
private void getGroupAttr(FormProcessor fp, DatasetBean db) {
String group = fp.getString(GROUP_INFORMATION);
ArrayList allSelectedGroups = new ArrayList();
// allSelectedGroups = (ArrayList)
// session.getAttribute("allSelectedGroups");
// we don't check the session on purpose, since we want to check/uncheck
// groups every time
// if (!StringUtil.isBlank(group) &&
// "yes".equalsIgnoreCase(group.trim())) {
// db.setShowSubjectGroupInformation(true);
// if (allSelectedGroups == null || allSelectedGroups.size()==0) {
// allSelectedGroups = setUpStudyGroups();
// }
ArrayList allGroups = setUpStudyGroups();
for (int j = 0; j < allGroups.size(); j++) {
StudyGroupClassBean sgclass = (StudyGroupClassBean) allGroups.get(j);
String checked = fp.getString("groupSelected" + sgclass.getId());
if (!StringUtil.isBlank(checked) && "yes".equalsIgnoreCase(checked.trim())) {
db.setShowSubjectGroupInformation(true);
// were they all checked? yes or no, we need to set this flag
sgclass.setSelected(true);
logger.info("just set a group to true: " + sgclass.getName());
// YW, 2-26-2008 << let subjectGroupIds contain only selected
// StudyGroupClass_id <<
if (db.getSubjectGroupIds() != null && !db.getSubjectGroupIds().contains(sgclass.getId())) {
db.getSubjectGroupIds().add(new Integer(sgclass.getId()));
}
// YW >>
} else {
sgclass.setSelected(false);
// wasn't checked
// YW, 2-26-2008 << delete StudyGroupClass_id from
// subjectGroupIds if appliable<<
if (db.getSubjectGroupIds() != null && db.getSubjectGroupIds().contains(sgclass.getId())) {
db.getSubjectGroupIds().remove(new Integer(sgclass.getId()));
}
// YW >>
}
allSelectedGroups.add(sgclass);
// db.getSubjectGroupIds().add(new Integer(sgclass.getId()));
logger.info("just added subject group ids: " + sgclass.getId());
}
session.setAttribute("allSelectedGroups", allSelectedGroups);
request.setAttribute("allSelectedGroups", allSelectedGroups);
// above really necessary? tbh
logger.info("added SUBJECT group info");
// if it's been set previously and we've unchecked everything, run this
if (db.isShowSubjectGroupInformation() && allSelectedGroups.size() == 0) {
db.setShowSubjectGroupInformation(false);
logger.info("show subject group info was TRUE, set to FALSE");
}
// } else if (db.isShowSubjectGroupInformation()) {
// db.setShowSubjectGroupInformation(false);
// }
}
/*
* private void getDiscrepancyAttr(FormProcessor fp, DatasetBean db) {
* String disc = fp.getString(DISCREPANCY_INFORMATION); if
* (!StringUtil.isBlank(disc) && "yes".equalsIgnoreCase(disc.trim())) {
* db.setShowDiscrepancyInformation(true); logger.info("added disc info"); }
* else if (db.isShowDiscrepancyInformation()) {
* db.setShowDiscrepancyInformation(false); } }
*/
private void getCRFAttr(FormProcessor fp, DatasetBean db) {
String status = fp.getString(CRF_STATUS);
if (!StringUtil.isBlank(status) && "yes".equalsIgnoreCase(status.trim())) {
db.setShowCRFstatus(true);
logger.info("added crf status");
} else if (db.isShowCRFstatus()) {
db.setShowCRFstatus(false);
}
String version = fp.getString(CRF_VERSION);
if (!StringUtil.isBlank(version) && "yes".equalsIgnoreCase(version.trim())) {
db.setShowCRFversion(true);
logger.info("added crf version");
} else if (db.isShowCRFversion()) {
db.setShowCRFversion(false);
}
String idate = fp.getString(INTERVIEWER_DATE);
if (!StringUtil.isBlank(idate) && "yes".equalsIgnoreCase(idate.trim())) {
db.setShowCRFinterviewerDate(true);
logger.info("added interviewer date");
} else if (db.isShowCRFinterviewerDate()) {
db.setShowCRFinterviewerDate(false);
}
String iname = fp.getString(INTERVIEWER_NAME);
if (!StringUtil.isBlank(iname) && "yes".equalsIgnoreCase(iname.trim())) {
db.setShowCRFinterviewerName(true);
logger.info("added interviewer name");
} else if (db.isShowCRFinterviewerName()) {
db.setShowCRFinterviewerName(false);
}
}
private void extractEventIds(DatasetBean db) {
ArrayList<Integer> selectedSedIds = new ArrayList<Integer>();
HashMap dbItemMap = db != null ? db.getItemMap() : new HashMap();
if (dbItemMap.size() > 0) {
Iterator<String> it = dbItemMap.keySet().iterator();
while (it.hasNext()) {
Integer selected = Integer.valueOf(it.next().split("_")[0].trim());
if (!"0".equals(selected) && !selectedSedIds.contains(selected)) {
selectedSedIds.add(selected);
}
}
}
if (selectedSedIds.size() > 0) {
db.getEventIds().clear();
db.setEventIds(selectedSedIds);
}
}
public static ArrayList<String> allSedItemIdsInStudy(HashMap events, CRFDAO crfdao, ItemDAO idao) {
ArrayList<String> sedItemIds = new ArrayList<String>();
Iterator it = events.keySet().iterator();
while (it.hasNext()) {
StudyEventDefinitionBean sed = (StudyEventDefinitionBean) it.next();
ArrayList<ItemBean> sedItems = new ArrayList<ItemBean>();
ArrayList crfs = (ArrayList) crfdao.findAllActiveByDefinition(sed);
for (int i = 0; i < crfs.size(); i++) {
CRFBean crf = (CRFBean) crfs.get(i);
ArrayList<ItemBean> items = idao.findAllActiveByCRF(crf);
for (ItemBean item : items) {
Integer itemId = item.getId();
if (!sedItemIds.contains(itemId)) {
sedItemIds.add(sed.getId() + "-" + item.getId());
}
}
}
}
return sedItemIds;
}
/*
* Make sure item ids are unique and match SQLStatement for them
*/
protected DatasetBean finalUpateDatasetBean(DatasetBean db) {
DatasetBean dsb = db;
ArrayList<Integer> itemIds = new ArrayList<Integer>();
Set<Integer> ids = new HashSet<Integer>();
String idList = "item_id in (";
if (dsb.getItemIds().size() > 0) {
for (Integer itemId : (ArrayList<Integer>) dsb.getItemIds()) {
if (!ids.contains(itemId)) {
ids.add(itemId);
itemIds.add(itemId);
idList += itemId + ", ";
}
}
}
idList = idList.length() > 12 ? idList.substring(0, idList.length() - 2) : idList;
dsb.getItemIds().clear();
dsb.setItemIds(itemIds);
dsb.setSQLStatement(dsb.sqlWithUniqeItemIds(idList));
return dsb;
}
}