/* 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.bean.extract.odm;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import org.akaza.openclinica.bean.odmbeans.AuditLogBean;
import org.akaza.openclinica.bean.odmbeans.AuditLogsBean;
import org.akaza.openclinica.bean.odmbeans.ChildNoteBean;
import org.akaza.openclinica.bean.odmbeans.DiscrepancyNoteBean;
import org.akaza.openclinica.bean.odmbeans.DiscrepancyNotesBean;
import org.akaza.openclinica.bean.odmbeans.OdmClinicalDataBean;
import org.akaza.openclinica.bean.submit.crfdata.ExportFormDataBean;
import org.akaza.openclinica.bean.submit.crfdata.ExportStudyEventDataBean;
import org.akaza.openclinica.bean.submit.crfdata.ExportSubjectDataBean;
import org.akaza.openclinica.bean.submit.crfdata.ImportItemDataBean;
import org.akaza.openclinica.bean.submit.crfdata.ImportItemGroupDataBean;
import org.akaza.openclinica.bean.submit.crfdata.SubjectGroupDataBean;
import org.apache.commons.lang.StringEscapeUtils;
/**
* Create ODM XML ClinicalData Element for a study.
*
* @author ywang (May, 2008)
*/
public class ClinicalDataReportBean extends OdmXmlReportBean {
private OdmClinicalDataBean clinicalData;
public ClinicalDataReportBean(OdmClinicalDataBean clinicaldata) {
super();
this.clinicalData = clinicaldata;
}
/**
* has not been implemented yet
*/
@Override
public void createOdmXml(boolean isDataset) {
// this.addHeading();
// this.addRootStartLine();
// addNodeClinicalData();
// this.addRootEndLine();
}
public void addNodeClinicalData(boolean header, boolean footer) {
String ODMVersion = this.getODMVersion();
// when collecting data, only item with value has been collected.
StringBuffer xml = this.getXmlOutput();
String indent = this.getIndent();
String nls = System.getProperty("line.separator");
if (header) {
xml.append(indent + "<ClinicalData StudyOID=\"" + StringEscapeUtils.escapeXml(clinicalData.getStudyOID()) + "\" MetaDataVersionOID=\""
+ StringEscapeUtils.escapeXml(this.clinicalData.getMetaDataVersionOID()) + "\">");
xml.append(nls);
}
ArrayList<ExportSubjectDataBean> subs = (ArrayList<ExportSubjectDataBean>) this.clinicalData.getExportSubjectData();
for (ExportSubjectDataBean sub : subs) {
xml.append(indent + indent + "<SubjectData SubjectKey=\"" + StringEscapeUtils.escapeXml(sub.getSubjectOID()));
if ("oc1.2".equalsIgnoreCase(ODMVersion) || "oc1.3".equalsIgnoreCase(ODMVersion)) {
xml.append("\" OpenClinica:StudySubjectID=\"" + StringEscapeUtils.escapeXml(sub.getStudySubjectId()));
String uniqueIdentifier = sub.getUniqueIdentifier();
if (uniqueIdentifier != null && uniqueIdentifier.length() > 0) {
xml.append("\" OpenClinica:UniqueIdentifier=\"" + StringEscapeUtils.escapeXml(uniqueIdentifier));
}
String status = sub.getStatus();
if (status != null && status.length() > 0) {
xml.append("\" OpenClinica:Status=\"" + StringEscapeUtils.escapeXml(status));
}
String secondaryId = sub.getSecondaryId();
if (secondaryId != null && secondaryId.length() > 0) {
xml.append("\" OpenClinica:SecondaryID=\"" + StringEscapeUtils.escapeXml(secondaryId));
}
Integer year = sub.getYearOfBirth();
if (year != null) {
xml.append("\" OpenClinica:YearOfBirth=\"" + sub.getYearOfBirth());
} else {
if (sub.getDateOfBirth() != null) {
xml.append("\" OpenClinica:DateOfBirth=\"" + sub.getDateOfBirth());
}
}
String gender = sub.getSubjectGender();
if (gender != null && gender.length() > 0) {
xml.append("\" OpenClinica:Sex=\"" + StringEscapeUtils.escapeXml(gender));
}
String enrollmentDate = sub.getEnrollmentDate();
if(enrollmentDate!=null && enrollmentDate.length()>0){
xml.append("\" OpenClinica:EnrollmentDate=\"" + enrollmentDate);
}
}
xml.append("\">");
xml.append(nls);
//
ArrayList<ExportStudyEventDataBean> ses = (ArrayList<ExportStudyEventDataBean>) sub.getExportStudyEventData();
for (ExportStudyEventDataBean se : ses) {
xml.append(indent + indent + indent + "<StudyEventData StudyEventOID=\"" + StringEscapeUtils.escapeXml(se.getStudyEventOID()));
if ("oc1.2".equalsIgnoreCase(ODMVersion) || "oc1.3".equalsIgnoreCase(ODMVersion)) {
String location = se.getLocation();
if (location != null && location.length() > 0) {
xml.append("\" OpenClinica:StudyEventLocation=\"" + StringEscapeUtils.escapeXml(location));
}
String startDate = se.getStartDate();
if (startDate != null && startDate.length() > 0) {
xml.append("\" OpenClinica:StartDate=\"" + startDate);
}
String endDate = se.getEndDate();
if (endDate != null && endDate.length() > 0) {
xml.append("\" OpenClinica:EndDate=\"" + endDate);
}
String status = se.getStatus();
if (status != null && status.length() > 0) {
xml.append("\" OpenClinica:Status=\"" + StringEscapeUtils.escapeXml(status));
}
if (se.getAgeAtEvent() != null) {
xml.append("\" OpenClinica:SubjectAgeAtEvent=\"" + se.getAgeAtEvent());
}
}
xml.append("\"");
if (!"-1".equals(se.getStudyEventRepeatKey())) {
xml.append(" StudyEventRepeatKey=\"" + se.getStudyEventRepeatKey() + "\"");
}
xml.append(">");
xml.append(nls);
//
ArrayList<ExportFormDataBean> forms = se.getExportFormData();
for (ExportFormDataBean form : forms) {
xml.append(indent + indent + indent + indent + "<FormData FormOID=\"" + StringEscapeUtils.escapeXml(form.getFormOID()));
if ("oc1.2".equalsIgnoreCase(ODMVersion) || "oc1.3".equalsIgnoreCase(ODMVersion)) {
String crfVersion = form.getCrfVersion();
if (crfVersion != null && crfVersion.length() > 0) {
xml.append("\" OpenClinica:Version=\"" + StringEscapeUtils.escapeXml(crfVersion));
}
String interviewerName = form.getInterviewerName();
if (interviewerName != null && interviewerName.length() > 0) {
xml.append("\" OpenClinica:InterviewerName=\"" + StringEscapeUtils.escapeXml(interviewerName));
}
if (form.getInterviewDate() != null && form.getInterviewDate().length() > 0) {
xml.append("\" OpenClinica:InterviewDate=\"" + form.getInterviewDate());
}
String status = form.getStatus();
if (status != null && status.length() > 0) {
xml.append("\" OpenClinica:Status=\"" + StringEscapeUtils.escapeXml(status));
}
}
xml.append("\">");
xml.append(nls);
//
ArrayList<ImportItemGroupDataBean> igs = form.getItemGroupData();
sortImportItemGroupDataBeanList(igs);
for (ImportItemGroupDataBean ig : igs) {
xml.append(indent + indent + indent + indent + indent + "<ItemGroupData ItemGroupOID=\""
+ StringEscapeUtils.escapeXml(ig.getItemGroupOID()) + "\" ");
if (!"-1".equals(ig.getItemGroupRepeatKey())) {
xml.append("ItemGroupRepeatKey=\"" + ig.getItemGroupRepeatKey() + "\" ");
}
xml.append("TransactionType=\"Insert\">");
xml.append(nls);
ArrayList<ImportItemDataBean> items = ig.getItemData();
sortImportItemDataBeanList(items);
for (ImportItemDataBean item : items) {
boolean printValue = true;
xml.append(indent + indent + indent + indent + indent + indent + "<ItemData ItemOID=\""
+ StringEscapeUtils.escapeXml(item.getItemOID()) + "\" ");
if ("Yes".equals(item.getIsNull())) {
xml.append("IsNull=\"Yes\"");
if(!item.isHasValueWithNull()) {
printValue = false;
}
if ("oc1.2".equalsIgnoreCase(ODMVersion) || "oc1.3".equalsIgnoreCase(ODMVersion)) {
xml.append(" OpenClinica:ReasonForNull=\"" + StringEscapeUtils.escapeXml(item.getReasonForNull()) + "\" ");
if(!printValue) {
xml.append("/>");
xml.append(nls);
}
}
}
if(printValue) {
Boolean hasElm = false;
xml.append("Value=\"" + StringEscapeUtils.escapeXml(item.getValue()) + "\"");
String muRefOid = item.getMeasurementUnitRef().getElementDefOID();
if (muRefOid != null && muRefOid.length() > 0) {
if (hasElm) {
} else {
xml.append(">");
xml.append(nls);
hasElm = true;
}
xml.append(indent + indent + indent + indent + indent + indent + indent + "<MeasurementUnitRef MeasurementUnitOID=\""
+ StringEscapeUtils.escapeXml(muRefOid) + "\"/>");
xml.append(nls);
}
//
if ("oc1.2".equalsIgnoreCase(ODMVersion) || "oc1.3".equalsIgnoreCase(ODMVersion)) {
if (item.getAuditLogs() != null && item.getAuditLogs().getAuditLogs().size() > 0) {
if (hasElm) {
} else {
xml.append(">");
xml.append(nls);
hasElm = true;
}
this.addAuditLogs(item.getAuditLogs(), indent + indent + indent + indent + indent + indent + indent ,"item");
}
//
if (item.getDiscrepancyNotes() != null && item.getDiscrepancyNotes().getDiscrepancyNotes().size() > 0) {
if (hasElm) {
} else {
xml.append(">");
xml.append(nls);
hasElm = true;
}
this.addDiscrepancyNotes(item.getDiscrepancyNotes(), indent + indent + indent + indent + indent + indent + indent);
}
}
if (hasElm) {
xml.append(indent + indent + indent + indent + indent + indent + "</ItemData>");
xml.append(nls);
hasElm = false;
} else {
xml.append("/>");
xml.append(nls);
}
}
}
xml.append(indent + indent + indent + indent + indent + "</ItemGroupData>");
xml.append(nls);
}
//
if ("oc1.2".equalsIgnoreCase(ODMVersion) || "oc1.3".equalsIgnoreCase(ODMVersion)) {
if (form.getAuditLogs() != null && form.getAuditLogs().getAuditLogs().size() > 0) {
this.addAuditLogs(form.getAuditLogs(), indent + indent + indent + indent + indent ,"form");
}
//
if (form.getDiscrepancyNotes() != null && form.getDiscrepancyNotes().getDiscrepancyNotes().size() > 0) {
this.addDiscrepancyNotes(form.getDiscrepancyNotes(), indent + indent + indent + indent + indent);
}
}
xml.append(indent + indent + indent + indent + "</FormData>");
xml.append(nls);
}
//
if ("oc1.2".equalsIgnoreCase(ODMVersion) || "oc1.3".equalsIgnoreCase(ODMVersion)) {
if (se.getAuditLogs() != null && se.getAuditLogs().getAuditLogs().size() > 0) {
this.addAuditLogs(se.getAuditLogs(), indent + indent + indent + indent ,"se");
}
//
if (se.getDiscrepancyNotes() != null && se.getDiscrepancyNotes().getDiscrepancyNotes().size() > 0) {
this.addDiscrepancyNotes(se.getDiscrepancyNotes(), indent + indent + indent + indent);
}
}
xml.append(indent + indent + indent + "</StudyEventData>");
xml.append(nls);
}
if ("oc1.2".equalsIgnoreCase(ODMVersion) || "oc1.3".equalsIgnoreCase(ODMVersion)) {
ArrayList<SubjectGroupDataBean> sgddata = (ArrayList<SubjectGroupDataBean>) sub.getSubjectGroupData();
if (sgddata.size() > 0) {
for (SubjectGroupDataBean sgd : sgddata) {
String cid =
sgd.getStudyGroupClassId() != null ? "OpenClinica:StudyGroupClassID=\"" + StringEscapeUtils.escapeXml(sgd.getStudyGroupClassId())
+ "\" " : "";
if (cid.length() > 0) {
String cn =
sgd.getStudyGroupClassName() != null ? "OpenClinica:StudyGroupClassName=\""
+ StringEscapeUtils.escapeXml(sgd.getStudyGroupClassName()) + "\" " : "";
String gn =
sgd.getStudyGroupName() != null ? "OpenClinica:StudyGroupName=\"" + StringEscapeUtils.escapeXml(sgd.getStudyGroupName())
+ "\" " : "";
xml.append(indent + indent + indent + "<OpenClinica:SubjectGroupData " + cid + cn + gn);
}
xml.append(" />");
xml.append(nls);
}
}
//
if (sub.getAuditLogs() != null && sub.getAuditLogs().getAuditLogs().size() > 0) {
this.addAuditLogs(sub.getAuditLogs(), indent + indent + indent,"sub");
}
//
if (sub.getDiscrepancyNotes() != null && sub.getDiscrepancyNotes().getDiscrepancyNotes().size() > 0) {
this.addDiscrepancyNotes(sub.getDiscrepancyNotes(), indent + indent + indent);
}
}
xml.append(indent + indent + "</SubjectData>");
xml.append(nls);
}
if (footer) {
xml.append(indent + "</ClinicalData>");
xml.append(nls);
}
}
protected void addAuditLogs(AuditLogsBean auditLogs, String currentIndent ,String entity) {
int count=0;
if (auditLogs != null) {
ArrayList<AuditLogBean> audits = auditLogs.getAuditLogs();
if (audits != null && audits.size() > 0) {
for (AuditLogBean audit : audits) {
if (entity=="item" && audit.getOldValue().equals("") && audit.getNewValue().equals("")){
count++;
}
}
if (count!=audits.size()){
StringBuffer xml = this.getXmlOutput();
String indent = this.getIndent();
String nls = System.getProperty("line.separator");
xml.append(currentIndent + "<OpenClinica:AuditLogs EntityID=\"" + auditLogs.getEntityID() + "\">");
xml.append(nls);
for (AuditLogBean audit : audits) {
if (!(entity=="item" && audit.getOldValue().equals("") && audit.getNewValue().equals(""))){
this.addOneAuditLog(audit, currentIndent + indent);
}
}
xml.append(currentIndent + "</OpenClinica:AuditLogs>");
xml.append(nls);
}}
}
}
protected void addOneAuditLog(AuditLogBean audit, String currentIndent) {
if (audit != null) {
StringBuffer xml = this.getXmlOutput();
String indent = this.getIndent();
String nls = System.getProperty("line.separator");
String i = audit.getOid();
String u = audit.getUserId();
String userName = audit.getUserName();
String name = audit.getName();
Date d = audit.getDatetimeStamp();
String t = audit.getType();
String r = audit.getReasonForChange();
String o = audit.getOldValue();
String n = audit.getNewValue();
String vt = audit.getValueType();
Boolean p = i.length() > 0 || u.length() > 0 || d != null || t.length() > 0 || r.length() > 0 || o.length() > 0 || n.length() > 0 ? true : false;
if (p) {
xml.append(currentIndent + "<OpenClinica:AuditLog ");
if (i.length() > 0) {
xml.append("ID=\"" + StringEscapeUtils.escapeXml(i) + "\" ");
}
if (u.length() > 0) {
xml.append("UserID=\"" + StringEscapeUtils.escapeXml(u) + "\" ");
}
if(userName.length()>0){
xml.append("UserName=\"" + StringEscapeUtils.escapeXml(userName) + "\" ");
}
if(name.length()>0){
xml.append("Name=\"" + StringEscapeUtils.escapeXml(name) + "\" ");
}
if (d != null) {
xml.append("DateTimeStamp=\"" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(d) + "\" ");
}
if (t.length() > 0) {
xml.append(nls);
xml.append(currentIndent + " AuditType=\"" + t + "\" ");
}
if (r.length() > 0) {
xml.append(nls);
xml.append(currentIndent + " ReasonForChange=\"" + StringEscapeUtils.escapeXml(r) + "\" ");
}
if (o.length() > 0) {
xml.append(nls);
xml.append(currentIndent + " OldValue=\"" + StringEscapeUtils.escapeXml(o) + "\" ");
}
if (n.length() > 0) {
xml.append(nls);
xml.append(currentIndent + " NewValue=\"" + StringEscapeUtils.escapeXml(n) + "\"");
}
if (vt.length() > 0) {
xml.append(nls);
xml.append(currentIndent + " ValueType=\"" + StringEscapeUtils.escapeXml(vt) + "\"");
}
xml.append("/>");
xml.append(nls);
}
}
}
protected void addDiscrepancyNotes(DiscrepancyNotesBean DNs, String currentIndent) {
if (DNs != null) {
ArrayList<DiscrepancyNoteBean> dns = DNs.getDiscrepancyNotes();
if (dns != null && dns.size() > 0) {
StringBuffer xml = this.getXmlOutput();
String indent = this.getIndent();
String nls = System.getProperty("line.separator");
xml.append(currentIndent + "<OpenClinica:DiscrepancyNotes EntityID=\"" + DNs.getEntityID() + "\">");
xml.append(nls);
for (DiscrepancyNoteBean dn : dns) {
this.addOneDN(dn, currentIndent + indent);
}
xml.append(currentIndent + "</OpenClinica:DiscrepancyNotes>");
xml.append(nls);
}
}
}
protected void addOneDN(DiscrepancyNoteBean dn, String currentIndent) {
StringBuffer xml = this.getXmlOutput();
String indent = this.getIndent();
String nls = System.getProperty("line.separator");
//Boolean p = s.length()>0||i.length()>0||d.toString().length()>0||n>0 ? true : false;
xml.append(currentIndent + "<OpenClinica:DiscrepancyNote ");
if (dn.getOid() != null) {
String i = dn.getOid();
if (i.length() > 0) {
xml.append("ID=\"" + StringEscapeUtils.escapeXml(i) + "\" ");
}
}
if (dn.getStatus() != null) {
String s = dn.getStatus();
if (s.length() > 0) {
xml.append("Status=\"" + s + "\" ");
}
}
if (dn.getNoteType() != null) {
String s = dn.getNoteType();
if (s.length() > 0) {
xml.append("NoteType=\"" + s + "\" ");
}
}
if (dn.getDateUpdated() != null) {
Date d = dn.getDateUpdated();
if (d.toString().length() > 0) {
xml.append("DateUpdated=\"" + new SimpleDateFormat("yyyy-MM-dd").format(d) + "\" ");
}
}
if (dn.getEntityName() != null) {
String s = dn.getEntityName();
if (s.length() > 0) {
xml.append("EntityName=\"" + s + "\" ");
}
}
int n = dn.getNumberOfChildNotes();
if (n > 0) {
xml.append("NumberOfChildNotes=\"" + dn.getNumberOfChildNotes() + "\"");
}
xml.append(">");
xml.append(nls);
if (dn.getChildNotes() != null && dn.getChildNotes().size() > 0) {
for (ChildNoteBean cn : dn.getChildNotes()) {
xml.append(currentIndent + indent + "<OpenClinica:ChildNote ");
if (cn.getOid() != null) {
String s = cn.getOid();
if (s.length() > 0) {
xml.append("ID=\"" + s + "\" ");
}
}
if (cn.getStatus() != null) {
String s = cn.getStatus();
if (s.length() > 0) {
xml.append("Status=\"" + s + "\" ");
}
}
if (cn.getDateCreated() != null) {
Date d = cn.getDateCreated();
if (d.toString().length() > 0) {
xml.append("DateCreated=\"" + new SimpleDateFormat("yyyy-MM-dd").format(d) + "\" ");
}
}
if(cn.getOwnerUserName()!=""){
String ownerUserName = cn.getOwnerUserName();
if(ownerUserName.length()>0){
xml.append("UserName=\"" + ownerUserName + "\" ");
}
}
if(cn.getOwnerFirstName()!="" || cn.getOwnerLastName()!=""){
String ownerLastName = cn.getOwnerLastName();
String ownerFirstName = cn.getOwnerFirstName();
if(ownerLastName.length()>0 || ownerFirstName.length()>0){
xml.append("Name=\"" + ownerFirstName+" "+ownerLastName + "\"");
}
}
xml.append(">");
xml.append(nls);
if (cn.getDescription() != null) {
String dc = cn.getDescription();
if (dc.length() > 0) {
xml.append(currentIndent + indent + indent + "<OpenClinica:Description>" + StringEscapeUtils.escapeXml(dc)
+ "</OpenClinica:Description>");
xml.append(nls);
}
}
if (cn.getDetailedNote() != null) {
String nt = cn.getDetailedNote();
if (nt.length() > 0) {
xml.append(currentIndent + indent + indent + "<OpenClinica:DetailedNote>" + StringEscapeUtils.escapeXml(nt)
+ "</OpenClinica:DetailedNote>");
xml.append(nls);
}
}
if (cn.getUserRef() != null) {
String uid = cn.getUserRef().getElementDefOID();
String userName = cn.getUserRef().getUserName();
String fullName=cn.getUserRef().getFullName();
String temp="";
if(userName.length()>0){
temp+=" OpenClinica:UserName=\""+StringEscapeUtils.escapeXml(userName)+"\"";
}
if(fullName.length()>0){
temp+=" OpenClinica:FullName=\""+StringEscapeUtils.escapeXml(fullName)+"\"";
}
if (uid.length() > 0) {
xml.append(currentIndent + indent + indent + "<UserRef UserOID=\"" + StringEscapeUtils.escapeXml(uid)
+" \"" +temp+
"/>");
xml.append(nls);
}
}
xml.append(currentIndent + indent + "</OpenClinica:ChildNote>");
xml.append(nls);
}
}
xml.append(currentIndent + "</OpenClinica:DiscrepancyNote>");
xml.append(nls);
}
public void setClinicalData(OdmClinicalDataBean clinicaldata) {
this.clinicalData = clinicaldata;
}
public OdmClinicalDataBean getClinicalData() {
return this.clinicalData;
}
@SuppressWarnings("unchecked")
private void sortImportItemGroupDataBeanList(ArrayList<ImportItemGroupDataBean> igs) {
Collections.sort(igs, new Comparator() {
public int compare(Object o1, Object o2) {
String x1 = ((ImportItemGroupDataBean) o1).getItemGroupOID();
String x2 = ((ImportItemGroupDataBean) o2).getItemGroupOID();
int sComp = x1.compareTo(x2);
if (sComp != 0) {
return sComp;
} else {
Integer i1 = Integer.valueOf(((ImportItemGroupDataBean) o1).getItemGroupRepeatKey());
Integer i2 = Integer.valueOf(((ImportItemGroupDataBean) o2).getItemGroupRepeatKey());
return i1.compareTo(i2);
}
}
});
}
@SuppressWarnings("unchecked")
private void sortImportItemDataBeanList(ArrayList<ImportItemDataBean> items) {
Collections.sort(items, new Comparator() {
public int compare(Object o1, Object o2) {
String i1 = ((ImportItemDataBean) o1).getItemOID();
String i2 = ((ImportItemDataBean) o2).getItemOID();
// Integer i1 = ((ImportItemDataBean) o1).getItemId();
// Integer i2 = ((ImportItemDataBean) o2).getItemId();
return i1.compareTo(i2);
}
});
}
}