package org.akaza.openclinica.controller.openrosa;
import org.akaza.openclinica.dao.hibernate.CrfVersionDao;
import org.akaza.openclinica.dao.hibernate.StudyDao;
import org.akaza.openclinica.domain.datamap.CrfVersion;
import org.akaza.openclinica.domain.datamap.Study;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Errors;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import static org.akaza.openclinica.controller.openrosa.SubmissionProcessorChain.ProcessorEnum;
@Component
public class OpenRosaSubmissionService {
@Autowired
private SubmissionProcessorChain submissionProcessorChain;
@Autowired
private StudyDao studyDao;
@Autowired
private CrfVersionDao crfVersionDao;
@Transactional
public void processRequest(Study study, HashMap<String,String> subjectContext, String requestBody, Errors errors, Locale locale, ArrayList <HashMap> listOfUploadFilePaths) throws Exception {
// Execute save as Hibernate transaction to avoid partial imports
CrfVersion crfVersion = crfVersionDao.findByOcOID(subjectContext.get("crfVersionOID"));
String requestPayload = parseSubmission(requestBody, crfVersion);
runAsTransaction(study, requestPayload, subjectContext, errors, locale ,listOfUploadFilePaths);
}
@Transactional
public void processFieldSubmissionRequest(Study study, HashMap<String,String> subjectContext, String instanceId, String requestBody, Errors errors, Locale locale, ArrayList <HashMap> listOfUploadFilePaths) throws Exception {
// Execute save as Hibernate transaction to avoid partial imports
// is this the initial form submission with just instanceId?
CrfVersion crfVersion = crfVersionDao.findByOcOID(subjectContext.get("crfVersionOID"));
processFieldPayload(study, requestBody, subjectContext, errors, locale ,listOfUploadFilePaths);
}
private void runAsTransaction(Study study, String requestBody, HashMap<String, String> subjectContext, Errors errors, Locale locale,ArrayList <HashMap> listOfUploadFilePaths) throws Exception{
SubmissionContainer container = new SubmissionContainer(study,requestBody,subjectContext,errors,locale ,listOfUploadFilePaths);
container.setProcessorEnum(ProcessorEnum.SUBMISSION_PROCESSOR);
submissionProcessorChain.processSubmission(container);
}
private void processFieldPayload(Study study, String requestBody, HashMap<String, String> subjectContext, Errors errors, Locale locale,ArrayList <HashMap> listOfUploadFilePaths) throws Exception{
SubmissionContainer container = new SubmissionContainer(study,requestBody,subjectContext,errors,locale ,listOfUploadFilePaths);
container.setProcessorEnum(checkInitialInstanceIdSubmission(requestBody));
submissionProcessorChain.processSubmission(container);
}
private String parseSubmission(String body, CrfVersion crfVersion) {
if (crfVersion.getXform() != null && !crfVersion.getXform().equals("")) {
body = body.substring(body.indexOf("<" + crfVersion.getXformName()));
int length = body.indexOf(" ");
body = body.replace(body.substring(body.lastIndexOf("<meta>"), body.lastIndexOf("</meta>") + 7), "");
body = body.substring(0, body.lastIndexOf("</" + crfVersion.getXformName()) + length + 2);
body = "<instance>" + body + "</instance>";
} else {
body = body.substring(body.indexOf("<F_"));
int length = body.indexOf(" ");
body = body.replace(body.substring(body.indexOf("<meta>"), body.indexOf("</meta>") + 7), "");
body = body.substring(0, body.indexOf("</F_") + length + 2);
body = "<instance>" + body + "</instance>";
}
return body;
}
private ProcessorEnum checkInitialInstanceIdSubmission(String body) {
if (body.indexOf("<instanceID>") > 0 &&
body.indexOf("</instanceID>") > 0) {
return ProcessorEnum.INSTANCE_ID_PROCESSOR;
} else {
return ProcessorEnum.FIELD_SUBMISSION_RPOCESSOR;
}
/*
try {
final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(body)));
final XPathExpression xpath = XPathFactory.newInstance().newXPath().compile("//*[count(./*) = 0]");
final NodeList nodeList = (NodeList) xpath.evaluate(doc, XPathConstants.NODESET);
for(int i = 0; i < nodeList.getLength(); i++) {
final Element el = (Element) nodeList.item(i);
System.out.println(el.getNodeName());
System.out.println(el.getTextContent());
if (el.getNodeName().equalsIgnoreCase("instanceID"))
return true;
}
} catch (Exception e) {
e.printStackTrace();
}*/
}
}