/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
*
* Copyright 2003-2009 Akaza Research
*/
package org.akaza.openclinica.ws.ccts;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.bean.managestudy.SubjectTransferBean;
import org.akaza.openclinica.service.subject.SubjectServiceInterface;
import org.akaza.openclinica.ws.logic.CctsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.util.xml.DomUtils;
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.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author Krikor Krumlian
*
*/
@Endpoint
public class CctsSubjectEndpoint {
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
private final String NAMESPACE_URI_V1 = "http://openclinica.org/ws/ccts/subject/v1";
private final String SUCCESS_MESSAGE = "success";
private String dateFormat;
private final SubjectServiceInterface subjectService;
private final CctsService cctsService;
/**
* Constructor
* @param subjectService
* @param cctsService
*/
public CctsSubjectEndpoint(SubjectServiceInterface subjectService, CctsService cctsService) {
this.subjectService = subjectService;
this.cctsService = cctsService;
}
/**
* if NAMESPACE_URI_V1:commitRequest execute this method
* @param gridId
* @param subject
* @param studyOid
* @return
* @throws Exception
*/
@PayloadRoot(localPart = "commitRequest", namespace = NAMESPACE_URI_V1)
public Source createSubject(@XPathParam("//s:gridId") String gridId, @XPathParam("//s:subject") NodeList subject,
@XPathParam("//s:study/@oid") String studyOid) throws Exception {
Element subjectElement = (Element) (subject.item(0));
SubjectTransferBean subjectTranferBean = unMarshallToSubjectTransfer(gridId, subjectElement, studyOid);
// TODO: Add Logic
logger.debug("In CreateSubject");
return new DOMSource(mapConfirmation(SUCCESS_MESSAGE));
}
/**
* if NAMESPACE_URI_V1:commitRequest execute this method
* @param gridId
* @param subject
* @param studyOid
* @return
* @throws Exception
*/
@PayloadRoot(localPart = "rollbackRequest", namespace = NAMESPACE_URI_V1)
public Source rollBackSubject(@XPathParam("//s:gridId") String gridId, @XPathParam("//s:subject") NodeList subject,
@XPathParam("//s:study/@oid") String studyOid) throws Exception {
Element subjectElement = (Element) (subject.item(0));
SubjectTransferBean subjectTranferBean = unMarshallToSubjectTransfer(gridId, subjectElement, studyOid);
// TODO: Add Logic
return new DOMSource(mapConfirmation(SUCCESS_MESSAGE));
}
/**
* UnMarshall SubjectTransferBean, aka create SubjectTransferBean from XML
* @param gridId
* @param subjectElement
* @param studyOidValue
* @return
* @throws ParseException
*/
private SubjectTransferBean unMarshallToSubjectTransfer(String gridId, Element subjectElement, String studyOidValue) throws ParseException {
Element personIdElement = DomUtils.getChildElementByTagName(subjectElement, "personId");
Element studySubjectIdElement = DomUtils.getChildElementByTagName(subjectElement, "studySubjectId");
Element secondaryIdElement = DomUtils.getChildElementByTagName(subjectElement, "secondaryId");
Element enrollmentDateElement = DomUtils.getChildElementByTagName(subjectElement, "enrollmentDate");
Element genderElement = DomUtils.getChildElementByTagName(subjectElement, "gender");
Element dateOfBirthElement = DomUtils.getChildElementByTagName(subjectElement, "dateOfBirth");
String personIdValue = DomUtils.getTextValue(personIdElement);
String studySubjectIdValue = DomUtils.getTextValue(studySubjectIdElement);
String genderValue = DomUtils.getTextValue(genderElement);
String secondaryIdValue = DomUtils.getTextValue(secondaryIdElement);
String enrollmentDateValue = DomUtils.getTextValue(enrollmentDateElement);
String dateOfBirthValue = DomUtils.getTextValue(dateOfBirthElement);
SubjectTransferBean subjectTransferBean = new SubjectTransferBean();
subjectTransferBean.setStudyOid(studyOidValue);
subjectTransferBean.setPersonId(personIdValue);
subjectTransferBean.setStudySubjectId(studySubjectIdValue);
subjectTransferBean.setGender(genderValue.toCharArray()[0]);
subjectTransferBean.setDateOfBirth(getDate(dateOfBirthValue));
//subjectTransferBean.setSecondaryId(secondaryIdValue);
subjectTransferBean.setEnrollmentDate(getDate(enrollmentDateValue));
return subjectTransferBean;
}
/**
* Create Response
* @param confirmation
* @return
* @throws Exception
*/
private Element mapConfirmation(String confirmation) throws Exception {
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document document = docBuilder.newDocument();
Element responseElement = document.createElementNS(NAMESPACE_URI_V1, "commitResponse");
Element resultElement = document.createElementNS(NAMESPACE_URI_V1, "result");
resultElement.setTextContent(confirmation);
responseElement.appendChild(resultElement);
return responseElement;
}
/**
* Helper Method to resolve dates
* @param dateAsString
* @return
* @throws ParseException
*/
private Date getDate(String dateAsString) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(getDateFormat());
return sdf.parse(dateAsString);
}
/**
* 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();
}
// TODO: Call UserAccountDao.findByUserName()
return null;
}
/**
* @return
*/
public String getDateFormat() {
return dateFormat;
}
/**
* @param dateFormat
*/
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
}