use of org.akaza.openclinica.exception.OpenClinicaException in project OpenClinica by OpenClinica.
the class ImportCRFDataServlet method processRequest.
@Override
public void processRequest() throws Exception {
resetPanel();
panel.setStudyInfoShown(false);
panel.setOrderedData(true);
FormProcessor fp = new FormProcessor(request);
// checks which module the requests are from
String module = fp.getString(MODULE);
// keep the module in the session
session.setAttribute(MODULE, module);
String action = request.getParameter("action");
CRFVersionBean version = (CRFVersionBean) session.getAttribute("version");
File xsdFile = new File(SpringServletAccess.getPropertiesDir(context) + "ODM1-3-0.xsd");
File xsdFile2 = new File(SpringServletAccess.getPropertiesDir(context) + "ODM1-2-1.xsd");
if (StringUtil.isBlank(action)) {
logger.info("action is blank");
request.setAttribute("version", version);
forwardPage(Page.IMPORT_CRF_DATA);
}
if ("confirm".equalsIgnoreCase(action)) {
String dir = SQLInitServlet.getField("filePath");
if (!new File(dir).exists()) {
logger.info("The filePath in datainfo.properties is invalid " + dir);
addPageMessage(respage.getString("filepath_you_defined_not_seem_valid"));
forwardPage(Page.IMPORT_CRF_DATA);
}
// All the uploaded files will be saved in filePath/crf/original/
String theDir = dir + "crf" + File.separator + "original" + File.separator;
if (!new File(theDir).isDirectory()) {
new File(theDir).mkdirs();
logger.info("Made the directory " + theDir);
}
// MultipartRequest multi = new MultipartRequest(request, theDir, 50 * 1024 * 1024);
File f = null;
try {
f = uploadFile(theDir, version);
} catch (Exception e) {
logger.warn("*** Found exception during file upload***");
e.printStackTrace();
}
if (f == null) {
forwardPage(Page.IMPORT_CRF_DATA);
}
// TODO
// validation steps
// 1. valid xml - validated by file uploader below
// LocalConfiguration config = LocalConfiguration.getInstance();
// config.getProperties().setProperty(
// "org.exolab.castor.parser.namespaces",
// "true");
// config
// .getProperties()
// .setProperty("org.exolab.castor.sax.features",
// "http://xml.org/sax/features/validation,
// http://apache.org/xml/features/validation/schema,
// http://apache.org/xml/features/validation/schema-full-checking");
// // above sets to validate against namespace
Mapping myMap = new Mapping();
// @pgawade 18-April-2011 Fix for issue 8394
String ODM_MAPPING_DIRPath = CoreResources.ODM_MAPPING_DIR;
myMap.loadMapping(ODM_MAPPING_DIRPath + File.separator + "cd_odm_mapping.xml");
Unmarshaller um1 = new Unmarshaller(myMap);
// um1.addNamespaceToPackageMapping("http://www.openclinica.org/ns/odm_ext_v130/v3.1", "OpenClinica");
// um1.addNamespaceToPackageMapping("http://www.cdisc.org/ns/odm/v1.3"
// ,
// "ODMContainer");
boolean fail = false;
ODMContainer odmContainer = new ODMContainer();
session.removeAttribute("odmContainer");
try {
// schemaValidator.validateAgainstSchema(f, xsdFile);
// utf-8 compliance, tbh 06/2009
InputStreamReader isr = new InputStreamReader(new FileInputStream(f), "UTF-8");
odmContainer = (ODMContainer) um1.unmarshal(isr);
logger.debug("Found crf data container for study oid: " + odmContainer.getCrfDataPostImportContainer().getStudyOID());
logger.debug("found length of subject list: " + odmContainer.getCrfDataPostImportContainer().getSubjectData().size());
// 2. validates against ODM 1.3
// check it all below, throw an exception and route to a
// different
// page if not working
// TODO this block of code needs the xerces serializer in order
// to
// work
// StringWriter myWriter = new StringWriter();
// Marshaller m1 = new Marshaller(myWriter);
//
// m1.setProperty("org.exolab.castor.parser.namespaces",
// "true");
// m1
// .setProperty("org.exolab.castor.sax.features",
// "http://xml.org/sax/features/validation,
// http://apache.org/xml/features/validation/schema,
// http://apache.org/xml/features/validation/schema-full-checking
// ");
//
// m1.setMapping(myMap);
// m1.setNamespaceMapping("",
// "http://www.cdisc.org/ns/odm/v1.3");
// m1.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3
// ODM1-3.xsd");
// m1.marshal(odmContainer);
// if you havent thrown it, you wont throw it here
addPageMessage(respage.getString("passed_xml_validation"));
} catch (Exception me1) {
me1.printStackTrace();
// expanding it to all exceptions, but hoping to catch Marshal
// Exception or SAX Exceptions
logger.info("found exception with xml transform");
//
logger.info("trying 1.2.1");
try {
schemaValidator.validateAgainstSchema(f, xsdFile2);
// for backwards compatibility, we also try to validate vs
// 1.2.1 ODM 06/2008
InputStreamReader isr = new InputStreamReader(new FileInputStream(f), "UTF-8");
odmContainer = (ODMContainer) um1.unmarshal(isr);
} catch (Exception me2) {
// not sure if we want to report me2
MessageFormat mf = new MessageFormat("");
mf.applyPattern(respage.getString("your_xml_is_not_well_formed"));
Object[] arguments = { me1.getMessage() };
addPageMessage(mf.format(arguments));
//
// addPageMessage("Your XML is not well-formed, and does not
// comply with the ODM 1.3 Schema. Please check it, and try
// again. It returned the message: "
// + me1.getMessage());
// me1.printStackTrace();
forwardPage(Page.IMPORT_CRF_DATA);
// you can't really wait to forward because then you throw
// NPEs
// in the next few parts of the code
}
}
// TODO need to output further here
// 2.a. is the study the same one that the user is in right now?
// 3. validates against study metadata
// 3.a. is that study subject in that study?
// 3.b. is that study event def in that study?
// 3.c. is that site in that study?
// 3.d. is that crf version in that study event def?
// 3.e. are those item groups in that crf version?
// 3.f. are those items in that item group?
List<String> errors = getImportCRFDataService().validateStudyMetadata(odmContainer, ub.getActiveStudyId());
if (errors != null) {
// add to session
// forward to another page
logger.info(errors.toString());
for (String error : errors) {
addPageMessage(error);
}
if (errors.size() > 0) {
// fail = true;
forwardPage(Page.IMPORT_CRF_DATA);
} else {
addPageMessage(respage.getString("passed_study_check"));
addPageMessage(respage.getString("passed_oid_metadata_check"));
}
}
logger.debug("passed error check");
// TODO ADD many validation steps before we get to the
// session-setting below
// 4. is the event in the correct status to accept data import?
// -- scheduled, data entry started, completed
// (and the event should already be created)
// (and the event should be independent, ie not affected by other
// events)
Boolean eventCRFStatusesValid = getImportCRFDataService().eventCRFStatusesValid(odmContainer, ub);
ImportCRFInfoContainer importCrfInfo = new ImportCRFInfoContainer(odmContainer, sm.getDataSource());
// The eventCRFBeans list omits EventCRFs that don't match UpsertOn rules. If EventCRF did not exist and
// doesn't match upsert, it won't be created.
List<EventCRFBean> eventCRFBeans = getImportCRFDataService().fetchEventCRFBeans(odmContainer, ub);
List<DisplayItemBeanWrapper> displayItemBeanWrappers = new ArrayList<DisplayItemBeanWrapper>();
HashMap<String, String> totalValidationErrors = new HashMap<String, String>();
HashMap<String, String> hardValidationErrors = new HashMap<String, String>();
// The following map is used for setting the EventCRF status post import.
HashMap<Integer, String> importedCRFStatuses = getImportCRFDataService().fetchEventCRFStatuses(odmContainer);
// method in the ImportCRFDataService is modified for this fix.
if (eventCRFBeans == null) {
fail = true;
addPageMessage(respage.getString("no_event_status_matching"));
} else {
ArrayList<Integer> permittedEventCRFIds = new ArrayList<Integer>();
logger.info("found a list of eventCRFBeans: " + eventCRFBeans.toString());
// List<DisplayItemBeanWrapper> displayItemBeanWrappers = new ArrayList<DisplayItemBeanWrapper>();
// HashMap<String, String> totalValidationErrors = new
// HashMap<String, String>();
// HashMap<String, String> hardValidationErrors = new
// HashMap<String, String>();
logger.debug("found event crfs " + eventCRFBeans.size());
// -- does the event already exist? if not, fail
if (!eventCRFBeans.isEmpty()) {
for (EventCRFBean eventCRFBean : eventCRFBeans) {
DataEntryStage dataEntryStage = eventCRFBean.getStage();
Status eventCRFStatus = eventCRFBean.getStatus();
logger.info("Event CRF Bean: id " + eventCRFBean.getId() + ", data entry stage " + dataEntryStage.getName() + ", status " + eventCRFStatus.getName());
if (eventCRFStatus.equals(Status.AVAILABLE) || dataEntryStage.equals(DataEntryStage.INITIAL_DATA_ENTRY) || dataEntryStage.equals(DataEntryStage.INITIAL_DATA_ENTRY_COMPLETE) || dataEntryStage.equals(DataEntryStage.DOUBLE_DATA_ENTRY_COMPLETE) || dataEntryStage.equals(DataEntryStage.DOUBLE_DATA_ENTRY)) {
// actually want the negative
// was status == available and the stage questions, but
// when you are at 'data entry complete' your status is
// set to 'unavailable'.
// >> tbh 09/2008
// HOWEVER, when one event crf is removed and the rest
// are good, what happens???
// need to create a list and inform that one is blocked
// and the rest are not...
//
permittedEventCRFIds.add(new Integer(eventCRFBean.getId()));
} else {
// fail = true;
// addPageMessage(respage.getString(
// "the_event_crf_not_correct_status"));
// forwardPage(Page.IMPORT_CRF_DATA);
}
}
// did we exclude all the event CRFs? if not, pass, else fail
if (eventCRFBeans.size() >= permittedEventCRFIds.size()) {
addPageMessage(respage.getString("passed_event_crf_status_check"));
} else {
fail = true;
addPageMessage(respage.getString("the_event_crf_not_correct_status"));
}
try {
List<DisplayItemBeanWrapper> tempDisplayItemBeanWrappers = new ArrayList<DisplayItemBeanWrapper>();
tempDisplayItemBeanWrappers = getImportCRFDataService().lookupValidationErrors(request, odmContainer, ub, totalValidationErrors, hardValidationErrors, permittedEventCRFIds);
logger.debug("generated display item bean wrappers " + tempDisplayItemBeanWrappers.size());
logger.debug("size of total validation errors: " + totalValidationErrors.size());
displayItemBeanWrappers.addAll(tempDisplayItemBeanWrappers);
} catch (NullPointerException npe1) {
// what if you have 2 event crfs but the third is a fake?
fail = true;
logger.debug("threw a NPE after calling lookup validation errors");
System.out.println(ExceptionUtils.getStackTrace(npe1));
addPageMessage(respage.getString("an_error_was_thrown_while_validation_errors"));
// npe1.printStackTrace();
} catch (OpenClinicaException oce1) {
fail = true;
logger.debug("threw an OCE after calling lookup validation errors " + oce1.getOpenClinicaMessage());
addPageMessage(oce1.getOpenClinicaMessage());
}
} else if (!eventCRFStatusesValid) {
fail = true;
addPageMessage(respage.getString("the_event_crf_not_correct_status"));
} else {
fail = true;
addPageMessage(respage.getString("no_event_crfs_matching_the_xml_metadata"));
}
// for (HashMap<String, String> crfData : importedData) {
// DisplayItemBeanWrapper displayItemBeanWrapper =
// testing(request,
// crfData);
// displayItemBeanWrappers.add(displayItemBeanWrapper);
// errors = displayItemBeanWrapper.getValidationErrors();
//
// }
}
if (fail) {
logger.debug("failed here - forwarding...");
forwardPage(Page.IMPORT_CRF_DATA);
} else {
addPageMessage(respage.getString("passing_crf_edit_checks"));
session.setAttribute("odmContainer", odmContainer);
session.setAttribute("importedData", displayItemBeanWrappers);
session.setAttribute("validationErrors", totalValidationErrors);
session.setAttribute("hardValidationErrors", hardValidationErrors);
session.setAttribute("importedCRFStatuses", importedCRFStatuses);
session.setAttribute("importCrfInfo", importCrfInfo);
// above are updated 'statically' by the method that originally
// generated the wrappers; soon the only thing we will use
// wrappers for is the 'overwrite' flag
logger.debug("+++ content of total validation errors: " + totalValidationErrors.toString());
SummaryStatsBean ssBean = getImportCRFDataService().generateSummaryStatsBean(odmContainer, displayItemBeanWrappers, importCrfInfo);
session.setAttribute("summaryStats", ssBean);
// will have to set hard edit checks here as well
session.setAttribute("subjectData", odmContainer.getCrfDataPostImportContainer().getSubjectData());
forwardPage(Page.VERIFY_IMPORT_SERVLET);
}
// }
}
}
use of org.akaza.openclinica.exception.OpenClinicaException in project OpenClinica by OpenClinica.
the class FormBeanUtil method createDisplaySectionWithItemGroups.
/**
* Create a DisplaySectionBean with a list of ItemGroupBeans. NOTE:
* unGrouped Items are not included
*
* @param study
* The StudyBean
* @param sectionId
* The Section ID associated with the Items, which end up
* providing the content of the tables.
* @param crfVersionId
* The CRF version ID associated with the Items.
* @param studyEventId
* The Study Event ID associated with the CRF Version ID.
* @param sm
* A SessionManager, from which DataSources are acquired for the
* DAO objects.
* @return A DisplaySectionBean.
*/
public DisplaySectionBean createDisplaySectionWithItemGroups(StudyBean study, int sectionId, EventCRFBean eventCrfBean, int studyEventId, SessionManager sm, int eventDefinitionCRFId, ServletContext context) {
DisplaySectionBean dBean = new DisplaySectionBean();
ItemGroupDAO formGroupDAO = new ItemGroupDAO(sm.getDataSource());
ItemGroupMetadataDAO igMetaDAO = new ItemGroupMetadataDAO(sm.getDataSource());
ItemDAO itemDao = new ItemDAO(sm.getDataSource());
ItemFormMetadataDAO metaDao = new ItemFormMetadataDAO(sm.getDataSource());
List<ItemGroupBean> arrList = formGroupDAO.findLegitGroupBySectionId(sectionId);
// all items associated with the section, including those not in a group
List<ItemFormMetadataBean> allMetas = new ArrayList<ItemFormMetadataBean>();
try {
allMetas = metaDao.findAllBySectionId(sectionId);
} catch (OpenClinicaException oce) {
logger.info("oce.getOpenClinicaMessage() = " + oce.getOpenClinicaMessage());
}
// Collections.sort(allMetas);
if (arrList.isEmpty())
return dBean;
// Find out whether there are any checkboxes/radios/select elements
// and if so, get any null values
// associated with them
List<String> nullValuesList = new ArrayList<String>();
boolean itemsHaveChecksRadios = itemsIncludeChecksRadiosSelects(allMetas);
// "+eventDefinitionCRFId);
if (eventDefinitionCRFId <= 0) {
EventDefinitionCRFDAO edcdao = new EventDefinitionCRFDAO(sm.getDataSource());
EventDefinitionCRFBean edcBean = edcdao.findByStudyEventIdAndCRFVersionId(study, studyEventId, eventCrfBean.getCRFVersionId());
eventDefinitionCRFId = edcBean.getId();
}
// "+eventDefinitionCRFId);
if (itemsHaveChecksRadios && eventDefinitionCRFId > 0) {
// method returns null values as a List<String>
nullValuesList = this.getNullValuesByEventCRFDefId(eventDefinitionCRFId, sm.getDataSource());
}
// Get the items associated with each group
List<ItemBean> itBeans;
List<DisplayItemBean> displayItems;
List<DisplayItemGroupBean> displayFormBeans = new ArrayList<DisplayItemGroupBean>();
DisplayItemGroupBean displayItemGBean;
for (ItemGroupBean itemGroup : arrList) {
itBeans = itemDao.findAllItemsByGroupId(itemGroup.getId(), eventCrfBean.getCRFVersionId());
List<ItemGroupMetadataBean> metadata = igMetaDAO.findMetaByGroupAndSection(itemGroup.getId(), eventCrfBean.getCRFVersionId(), sectionId);
if (!metadata.isEmpty()) {
// for a given crf version, all the items in the same group
// have the same group metadata
// so we can get one of them and set metadata for the group
ItemGroupMetadataBean meta = metadata.get(0);
itemGroup.setMeta(meta);
}
// include arrayList parameter until I determine difference in
// classes
displayItems = getDisplayBeansFromItems(itBeans, sm.getDataSource(), eventCrfBean, sectionId, nullValuesList, context);
displayItemGBean = this.createDisplayFormGroup(displayItems, itemGroup);
displayFormBeans.add(displayItemGBean);
}
// We still have to sort these display item group beans on their
// ItemGroupMetadataBean?
// then number their ordinals accordingly
Collections.sort(displayFormBeans, new Comparator<DisplayItemGroupBean>() {
public int compare(DisplayItemGroupBean displayItemGroupBean, DisplayItemGroupBean displayItemGroupBean1) {
return displayItemGroupBean.getGroupMetaBean().compareTo(displayItemGroupBean1.getGroupMetaBean());
}
});
// Now provide the display item group beans with an ordinal
int digOrdinal = 0;
for (DisplayItemGroupBean digBean : displayFormBeans) {
digBean.setOrdinal(++digOrdinal);
}
dBean.setDisplayFormGroups(displayFormBeans);
return dBean;
}
use of org.akaza.openclinica.exception.OpenClinicaException in project OpenClinica by OpenClinica.
the class FormBeanUtil method createDisplaySectionBWithFormGroups.
/**
* Create a DisplaySectionBean with a list of ItemGroupBeans. This List will
* include any ItemGroupBeans that are associated with ungrouped items; in
* other words, the DisplaySectionBean will represent a section that has
* both ungrouped and grouped tables.
*
* @param sectionId
* The Section ID associated with the Items, which end up
* providing the content of the tables.
* @param crfVersionId
* The CRF version ID associated with the Items.
* @param dataSource
* @param eventCRFDefId
* The id for the Event CRF Definition.
* @return A DisplaySectionBean with sorted ItemGroupBeans, meaning the
* ItemGroupBeans should be listed in the order that they appear on
* the CRF section.
* @return A DisplaySectionBean representing a CRF section.
*/
public DisplaySectionBean createDisplaySectionBWithFormGroups(int sectionId, int crfVersionId, DataSource dataSource, int eventCRFDefId, EventCRFBean eventCrfBean, ServletContext context) {
DisplaySectionBean displaySectionBean = new DisplaySectionBean();
ItemGroupDAO formGroupDAO = new ItemGroupDAO(dataSource);
ItemGroupMetadataDAO igMetaDAO = new ItemGroupMetadataDAO(dataSource);
ItemDAO itemDao = new ItemDAO(dataSource);
ItemFormMetadataDAO metaDao = new ItemFormMetadataDAO(dataSource);
SectionDAO sectionDao = new SectionDAO(dataSource);
// Give the DisplaySectionBean a legitimate SectionBean
SectionBean secBean = (SectionBean) sectionDao.findByPK(sectionId);
displaySectionBean.setSection(secBean);
// changed from: findGroupBySectionId
List<ItemGroupBean> itemGroupBeans = formGroupDAO.findLegitGroupAllBySectionId(sectionId);
// all items associated with the section, including those not in a group
List<ItemFormMetadataBean> allMetas = new ArrayList<ItemFormMetadataBean>();
try {
allMetas = metaDao.findAllBySectionId(sectionId);
} catch (OpenClinicaException oce) {
logger.info("oce.getOpenClinicaMessage() = " + oce.getOpenClinicaMessage());
}
// Sort these items according to their position on the CRF; their
// ordinal
Collections.sort(allMetas);
// The DisplayItemGroupBean(s) for "nongrouped" items
List<DisplayItemGroupBean> nonGroupBeans = null;
// if(itemGroupBeans.isEmpty()) return displaySectionBean;
// Find out whether there are any checkboxes/radios/select elements
// and if so, get any null values
// associated with them
List<String> nullValuesList = new ArrayList<String>();
boolean itemsHaveChecksRadios = itemsIncludeChecksRadiosSelects(allMetas);
if (itemsHaveChecksRadios && eventCRFDefId > 0) {
// method returns null values as a List<String>
nullValuesList = this.getNullValuesByEventCRFDefId(eventCRFDefId, dataSource);
}
// Get the items associated with each group
List<ItemBean> itBeans;
List<DisplayItemBean> displayItems;
List<DisplayItemGroupBean> displayFormBeans = new ArrayList<DisplayItemGroupBean>();
DisplayItemGroupBean displayItemGBean;
for (ItemGroupBean itemGroup : itemGroupBeans) {
itBeans = itemDao.findAllItemsByGroupId(itemGroup.getId(), crfVersionId);
logger.debug("just ran find all by group id " + itemGroup.getId() + " found " + itBeans.size() + " item beans");
List<ItemGroupMetadataBean> metadata = igMetaDAO.findMetaByGroupAndSection(itemGroup.getId(), crfVersionId, sectionId);
if (!metadata.isEmpty()) {
// for a given crf version, all the items in the same group
// have the same group metadata info
// so we can get one of the metadata and set the metadata for
// the group
ItemGroupMetadataBean meta = metadata.get(0);
itemGroup.setMeta(meta);
}
displayItems = getDisplayBeansFromItems(itBeans, dataSource, eventCrfBean, sectionId, nullValuesList, context);
displayItemGBean = this.createDisplayFormGroup(displayItems, itemGroup);
displayFormBeans.add(displayItemGBean);
}
// We still have to sort these display item group beans on their
// ItemGroupMetadataBean?
// then number their ordinals accordingly
Collections.sort(displayFormBeans, new Comparator<DisplayItemGroupBean>() {
public int compare(DisplayItemGroupBean displayItemGroupBean, DisplayItemGroupBean displayItemGroupBean1) {
return displayItemGroupBean.getGroupMetaBean().compareTo(displayItemGroupBean1.getGroupMetaBean());
}
});
// Now provide the display item group beans with an ordinal
int digOrdinal = 0;
for (DisplayItemGroupBean digBean : displayFormBeans) {
digBean.setOrdinal(++digOrdinal);
}
// find out whether there are any ungrouped items by comparing the
// number of
// grouped items to allMetas.size()
// List<DisplayItemGroupBean> nonGroupBeans=null;
int tempCount = 0;
for (DisplayItemGroupBean groupBean : displayFormBeans) {
tempCount += groupBean.getItems().size();
}
if (tempCount < allMetas.size()) {
nonGroupBeans = createGroupBeansForNongroupedItems(allMetas, displayFormBeans, sectionId, dataSource, nullValuesList, eventCrfBean, context);
}
if (nonGroupBeans != null) {
displayFormBeans.addAll(nonGroupBeans);
}
// sort the list according to the ordinal of the contained
// DisplayItemGroupBeans
Collections.sort(displayFormBeans, new Comparator<DisplayItemGroupBean>() {
public int compare(DisplayItemGroupBean disFormGroupBean, DisplayItemGroupBean disFormGroupBean1) {
Integer compInt = disFormGroupBean1.getOrdinal();
Integer compInt2 = disFormGroupBean.getOrdinal();
return compInt2.compareTo(compInt);
}
});
displaySectionBean.setDisplayFormGroups(displayFormBeans);
return displaySectionBean;
}
use of org.akaza.openclinica.exception.OpenClinicaException in project OpenClinica by OpenClinica.
the class ImportCRFDataService method validateStudyMetadata.
/*
* meant to answer the following questions 3.a. is that study subject in that study? 3.b. is that study event def in
* that study? 3.c. is that site in that study? 3.d. is that crf version in that study event def? 3.e. are those
* item groups in that crf version? 3.f. are those items in that item group?
*/
public List<String> validateStudyMetadata(ODMContainer odmContainer, int currentStudyId) {
List<String> errors = new ArrayList<String>();
MessageFormat mf = new MessageFormat("");
// throw new OpenClinicaException(mf.format(arguments), "");
try {
StudyDAO studyDAO = new StudyDAO(ds);
String studyOid = odmContainer.getCrfDataPostImportContainer().getStudyOID();
StudyBean studyBean = studyDAO.findByOid(studyOid);
if (studyBean == null) {
mf.applyPattern(respage.getString("your_study_oid_does_not_reference_an_existing"));
Object[] arguments = { studyOid };
errors.add(mf.format(arguments));
// errors.add("Your Study OID " + studyOid + " does not
// reference an existing Study or Site in the database. Please
// check it and try again.");
// throw an error here because getting the ID would be difficult
// otherwise
logger.debug("unknown study OID");
throw new OpenClinicaException("Unknown Study OID", "");
} else if (studyBean.getId() != currentStudyId) {
mf.applyPattern(respage.getString("your_current_study_is_not_the_same_as"));
Object[] arguments = { studyBean.getName() };
//
// errors.add("Your current study is not the same as the Study "
// + studyBean.getName()
// + ", for which you are trying to enter data. Please log out
// of your current study and into the study for which the data
// is keyed.");
errors.add(mf.format(arguments));
}
ArrayList<SubjectDataBean> subjectDataBeans = odmContainer.getCrfDataPostImportContainer().getSubjectData();
StudySubjectDAO studySubjectDAO = new StudySubjectDAO(ds);
StudyEventDefinitionDAO studyEventDefinitionDAO = new StudyEventDefinitionDAO(ds);
CRFVersionDAO crfVersionDAO = new CRFVersionDAO(ds);
ItemGroupDAO itemGroupDAO = new ItemGroupDAO(ds);
ItemDAO itemDAO = new ItemDAO(ds);
if (subjectDataBeans != null) {
// report all available errors, tbh
for (SubjectDataBean subjectDataBean : subjectDataBeans) {
String oid = subjectDataBean.getSubjectOID();
StudySubjectBean studySubjectBean = studySubjectDAO.findByOidAndStudy(oid, studyBean.getId());
if (studySubjectBean == null) {
mf.applyPattern(respage.getString("your_subject_oid_does_not_reference"));
Object[] arguments = { oid };
errors.add(mf.format(arguments));
// errors.add("Your Subject OID " + oid + " does not
// reference an existing Subject in the Study.");
logger.debug("logged an error with subject oid " + oid);
}
ArrayList<StudyEventDataBean> studyEventDataBeans = subjectDataBean.getStudyEventData();
if (studyEventDataBeans != null) {
for (StudyEventDataBean studyEventDataBean : studyEventDataBeans) {
String sedOid = studyEventDataBean.getStudyEventOID();
StudyEventDefinitionBean studyEventDefintionBean = studyEventDefinitionDAO.findByOidAndStudy(sedOid, studyBean.getId(), studyBean.getParentStudyId());
if (studyEventDefintionBean == null) {
mf.applyPattern(respage.getString("your_study_event_oid_for_subject_oid"));
Object[] arguments = { sedOid, oid };
errors.add(mf.format(arguments));
// errors.add("Your Study Event OID " + sedOid +
// " for Subject OID " + oid
// + " does not reference an existing Study
// Event in the Study.");
logger.debug("logged an error with se oid " + sedOid + " and subject oid " + oid);
}
ArrayList<FormDataBean> formDataBeans = studyEventDataBean.getFormData();
if (formDataBeans != null) {
for (FormDataBean formDataBean : formDataBeans) {
String formOid = formDataBean.getFormOID();
ArrayList<CRFVersionBean> crfVersionBeans = crfVersionDAO.findAllByOid(formOid);
// right now just check nulls
if (crfVersionBeans != null) {
for (CRFVersionBean crfVersionBean : crfVersionBeans) {
if (crfVersionBean == null) {
mf.applyPattern(respage.getString("your_crf_version_oid_for_study_event_oid"));
Object[] arguments = { formOid, sedOid };
errors.add(mf.format(arguments));
// errors.add("Your CRF Version
// OID " + formOid + " for Study
// Event OID " + sedOid
// + " does not reference a
// proper CRF Version in that
// Study Event.");
logger.debug("logged an error with form " + formOid + " and se oid " + sedOid);
}
}
} else {
mf.applyPattern(respage.getString("your_crf_version_oid_did_not_generate"));
Object[] arguments = { formOid };
errors.add(mf.format(arguments));
// errors.add("Your CRF Version OID " +
// formOid
// + " did not generate any results in
// the database. Please check it and try
// again.");
}
ArrayList<ImportItemGroupDataBean> itemGroupDataBeans = formDataBean.getItemGroupData();
if (itemGroupDataBeans != null) {
for (ImportItemGroupDataBean itemGroupDataBean : itemGroupDataBeans) {
String itemGroupOID = itemGroupDataBean.getItemGroupOID();
List<ItemGroupBean> itemGroupBeans = itemGroupDAO.findAllByOid(itemGroupOID);
if (itemGroupBeans != null) {
logger.debug("number of item group beans: " + itemGroupBeans.size());
logger.debug("item group oid: " + itemGroupOID);
for (ItemGroupBean itemGroupBean : itemGroupBeans) {
if (itemGroupBean == null) {
mf.applyPattern(respage.getString("your_item_group_oid_for_form_oid"));
Object[] arguments = { itemGroupOID, formOid };
errors.add(mf.format(arguments));
// errors.add("Your Item
// Group OID " +
// itemGroupOID + " for
// Form OID " + formOid
// + " does not
// reference a proper
// Item Group in that
// CRF Version.");
}
}
} else {
mf.applyPattern(respage.getString("the_item_group_oid_did_not"));
Object[] arguments = { itemGroupOID };
errors.add(mf.format(arguments));
// errors.add("The Item Group
// OID " + itemGroupOID
// + " did not generate any
// results in the database,
// please check it and try
// again.");
}
ArrayList<ImportItemDataBean> itemDataBeans = itemGroupDataBean.getItemData();
if (itemDataBeans != null) {
for (ImportItemDataBean itemDataBean : itemDataBeans) {
String itemOID = itemDataBean.getItemOID();
List<ItemBean> itemBeans = itemDAO.findByOid(itemOID);
if (itemBeans != null) {
logger.debug("found itembeans: ");
for (ItemBean itemBean : itemBeans) {
if (itemBean == null) {
mf.applyPattern(respage.getString("your_item_oid_for_item_group_oid"));
Object[] arguments = { itemOID, itemGroupOID };
errors.add(mf.format(arguments));
// errors.add(
// "Your
// Item OID " +
// itemOID + "
// for Item
// Group OID " +
// itemGroupOID
// + " does not
// reference a
// proper Item
// in the Item
// Group.");
} else {
logger.debug("found " + itemBean.getOid() + ", passing");
}
}
}
}
} else {
mf.applyPattern(respage.getString("the_item_group_oid_did_not_contain_item_data"));
Object[] arguments = { itemGroupOID };
errors.add(mf.format(arguments));
// errors.add("The Item Group
// OID " + itemGroupOID
// + " did not contain any Item
// Data in the XML file, please
// check it and try again.");
}
}
} else {
mf.applyPattern(respage.getString("your_study_event_contains_no_form_data"));
Object[] arguments = { sedOid };
errors.add(mf.format(arguments));
// errors.add("Your Study Event " +
// sedOid
// + " contains no Form Data, or the
// Form OIDs are incorrect. Please check
// it and try again.");
}
}
}
}
}
}
}
} catch (OpenClinicaException oce) {
} catch (NullPointerException npe) {
logger.debug("found a nullpointer here");
}
// if errors == null you pass, if not you fail
return errors;
}
use of org.akaza.openclinica.exception.OpenClinicaException in project OpenClinica by OpenClinica.
the class AddNewSubjectServlet method processRequest.
// YW >>
/*
* (non-Javadoc)
*
* @see org.akaza.openclinica.control.core.SecureController#processRequest()
*/
@Override
protected void processRequest() throws Exception {
checkStudyLocked(Page.LIST_STUDY_SUBJECTS, respage.getString("current_study_locked"));
checkStudyFrozen(Page.LIST_STUDY_SUBJECTS, respage.getString("current_study_frozen"));
StudySubjectDAO ssd = new StudySubjectDAO(sm.getDataSource());
StudyDAO stdao = new StudyDAO(sm.getDataSource());
StudyGroupClassDAO sgcdao = new StudyGroupClassDAO(sm.getDataSource());
ArrayList classes = new ArrayList();
panel.setStudyInfoShown(false);
FormProcessor fp = new FormProcessor(request);
FormDiscrepancyNotes discNotes;
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
// TODO l10n for dates? Note that in some places we hard-code the YOB by
// using "01/01/"+yob,
// not exactly supporting i18n...tbh
// YW << update study parameters of current study.
// "collectDob" and "genderRequired" are set as the same as the parent
// study
int parentStudyId = currentStudy.getParentStudyId();
if (parentStudyId <= 0) {
parentStudyId = currentStudy.getId();
classes = sgcdao.findAllActiveByStudy(currentStudy);
} else {
StudyBean parentStudy = (StudyBean) stdao.findByPK(parentStudyId);
classes = sgcdao.findAllActiveByStudy(parentStudy);
}
StudyParameterValueDAO spvdao = new StudyParameterValueDAO(sm.getDataSource());
StudyParameterValueBean parentSPV = spvdao.findByHandleAndStudy(parentStudyId, "collectDob");
currentStudy.getStudyParameterConfig().setCollectDob(parentSPV.getValue());
parentSPV = spvdao.findByHandleAndStudy(parentStudyId, "genderRequired");
currentStudy.getStudyParameterConfig().setGenderRequired(parentSPV.getValue());
// YW >>
// tbh
StudyParameterValueBean checkPersonId = spvdao.findByHandleAndStudy(parentStudyId, "subjectPersonIdRequired");
currentStudy.getStudyParameterConfig().setSubjectPersonIdRequired(checkPersonId.getValue());
if (!fp.isSubmitted()) {
if (fp.getBoolean("instr")) {
session.removeAttribute(FORM_DISCREPANCY_NOTES_NAME);
forwardPage(Page.INSTRUCTIONS_ENROLL_SUBJECT);
} else {
setUpBeans(classes);
Date today = new Date(System.currentTimeMillis());
String todayFormatted = local_df.format(today);
fp.addPresetValue(INPUT_ENROLLMENT_DATE, todayFormatted);
// YW 10-07-2007 <<
String idSetting = "";
if (currentStudy.getParentStudyId() > 0) {
parentSPV = spvdao.findByHandleAndStudy(parentStudyId, "subjectIdGeneration");
currentStudy.getStudyParameterConfig().setSubjectIdGeneration(parentSPV.getValue());
}
idSetting = currentStudy.getStudyParameterConfig().getSubjectIdGeneration();
// YW >>
logger.info("subject id setting :" + idSetting);
// available ID (label) for now
if (idSetting.equals("auto editable") || idSetting.equals("auto non-editable")) {
//Shaoyu Su
// int nextLabel = ssd.findTheGreatestLabel() + 1;
// fp.addPresetValue(INPUT_LABEL, new Integer(nextLabel).toString());
fp.addPresetValue(INPUT_LABEL, resword.getString("id_generated_Save_Add"));
}
setPresetValues(fp.getPresetValues());
discNotes = new FormDiscrepancyNotes();
session.setAttribute(FORM_DISCREPANCY_NOTES_NAME, discNotes);
forwardPage(Page.ADD_NEW_SUBJECT);
}
} else {
// values in database <subject> table for "add existing subject"
if (!fp.getBoolean(EXISTING_SUB_SHOWN)) {
DOB = fp.getString(INPUT_DOB);
YOB = fp.getString(INPUT_YOB);
GENDER = fp.getString(INPUT_GENDER);
}
// YW >>
discNotes = (FormDiscrepancyNotes) session.getAttribute(FORM_DISCREPANCY_NOTES_NAME);
if (discNotes == null) {
discNotes = new FormDiscrepancyNotes();
}
DiscrepancyValidator v = new DiscrepancyValidator(request, discNotes);
v.addValidation(INPUT_LABEL, Validator.NO_BLANKS);
String subIdSetting = currentStudy.getStudyParameterConfig().getSubjectIdGeneration();
if (!subIdSetting.equalsIgnoreCase("auto non-editable") && !subIdSetting.equalsIgnoreCase("auto editable")) {
v.addValidation(INPUT_LABEL, Validator.LENGTH_NUMERIC_COMPARISON, NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO, 30);
}
if (currentStudy.getStudyParameterConfig().getSubjectPersonIdRequired().equals("required")) {
v.addValidation(INPUT_UNIQUE_IDENTIFIER, Validator.NO_BLANKS);
}
v.addValidation(INPUT_UNIQUE_IDENTIFIER, Validator.LENGTH_NUMERIC_COMPARISON, NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO, 255);
if (!StringUtils.isBlank(fp.getString(INPUT_SECONDARY_LABEL))) {
v.addValidation(INPUT_SECONDARY_LABEL, Validator.LENGTH_NUMERIC_COMPARISON, NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO, 30);
}
String dobSetting = currentStudy.getStudyParameterConfig().getCollectDob();
if (dobSetting.equals("1")) {
// date of birth
v.addValidation(INPUT_DOB, Validator.IS_A_DATE);
if (!StringUtils.isBlank(fp.getString("INPUT_DOB"))) {
v.alwaysExecuteLastValidation(INPUT_DOB);
}
v.addValidation(INPUT_DOB, Validator.DATE_IN_PAST);
} else if (dobSetting.equals("2")) {
// year of birth
v.addValidation(INPUT_YOB, Validator.IS_AN_INTEGER);
v.alwaysExecuteLastValidation(INPUT_YOB);
v.addValidation(INPUT_YOB, Validator.COMPARES_TO_STATIC_VALUE, NumericComparisonOperator.GREATER_THAN_OR_EQUAL_TO, 1000);
// get today's year
Date today = new Date();
Calendar c = Calendar.getInstance();
c.setTime(today);
int currentYear = c.get(Calendar.YEAR);
v.addValidation(INPUT_YOB, Validator.COMPARES_TO_STATIC_VALUE, NumericComparisonOperator.LESS_THAN_OR_EQUAL_TO, currentYear);
} else {
// DOB not used, added tbh 102007
logger.info("should read this only if DOB not used");
}
ArrayList acceptableGenders = new ArrayList();
acceptableGenders.add("m");
acceptableGenders.add("f");
if (!currentStudy.getStudyParameterConfig().getGenderRequired().equals("false")) {
v.addValidation(INPUT_GENDER, Validator.IS_IN_SET, acceptableGenders);
}
v.addValidation(INPUT_ENROLLMENT_DATE, Validator.IS_A_DATE);
v.alwaysExecuteLastValidation(INPUT_ENROLLMENT_DATE);
v.addValidation(INPUT_ENROLLMENT_DATE, Validator.DATE_IN_PAST);
boolean locationError = false;
if (fp.getBoolean("addWithEvent")) {
v.addValidation(INPUT_EVENT_START_DATE, Validator.IS_A_DATE);
v.alwaysExecuteLastValidation(INPUT_EVENT_START_DATE);
if (currentStudy.getStudyParameterConfig().getEventLocationRequired().equalsIgnoreCase("required")) {
v.addValidation("location", Validator.NO_BLANKS);
locationError = true;
}
}
HashMap errors = v.validate();
SubjectDAO sdao = new SubjectDAO(sm.getDataSource());
// global
String uniqueIdentifier = fp.getString(INPUT_UNIQUE_IDENTIFIER);
// Id
SubjectBean subjectWithSameId = new SubjectBean();
SubjectBean subjectWithSameIdInParent = new SubjectBean();
boolean showExistingRecord = false;
if (!uniqueIdentifier.equals("")) {
boolean subjectWithSameIdInCurrentStudyTree = false;
// checks whether there is a subject with same id inside current
// study/site
subjectWithSameId = sdao.findByUniqueIdentifierAndStudy(uniqueIdentifier, currentStudy.getId());
// tbh
if (subjectWithSameId.isActive()) {
// ||
// subjectWithSameIdInParent.isActive())
// {
Validator.addError(errors, INPUT_UNIQUE_IDENTIFIER, resexception.getString("subject_with_person_ID") + " " + uniqueIdentifier + " " + resexception.getString("is_already_enrolled_in_this_study"));
subjectWithSameIdInCurrentStudyTree = true;
logger.info("just added unique id in study tree");
} else {
// checks whether there is a subject with same id inside
// sites of
// current study
subjectWithSameId = sdao.findByUniqueIdentifierAndParentStudy(uniqueIdentifier, currentStudy.getId());
if (subjectWithSameId.isActive()) {
StudySubjectBean ssub = ssd.findBySubjectIdAndStudy(subjectWithSameId.getId(), currentStudy);
StudyBean site = (StudyBean) stdao.findByPK(ssub.getStudyId());
Validator.addError(errors, INPUT_UNIQUE_IDENTIFIER, resexception.getString("this_subject_person_ID") + " " + uniqueIdentifier + resexception.getString("has_already_enrolled_site") + site.getName() + resexception.getString("of_current_study_need_to_move") + resexception.getString("please_have_user_manage_privileges"));
subjectWithSameIdInCurrentStudyTree = true;
} else {
// check whether there is a subject with same id in the
// parent study
subjectWithSameId = sdao.findByUniqueIdentifierAndStudy(uniqueIdentifier, currentStudy.getParentStudyId());
if (subjectWithSameId.isActive()) {
Validator.addError(errors, INPUT_UNIQUE_IDENTIFIER, resexception.getString("this_subject_with_person_ID") + " " + uniqueIdentifier + resexception.getString("has_already_enrolled_parent_study"));
subjectWithSameIdInCurrentStudyTree = true;
} else {
// YW 11-26-2007 << check whether there is a subject
// with the same id in other sites of the same study
subjectWithSameId = sdao.findByUniqueIdentifierAndParentStudy(uniqueIdentifier, currentStudy.getParentStudyId());
if (subjectWithSameId.isActive()) {
Validator.addError(errors, INPUT_UNIQUE_IDENTIFIER, resexception.getString("this_subject_with_person_ID") + " " + uniqueIdentifier + resexception.getString("has_already_enrolled_site_study"));
subjectWithSameIdInCurrentStudyTree = true;
}
// YW >>
}
}
}
if (!subjectWithSameIdInCurrentStudyTree) {
subjectWithSameId = sdao.findByUniqueIdentifier(uniqueIdentifier);
// found subject with same id in other study
if (subjectWithSameId.isActive()) {
showExistingRecord = true;
}
}
}
// end of the block if(!uniqueIdentifier.equals(""))
String label = fp.getString(INPUT_LABEL);
String personId = fp.getString(INPUT_UNIQUE_IDENTIFIER);
String secondaryLable = fp.getString(INPUT_SECONDARY_LABEL);
// then Study Subject ID should be created when db row is inserted.
if (label.contains("<") || label.contains(">")) {
Validator.addError(errors, INPUT_LABEL, resexception.getString("study_subject_id_can_not_contain_html_lessthan_or_greaterthan_elements"));
}
if (secondaryLable.contains("<") || secondaryLable.contains(">")) {
Validator.addError(errors, INPUT_SECONDARY_LABEL, resexception.getString("secondary_id_can_not_contain_html_lessthan_or_greaterthan_elements"));
}
if (personId.contains("<") || personId.contains(">")) {
Validator.addError(errors, INPUT_UNIQUE_IDENTIFIER, resexception.getString("person_id_can_not_contain_html_lessthan_or_greaterthan_elements"));
}
if (!label.equalsIgnoreCase(resword.getString("id_generated_Save_Add"))) {
StudySubjectBean subjectWithSameLabel = ssd.findByLabelAndStudy(label, currentStudy);
StudySubjectBean subjectWithSameLabelInParent = new StudySubjectBean();
// tbh
if (currentStudy.getParentStudyId() > 0) {
// <
subjectWithSameLabelInParent = ssd.findSameByLabelAndStudy(label, currentStudy.getParentStudyId(), 0);
// --
// blank
// id
// since
// the
// ss
// hasn't
// been
// created
// yet,
// tbh
}
// tbh
if (subjectWithSameLabel.isActive() || subjectWithSameLabelInParent.isActive()) {
Validator.addError(errors, INPUT_LABEL, resexception.getString("another_assigned_this_ID_choose_unique"));
}
}
if (!classes.isEmpty()) {
for (int i = 0; i < classes.size(); i++) {
StudyGroupClassBean sgc = (StudyGroupClassBean) classes.get(i);
int groupId = fp.getInt("studyGroupId" + i);
String notes = fp.getString("notes" + i);
if ("Required".equals(sgc.getSubjectAssignment()) && groupId == 0) {
Validator.addError(errors, "studyGroupId" + i, resexception.getString("group_class_is_required"));
}
if (notes.trim().length() > 255) {
Validator.addError(errors, "notes" + i, resexception.getString("notes_cannot_longer_255"));
}
sgc.setStudyGroupId(groupId);
sgc.setGroupNotes(notes);
}
}
if (!errors.isEmpty()) {
addPageMessage(respage.getString("there_were_some_errors_submission"));
if (locationError) {
addPageMessage(respage.getString("location_blank_error"));
}
setInputMessages(errors);
fp.addPresetValue(INPUT_DOB, fp.getString(INPUT_DOB));
fp.addPresetValue(INPUT_YOB, fp.getString(INPUT_YOB));
fp.addPresetValue(INPUT_GENDER, fp.getString(INPUT_GENDER));
fp.addPresetValue(INPUT_UNIQUE_IDENTIFIER, uniqueIdentifier);
fp.addPresetValue(INPUT_LABEL, label);
fp.addPresetValue(INPUT_SECONDARY_LABEL, fp.getString(INPUT_SECONDARY_LABEL));
fp.addPresetValue(INPUT_ENROLLMENT_DATE, fp.getString(INPUT_ENROLLMENT_DATE));
fp.addPresetValue(INPUT_EVENT_START_DATE, fp.getString(INPUT_EVENT_START_DATE));
fp.addPresetValue(STUDY_EVENT_DEFINITION, fp.getInt(STUDY_EVENT_DEFINITION));
fp.addPresetValue(LOCATION, fp.getString(LOCATION));
fp.addPresetValue(EDIT_DOB, fp.getString(EDIT_DOB));
setPresetValues(fp.getPresetValues());
setUpBeans(classes);
boolean existingSubShown = fp.getBoolean(EXISTING_SUB_SHOWN);
if (!existingSubShown) {
Object isSubjectOverlay = fp.getRequest().getParameter("subjectOverlay");
if (isSubjectOverlay != null) {
int eventId = fp.getInt("studyEventDefinition");
if (eventId < 1) {
Validator.addError(errors, STUDY_EVENT_DEFINITION, resexception.getString("input_not_acceptable_option"));
}
String location = fp.getString(LOCATION);
if (location == null && location.length() == 0) {
Validator.addError(errors, LOCATION, resexception.getString("field_not_blank"));
}
request.setAttribute("showOverlay", true);
forwardPage(Page.LIST_STUDY_SUBJECTS_SERVLET);
} else {
forwardPage(Page.ADD_NEW_SUBJECT);
}
} else {
forwardPage(Page.ADD_EXISTING_SUBJECT);
}
} else {
// no errors
StudySubjectBean studySubject = new StudySubjectBean();
SubjectBean subject = new SubjectBean();
boolean existingSubShown = fp.getBoolean(EXISTING_SUB_SHOWN);
if (showExistingRecord && !existingSubShown) {
needUpdate = false;
subject = subjectWithSameId;
Calendar cal = Calendar.getInstance();
int year = 0;
if (subject.getDateOfBirth() != null) {
cal.setTime(subject.getDateOfBirth());
year = cal.get(Calendar.YEAR);
fp.addPresetValue(INPUT_DOB, local_df.format(subject.getDateOfBirth()));
} else {
fp.addPresetValue(INPUT_DOB, "");
}
if (currentStudy.getStudyParameterConfig().getCollectDob().equals("1") && !subject.isDobCollected()) {
// fp.addPresetValue(EDIT_DOB, "yes");
fp.addPresetValue(INPUT_DOB, fp.getString(INPUT_DOB));
}
// YW << it has been taken off to solve bug0001125
/*
* else { fp.addPresetValue(INPUT_DOB, ""); }
*/
// YW >>
fp.addPresetValue(INPUT_YOB, String.valueOf(year));
if (!currentStudy.getStudyParameterConfig().getGenderRequired().equals("false")) {
fp.addPresetValue(INPUT_GENDER, subject.getGender() + "");
} else {
fp.addPresetValue(INPUT_GENDER, "");
}
// Shaoyu Su: delay setting INPUT_LABEL field
if (!label.equalsIgnoreCase(resword.getString("id_generated_Save_Add"))) {
fp.addPresetValue(INPUT_LABEL, label);
}
fp.addPresetValue(INPUT_SECONDARY_LABEL, fp.getString(INPUT_SECONDARY_LABEL));
fp.addPresetValue(INPUT_ENROLLMENT_DATE, fp.getString(INPUT_ENROLLMENT_DATE));
fp.addPresetValue(INPUT_EVENT_START_DATE, fp.getString(INPUT_EVENT_START_DATE));
// YW >>
fp.addPresetValue(INPUT_UNIQUE_IDENTIFIER, subject.getUniqueIdentifier());
setPresetValues(fp.getPresetValues());
setUpBeans(classes);
// YW <<
int warningCount = 0;
if (currentStudy.getStudyParameterConfig().getGenderRequired().equalsIgnoreCase("true")) {
if (String.valueOf(subjectWithSameId.getGender()).equals(" ")) {
fp.addPresetValue(G_WARNING, "emptytrue");
fp.addPresetValue(INPUT_GENDER, GENDER);
needUpdate = true;
updateSubject = subjectWithSameId;
updateSubject.setGender(GENDER.toCharArray()[0]);
warningCount++;
} else if (!String.valueOf(subjectWithSameId.getGender()).equals(GENDER)) {
fp.addPresetValue(G_WARNING, "true");
warningCount++;
} else {
fp.addPresetValue(G_WARNING, "false");
}
} else {
fp.addPresetValue(G_WARNING, "false");
}
// Current study required DOB
if (currentStudy.getStudyParameterConfig().getCollectDob().equals("1")) {
// date-of-birth in subject table is not completed
if (subjectWithSameId.isDobCollected() == false) {
needUpdate = true;
updateSubject = subjectWithSameId;
updateSubject.setDobCollected(true);
if (subjectWithSameId.getDateOfBirth() == null) {
fp.addPresetValue(INPUT_DOB, DOB);
updateSubject.setDateOfBirth(new Date(DOB));
} else {
String y = String.valueOf(subjectWithSameId.getDateOfBirth()).split("\\-")[0];
String[] d = DOB.split("\\/");
// if year-of-birth in subject table
if (!y.equals("0001")) {
// year, use year-of-birth
if (!y.equals(d[2])) {
fp.addPresetValue(D_WARNING, "dobYearWrong");
fp.addPresetValue(INPUT_DOB, d[0] + "/" + d[1] + "/" + y);
updateSubject.setDateOfBirth(sdf.parse(d[0] + "/" + d[1] + "/" + y));
} else {
fp.addPresetValue(D_WARNING, "dobUsed");
fp.addPresetValue(INPUT_DOB, DOB);
updateSubject.setDateOfBirth(sdf.parse(DOB));
}
} else // date-of-birth is not required in subject
// table
{
fp.addPresetValue(D_WARNING, "emptyD");
fp.addPresetValue(INPUT_DOB, DOB);
updateSubject.setDateOfBirth(sdf.parse(DOB));
}
}
warningCount++;
} else // date-of-birth in subject table but doesn't match DOB
if (!local_df.format(subjectWithSameId.getDateOfBirth()).toString().equals(DOB)) {
// System.out.println("comparing " +
// local_df.format(
// subjectWithSameId.getDateOfBirth()).toString());
fp.addPresetValue(D_WARNING, "currentDOBWrong");
warningCount++;
} else // date-of-birth in subject table matchs DOB
{
fp.addPresetValue(D_WARNING, "false");
}
} else // current Study require YOB
if (currentStudy.getStudyParameterConfig().getCollectDob().equals("2")) {
String y = String.valueOf(subjectWithSameId.getDateOfBirth()).split("\\-")[0];
// year of date-of-birth in subject table is avaible
if (!y.equals("0001")) {
// year in subject table doesn't match YOB,
if (!y.equals(YOB)) {
fp.addPresetValue(Y_WARNING, "yobWrong");
warningCount++;
} else // year in subject table matches YOB
{
fp.addPresetValue(Y_WARNING, "false");
}
} else // year of date-of-birth in the subject talbe is not
// availbe, YOB is used
{
needUpdate = true;
updateSubject = subjectWithSameId;
fp.addPresetValue(Y_WARNING, "yearEmpty");
fp.addPresetValue(INPUT_YOB, YOB);
updateSubject.setDateOfBirth(sdf.parse("01/01/" + YOB));
warningCount++;
}
} else // current study require no DOB, there is no need to check
// date-of-birth in the subject table
{
fp.addPresetValue(Y_WARNING, "false");
}
if (warningCount > 0) {
warningCount = 0;
forwardPage(Page.ADD_EXISTING_SUBJECT);
return;
}
// forwardPage(Page.ADD_EXISTING_SUBJECT);
// return;
// YW >>
}
// to be inserted into both <subject> and <studysubject> tables
if (!showExistingRecord) {
// YW >>
if (!StringUtil.isBlank(fp.getString(INPUT_GENDER))) {
subject.setGender(fp.getString(INPUT_GENDER).charAt(0));
} else {
subject.setGender(' ');
}
subject.setUniqueIdentifier(uniqueIdentifier);
if (currentStudy.getStudyParameterConfig().getCollectDob().equals("1")) {
if (!StringUtil.isBlank(fp.getString(INPUT_DOB))) {
subject.setDateOfBirth(fp.getDate(INPUT_DOB));
subject.setDobCollected(true);
} else {
subject.setDateOfBirth(null);
subject.setDobCollected(false);
}
} else if (currentStudy.getStudyParameterConfig().getCollectDob().equals("2")) {
// generate a fake birthday in 01/01/YYYY format, only
// the year is
// valid
// added the "2" to make sure that 'not used' is kept to
// null, tbh 102007
subject.setDobCollected(false);
int yob = fp.getInt(INPUT_YOB);
Date fakeDate = new Date("01/01/" + yob);
// Calendar fakeCal = Calendar.getInstance();
// fakeCal.set(Calendar.YEAR, yob);
// fakeCal.set(Calendar.MONTH, 1);
// fakeCal.set(Calendar.DAY_OF_MONTH, 1);
// String dobString = "01/01/" + yob;
String dobString = local_df.format(fakeDate);
try {
Date fakeDOB = local_df.parse(dobString);
subject.setDateOfBirth(fakeDOB);
} catch (ParseException pe) {
subject.setDateOfBirth(new Date());
addPageMessage(respage.getString("problem_happened_saving_year"));
}
}
subject.setStatus(Status.AVAILABLE);
subject.setOwner(ub);
subject = sdao.create(subject);
if (!subject.isActive()) {
throw new OpenClinicaException(resexception.getString("could_not_create_subject"), "3");
}
// YW << for showExistingRecord && existingSubShown,
// If input value(s) is(are) different from database,
// warning will be shown.
// If value(s) in database is(are) empty, entered value(s)
// could be used;
// Otherwise, value(s) in database will be used.
// For date-of-birth, if database only has year-of-birth,
// the year in database will be used for year part
} else if (existingSubShown) {
if (!needUpdate) {
subject = subjectWithSameId;
} else {
updateSubject.setUpdater(ub);
updateSubject = (SubjectBean) sdao.update(updateSubject);
if (!updateSubject.isActive()) {
throw new OpenClinicaException("Could not create subject.", "5");
}
subject = updateSubject;
needUpdate = false;
}
}
// YW >>
// enroll the subject in the active study
studySubject.setSubjectId(subject.getId());
studySubject.setStudyId(currentStudy.getId());
studySubject.setLabel(fp.getString(INPUT_LABEL));
studySubject.setSecondaryLabel(fp.getString(INPUT_SECONDARY_LABEL));
studySubject.setStatus(Status.AVAILABLE);
studySubject.setEnrollmentDate(fp.getDate(INPUT_ENROLLMENT_DATE));
if (fp.getBoolean("addWithEvent")) {
studySubject.setEventStartDate(fp.getDate(INPUT_EVENT_START_DATE));
}
studySubject.setOwner(ub);
// Shaoyu Su: prevent same label ("Study Subject ID")
if (fp.getString(INPUT_LABEL).equalsIgnoreCase(resword.getString("id_generated_Save_Add"))) {
synchronized (simpleLockObj) {
int nextLabel = ssd.findTheGreatestLabel() + 1;
studySubject.setLabel(nextLabel + "");
studySubject = ssd.createWithoutGroup(studySubject);
if (showExistingRecord && !existingSubShown) {
fp.addPresetValue(INPUT_LABEL, label);
}
}
} else {
studySubject = ssd.createWithoutGroup(studySubject);
}
if (!classes.isEmpty() && studySubject.isActive()) {
SubjectGroupMapDAO sgmdao = new SubjectGroupMapDAO(sm.getDataSource());
for (int i = 0; i < classes.size(); i++) {
StudyGroupClassBean group = (StudyGroupClassBean) classes.get(i);
int studyGroupId = group.getStudyGroupId();
String notes = group.getGroupNotes();
SubjectGroupMapBean map = new SubjectGroupMapBean();
map.setNotes(group.getGroupNotes());
map.setStatus(Status.AVAILABLE);
map.setStudyGroupId(group.getStudyGroupId());
map.setStudySubjectId(studySubject.getId());
map.setStudyGroupClassId(group.getId());
map.setOwner(ub);
if (map.getStudyGroupId() > 0) {
sgmdao.create(map);
}
}
}
if (!studySubject.isActive()) {
throw new OpenClinicaException(resexception.getString("could_not_create_study_subject"), "4");
}
// save discrepancy notes into DB
FormDiscrepancyNotes fdn = (FormDiscrepancyNotes) session.getAttribute(FORM_DISCREPANCY_NOTES_NAME);
DiscrepancyNoteDAO dndao = new DiscrepancyNoteDAO(sm.getDataSource());
String[] subjectFields = { INPUT_DOB, INPUT_YOB, INPUT_GENDER };
for (String element : subjectFields) {
saveFieldNotes(element, fdn, dndao, subject.getId(), "subject", currentStudy);
}
saveFieldNotes(INPUT_ENROLLMENT_DATE, fdn, dndao, studySubject.getId(), "studySub", currentStudy);
request.removeAttribute(FormProcessor.FIELD_SUBMITTED);
request.setAttribute(CreateNewStudyEventServlet.INPUT_STUDY_SUBJECT, studySubject);
request.setAttribute(CreateNewStudyEventServlet.INPUT_REQUEST_STUDY_SUBJECT, "no");
request.setAttribute(FormProcessor.FIELD_SUBMITTED, "0");
addPageMessage(respage.getString("subject_with_unique_identifier") + studySubject.getLabel() + respage.getString("X_was_created_succesfully"));
if (fp.getBoolean("addWithEvent")) {
createStudyEvent(fp, studySubject);
// YW <<
request.setAttribute("id", studySubject.getId() + "");
// String url= response.encodeRedirectURL("ViewStudySubject?id=" + studySubject.getId());
// response.sendRedirect(url);
forwardPage(Page.VIEW_STUDY_SUBJECT_SERVLET);
// + studySubject.getId()));
return;
}
String submitEvent = fp.getString(SUBMIT_EVENT_BUTTON);
String submitEnroll = fp.getString(SUBMIT_ENROLL_BUTTON);
String submitDone = fp.getString(SUBMIT_DONE_BUTTON);
session.removeAttribute(FORM_DISCREPANCY_NOTES_NAME);
if (!StringUtil.isBlank(submitEvent)) {
forwardPage(Page.CREATE_NEW_STUDY_EVENT_SERVLET);
} else if (!StringUtil.isBlank(submitEnroll)) {
// NEW MANTIS ISSUE 4770
setUpBeans(classes);
Date today = new Date(System.currentTimeMillis());
String todayFormatted = local_df.format(today);
fp.addPresetValue(INPUT_ENROLLMENT_DATE, todayFormatted);
// YW 10-07-2007 <<
String idSetting = "";
if (currentStudy.getParentStudyId() > 0) {
parentSPV = spvdao.findByHandleAndStudy(parentStudyId, "subjectIdGeneration");
currentStudy.getStudyParameterConfig().setSubjectIdGeneration(parentSPV.getValue());
}
idSetting = currentStudy.getStudyParameterConfig().getSubjectIdGeneration();
// YW >>
logger.info("subject id setting :" + idSetting);
// set up auto study subject id
if (idSetting.equals("auto editable") || idSetting.equals("auto non-editable")) {
//Shaoyu Su
//int nextLabel = ssd.findTheGreatestLabel() + 1;
//fp.addPresetValue(INPUT_LABEL, new Integer(nextLabel).toString());
fp.addPresetValue(INPUT_LABEL, resword.getString("id_generated_Save_Add"));
}
setPresetValues(fp.getPresetValues());
discNotes = new FormDiscrepancyNotes();
session.setAttribute(FORM_DISCREPANCY_NOTES_NAME, discNotes);
// End of 4770
forwardPage(Page.ADD_NEW_SUBJECT);
} else {
// forwardPage(Page.VIEW_STUDY_SUBJECT_SERVLET);
// forwardPage(Page.SUBMIT_DATA_SERVLET);
request.setAttribute("id", studySubject.getId() + "");
// String url=response.encodeRedirectURL("ViewStudySubject?id=" + studySubject.getId());
// response.sendRedirect(url);
forwardPage(Page.VIEW_STUDY_SUBJECT_SERVLET);
return;
}
}
// end of no error (errors.isEmpty())
}
// end of fp.isSubmitted()
}
Aggregations