package org.akaza.openclinica.ws; import org.akaza.openclinica.bean.admin.CRFBean; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean; import org.akaza.openclinica.bean.submit.CRFVersionBean; import org.akaza.openclinica.dao.admin.CRFDAO; import org.akaza.openclinica.dao.login.UserAccountDAO; import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO; import org.akaza.openclinica.dao.managestudy.StudyDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO; import org.akaza.openclinica.dao.submit.CRFVersionDAO; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.akaza.openclinica.ws.bean.BaseStudyDefinitionBean; import org.akaza.openclinica.ws.validator.StudyEventDefinitionRequestValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.util.xml.DomUtils; import org.springframework.validation.DataBinder; import org.springframework.validation.Errors; import org.springframework.validation.ObjectError; import org.springframework.ws.server.endpoint.annotation.Endpoint; import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.springframework.ws.server.endpoint.annotation.XPathParam; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.sql.DataSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; import javax.xml.transform.dom.DOMSource; import java.util.List; import java.util.Locale; @Endpoint public class StudyEventDefinitionEndpoint { protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); private final String NAMESPACE_URI_V1 = "http://openclinica.org/ws/studyEventDefinition/v1"; private final DataSource dataSource; private final MessageSource messages; private final Locale locale; StudyDAO studyDao; UserAccountDAO userAccountDao; CRFDAO crfDao; CRFVersionDAO crfVersionDao; StudyEventDefinitionDAO studyEventDefinitionDao; EventDefinitionCRFDAO eventDefinitionCRFDao; public StudyEventDefinitionEndpoint(DataSource dataSource, MessageSource messages) { this.dataSource = dataSource; this.messages = messages; this.locale = new Locale("en_US"); } /** * if NAMESPACE_URI_V1:getStudyListRequest execute this method * * @return * @throws Exception */ @PayloadRoot(localPart = "listAllRequest", namespace = NAMESPACE_URI_V1) public Source getStudyList(@XPathParam("//sed:studyEventDefinitionListAll") NodeList studyNodeList) throws Exception { ResourceBundleProvider.updateLocale(new Locale("en_US")); Element studyRefElement = (Element) studyNodeList.item(0); // StudyEventDefinitionRequestBean studyEventDefinitionRequestBean = unMarshallRequest(studyRefElement); BaseStudyDefinitionBean studyEventDefinitionRequestBean = unMarshallRequest(studyRefElement); DataBinder dataBinder = new DataBinder((studyEventDefinitionRequestBean)); Errors errors = dataBinder.getBindingResult(); StudyEventDefinitionRequestValidator studyEventDefinitionRequestValidator = new StudyEventDefinitionRequestValidator(dataSource); studyEventDefinitionRequestValidator.validate((studyEventDefinitionRequestBean), errors); if (!errors.hasErrors()) { return new DOMSource(mapConfirmation(getStudy(studyEventDefinitionRequestBean), messages.getMessage("studyEventDefinitionEndpoint.success", null, "Success", locale))); } else { return new DOMSource(mapFailConfirmation(messages.getMessage("studyEventDefinitionEndpoint.fail", null, "Fail", locale), errors)); } } // StudyBean getStudy(StudyEventDefinitionRequestBean studyEventDefinitionRequestBean) { StudyBean getStudy(BaseStudyDefinitionBean studyEventDefinitionRequestBean) { StudyBean study = null; if (studyEventDefinitionRequestBean.getStudyUniqueId() != null && studyEventDefinitionRequestBean.getSiteUniqueId() == null) { study = getStudyDao().findByUniqueIdentifier(studyEventDefinitionRequestBean.getStudyUniqueId()); } if (studyEventDefinitionRequestBean.getStudyUniqueId() != null && studyEventDefinitionRequestBean.getSiteUniqueId() != null) { study = getStudyDao().findByUniqueIdentifier(studyEventDefinitionRequestBean.getSiteUniqueId()); } return study; } /** * Helper Method to get the user account * * @return UserAccountBean */ private UserAccountBean getUserAccount() { Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); String username = null; if (principal instanceof UserDetails) { username = ((UserDetails) principal).getUsername(); } else { username = principal.toString(); } return (UserAccountBean) getUserAccountDao().findByUserName(username); } // private StudyEventDefinitionRequestBean unMarshallRequest(Element studyEventDefinitionListAll) { private BaseStudyDefinitionBean unMarshallRequest(Element studyEventDefinitionListAll) { Element studyRefElement = DomUtils.getChildElementByTagName(studyEventDefinitionListAll, "studyRef"); Element studyIdentifierElement = DomUtils.getChildElementByTagName(studyRefElement, "identifier"); Element siteRef = DomUtils.getChildElementByTagName(studyRefElement, "siteRef"); Element siteIdentifierElement = siteRef == null ? null : DomUtils.getChildElementByTagName(siteRef, "identifier"); String studyIdentifier = studyIdentifierElement == null ? null : DomUtils.getTextValue(studyIdentifierElement).trim(); String siteIdentifier = siteIdentifierElement == null ? null : DomUtils.getTextValue(siteIdentifierElement).trim(); // StudyEventDefinitionRequestBean studyEventDefinitionRequestBean = // new StudyEventDefinitionRequestBean(studyIdentifier, siteIdentifier, getUserAccount()); BaseStudyDefinitionBean studyEventDefinitionRequestBean = new BaseStudyDefinitionBean(studyIdentifier, siteIdentifier, getUserAccount()); return studyEventDefinitionRequestBean; } /** * Create Response * * @param confirmation * @return * @throws Exception */ private Element mapConfirmation(StudyBean study, String confirmation) throws Exception { DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); Document document = docBuilder.newDocument(); Element responseElement = document.createElementNS(NAMESPACE_URI_V1, "listAllResponse"); Element resultElement = document.createElementNS(NAMESPACE_URI_V1, "result"); resultElement.setTextContent(confirmation); responseElement.appendChild(resultElement); Element studyListElement = document.createElementNS(NAMESPACE_URI_V1, "studyEventDefinitions"); responseElement.appendChild(studyListElement); List<StudyEventDefinitionBean> eventList = getStudyEventDefinitionDao().findAllByStudy(study); for (int index = 0; index < eventList.size(); index++) { StudyEventDefinitionBean event = eventList.get(index); Element studyElement = document.createElementNS(NAMESPACE_URI_V1, "studyEventDefinition"); Element element = document.createElementNS(NAMESPACE_URI_V1, "oid"); element.setTextContent(event.getOid()); studyElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "name"); element.setTextContent(event.getName()); studyElement.appendChild(element); studyListElement.appendChild(studyElement); List<EventDefinitionCRFBean> eventCrfs = (List<EventDefinitionCRFBean>) getEventDefinitionCRFDao().findAllByDefinition(study, event.getId()); Element eventDefinitionCrfListElement = document.createElementNS(NAMESPACE_URI_V1, "eventDefinitionCrfs"); studyElement.appendChild(eventDefinitionCrfListElement); for (int i = 0; i < eventCrfs.size(); i++) { EventDefinitionCRFBean eventCrf = eventCrfs.get(i); Element eventDefinitionCrfElement = document.createElementNS(NAMESPACE_URI_V1, "eventDefinitionCrf"); eventDefinitionCrfListElement.appendChild(eventDefinitionCrfElement); element = document.createElementNS(NAMESPACE_URI_V1, "required"); element.setTextContent(String.valueOf(eventCrf.isRequiredCRF())); eventDefinitionCrfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "doubleDataEntry"); element.setTextContent(String.valueOf(eventCrf.isDoubleEntry())); eventDefinitionCrfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "passwordRequired"); element.setTextContent(String.valueOf(eventCrf.isElectronicSignature())); eventDefinitionCrfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "hideCrf"); element.setTextContent(String.valueOf(eventCrf.isHideCrf())); eventDefinitionCrfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "participantForm"); element.setTextContent(String.valueOf(eventCrf.isParticipantForm())); eventDefinitionCrfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "allowAnonymousSubmission"); element.setTextContent(String.valueOf(eventCrf.isAllowAnonymousSubmission())); eventDefinitionCrfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "submissionUrl"); element.setTextContent(String.valueOf(eventCrf.getSubmissionUrl())); eventDefinitionCrfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "offline"); element.setTextContent(String.valueOf(eventCrf.isOffline())); eventDefinitionCrfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "sourceDataVerificaiton"); element.setTextContent(String.valueOf(eventCrf.getSourceDataVerification())); eventDefinitionCrfElement.appendChild(element); Element crfElement = document.createElementNS(NAMESPACE_URI_V1, "crf"); eventDefinitionCrfElement.appendChild(crfElement); CRFBean crfBean = (CRFBean) getCrfDao().findByPK(eventCrf.getCrfId()); element = document.createElementNS(NAMESPACE_URI_V1, "oid"); element.setTextContent(crfBean.getOid()); crfElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "name"); element.setTextContent(crfBean.getName()); crfElement.appendChild(element); Element crfVersionElement = document.createElementNS(NAMESPACE_URI_V1, "defaultCrfVersion"); eventDefinitionCrfElement.appendChild(crfVersionElement); CRFVersionBean crfVersionBean = (CRFVersionBean) getCrfVersionDao().findByPK(eventCrf.getDefaultVersionId()); element = document.createElementNS(NAMESPACE_URI_V1, "oid"); element.setTextContent(crfVersionBean.getOid()); crfVersionElement.appendChild(element); element = document.createElementNS(NAMESPACE_URI_V1, "name"); element.setTextContent(crfVersionBean.getName()); crfVersionElement.appendChild(element); } } return responseElement; } private Element mapFailConfirmation(String confirmation, Errors errors) throws Exception { DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); Document document = docBuilder.newDocument(); Element responseElement = document.createElementNS(NAMESPACE_URI_V1, "listAllResponse"); Element resultElement = document.createElementNS(NAMESPACE_URI_V1, "result"); resultElement.setTextContent(confirmation); responseElement.appendChild(resultElement); for (ObjectError error : errors.getAllErrors()) { Element errorElement = document.createElementNS(NAMESPACE_URI_V1, "error"); String theMessage = messages.getMessage(error.getCode(), error.getArguments(), locale); errorElement.setTextContent(theMessage); responseElement.appendChild(errorElement); } return responseElement; } public DataSource getDataSource() { return dataSource; } public StudyDAO getStudyDao() { studyDao = studyDao != null ? studyDao : new StudyDAO(dataSource); return studyDao; } public CRFDAO getCrfDao() { crfDao = crfDao != null ? crfDao : new CRFDAO(dataSource); return crfDao; } public CRFVersionDAO getCrfVersionDao() { crfVersionDao = crfVersionDao != null ? crfVersionDao : new CRFVersionDAO(dataSource); return crfVersionDao; } public StudyEventDefinitionDAO getStudyEventDefinitionDao() { studyEventDefinitionDao = studyEventDefinitionDao != null ? studyEventDefinitionDao : new StudyEventDefinitionDAO(dataSource); return studyEventDefinitionDao; } public EventDefinitionCRFDAO getEventDefinitionCRFDao() { eventDefinitionCRFDao = eventDefinitionCRFDao != null ? eventDefinitionCRFDao : new EventDefinitionCRFDAO(dataSource); return eventDefinitionCRFDao; } public UserAccountDAO getUserAccountDao() { userAccountDao = userAccountDao != null ? userAccountDao : new UserAccountDAO(dataSource); return userAccountDao; } }