/*
* 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.service.extract;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.sql.DataSource;
import org.akaza.openclinica.bean.extract.ArchivedDatasetFileBean;
import org.akaza.openclinica.bean.extract.DatasetBean;
import org.akaza.openclinica.bean.extract.ExportFormatBean;
import org.akaza.openclinica.bean.extract.ExtractBean;
import org.akaza.openclinica.bean.extract.odm.AdminDataReportBean;
import org.akaza.openclinica.bean.extract.odm.FullReportBean;
import org.akaza.openclinica.bean.extract.odm.MetaDataReportBean;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.managestudy.StudySubjectBean;
import org.akaza.openclinica.bean.odmbeans.ODMBean;
import org.akaza.openclinica.dao.core.CoreResources;
import org.akaza.openclinica.dao.extract.ArchivedDatasetFileDAO;
import org.akaza.openclinica.dao.extract.DatasetDAO;
import org.akaza.openclinica.dao.hibernate.RuleSetRuleDao;
import org.akaza.openclinica.job.JobTerminationMonitor;
import org.akaza.openclinica.logic.odmExport.AdminDataCollector;
import org.akaza.openclinica.logic.odmExport.ClinicalDataCollector;
import org.akaza.openclinica.logic.odmExport.ClinicalDataUnit;
import org.akaza.openclinica.logic.odmExport.MetaDataCollector;
import org.akaza.openclinica.logic.odmExport.OdmStudyBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Doug Rodrigues (douglas.rodrigues@openclinica.com)
*
*/
public class OdmFileCreation {
private static final Logger LOG = LoggerFactory.getLogger(OdmFileCreation.class);
private RuleSetRuleDao ruleSetRuleDao;
private DataSource dataSource;
private CoreResources coreResources;
private static File files[]=null;
private static List<File> oldFiles = new LinkedList<File>();
public HashMap<String,Integer> createODMFile(String odmVersion, long sysTimeBegin, String generalFileDir,
DatasetBean datasetBean, StudyBean currentStudy, String generalFileDirCopy, ExtractBean eb,
Integer currentStudyId, Integer parentStudyId, String studySubjectNumber, boolean zipped,
boolean saveToDB, boolean deleteOld, String odmType, UserAccountBean userBean) {
Integer ssNumber = getStudySubjectNumber(studySubjectNumber);
MetaDataCollector mdc = new MetaDataCollector(dataSource, datasetBean, currentStudy,ruleSetRuleDao);
AdminDataCollector adc = new AdminDataCollector(dataSource, datasetBean, currentStudy);
ClinicalDataCollector cdc = new ClinicalDataCollector(dataSource, datasetBean, currentStudy);
MetaDataCollector.setTextLength(200);
if(deleteOld){
File file = new File(generalFileDir);
if(file.isDirectory())
{
files = file.listFiles();
oldFiles = Arrays.asList(files);
}
}
if (odmVersion != null) {
// by default odmVersion is 1.2
if ("1.3".equals(odmVersion)) {
ODMBean odmb = new ODMBean();
odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3 ODM1-3-0.xsd");
ArrayList<String> xmlnsList = new ArrayList<String>();
xmlnsList.add("xmlns=\"http://www.cdisc.org/ns/odm/v1.3\"");
odmb.setXmlnsList(xmlnsList);
odmb.setODMVersion("1.3");
mdc.setODMBean(odmb);
adc.setOdmbean(odmb);
cdc.setODMBean(odmb);
} else if ("oc1.2".equals(odmVersion)) {
ODMBean odmb = new ODMBean();
//odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.2 OpenClinica-ODM1-2-1.xsd");
odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.2 OpenClinica-ODM1-2-1-OC1.xsd");
ArrayList<String> xmlnsList = new ArrayList<String>();
xmlnsList.add("xmlns=\"http://www.cdisc.org/ns/odm/v1.2\"");
//xmlnsList.add("xmlns:OpenClinica=\"http://www.openclinica.org/ns/openclinica_odm/v1.2\"");
xmlnsList.add("xmlns:OpenClinica=\"http://www.openclinica.org/ns/odm_ext_v121/v3.1\"");
xmlnsList.add("xmlns:OpenClinicaRules=\"http://www.openclinica.org/ns/rules/v3.1\"");
odmb.setXmlnsList(xmlnsList);
odmb.setODMVersion("oc1.2");
mdc.setODMBean(odmb);
adc.setOdmbean(odmb);
cdc.setODMBean(odmb);
} else if ("oc1.3".equals(odmVersion)) {
ODMBean odmb = mdc.getODMBean();
//odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3 OpenClinica-ODM1-3-0.xsd");
//odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3 OpenClinica-ODM1-3-0-OC1.xsd");
odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3 OpenClinica-ODM1-3-0-OC2-0.xsd");
ArrayList<String> xmlnsList = new ArrayList<String>();
xmlnsList.add("xmlns=\"http://www.cdisc.org/ns/odm/v1.3\"");
//xmlnsList.add("xmlns:OpenClinica=\"http://www.openclinica.org/ns/openclinica_odm/v1.3\"");
xmlnsList.add("xmlns:OpenClinica=\"http://www.openclinica.org/ns/odm_ext_v130/v3.1\"");
xmlnsList.add("xmlns:OpenClinicaRules=\"http://www.openclinica.org/ns/rules/v3.1\"");
odmb.setXmlnsList(xmlnsList);
odmb.setODMVersion("oc1.3");
odmb.setOdmType(odmType);
mdc.setODMBean(odmb);
adc.setOdmbean(odmb);
cdc.setODMBean(odmb);
}
}
//////////////////////////////////////////
////////// MetaData Extraction //////////
mdc.collectFileData();
MetaDataReportBean metaReport = new MetaDataReportBean(mdc.getOdmStudyMap(),coreResources);
metaReport.setODMVersion(odmVersion);
metaReport.setOdmBean(mdc.getODMBean());
metaReport.createChunkedOdmXml(Boolean.TRUE);
long sysTimeEnd = System.currentTimeMillis() - sysTimeBegin;
String ODMXMLFileName = mdc.getODMBean().getFileOID() + ".xml";
int fId =
createFileK(ODMXMLFileName, generalFileDir, metaReport.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE, false, zipped, deleteOld, userBean);
if (!"".equals(generalFileDirCopy)) {
int fId2 =
createFileK(ODMXMLFileName, generalFileDirCopy, metaReport.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE,
false, zipped, deleteOld, userBean);
}
//////////////////////////////////////////
////////// AdminData Extraction //////////
adc.collectFileData();
AdminDataReportBean adminReport = new AdminDataReportBean(adc.getOdmAdminDataMap());
adminReport.setODMVersion(odmVersion);
adminReport.setOdmBean(mdc.getODMBean());
adminReport.createChunkedOdmXml(Boolean.TRUE);
sysTimeEnd = System.currentTimeMillis() - sysTimeBegin;
fId =
createFileK(ODMXMLFileName, generalFileDir, adminReport.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE, false, zipped, deleteOld, userBean);
if (!"".equals(generalFileDirCopy)) {
int fId2 =
createFileK(ODMXMLFileName, generalFileDirCopy, adminReport.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE,
false, zipped, deleteOld, userBean);
}
//////////////////////////////////////////
////////// ClinicalData Extraction ///////
DatasetDAO dsdao = new DatasetDAO(dataSource);
String sql = eb.getDataset().getSQLStatement();
String st_sed_in = dsdao.parseSQLDataset(sql, true, true);
String st_itemid_in = dsdao.parseSQLDataset(sql, false, true);
int datasetItemStatusId = eb.getDataset().getDatasetItemStatus().getId();
String ecStatusConstraint = dsdao.getECStatusConstraint(datasetItemStatusId);
String itStatusConstraint = dsdao.getItemDataStatusConstraint(datasetItemStatusId);
Iterator<OdmStudyBase> it = cdc.getStudyBaseMap().values().iterator();
while (it.hasNext()) {
JobTerminationMonitor.check();
OdmStudyBase u = it.next();
ArrayList newRows =
dsdao.selectStudySubjects(u.getStudy().getId(), 0, st_sed_in, st_itemid_in, dsdao.genDatabaseDateConstraint(eb), ecStatusConstraint,
itStatusConstraint);
///////////////
int fromIndex = 0;
boolean firstIteration = true;
while (fromIndex < newRows.size()) {
JobTerminationMonitor.check();
int toIndex = fromIndex + ssNumber < newRows.size() ? fromIndex + ssNumber : newRows.size() - 1;
List x = newRows.subList(fromIndex, toIndex + 1);
fromIndex = toIndex + 1;
String studySubjectIds = "";
for (int i = 0; i < x.size(); i++) {
StudySubjectBean sub = new StudySubjectBean();
sub = (StudySubjectBean) x.get(i);
studySubjectIds += "," + sub.getId();
}//for
studySubjectIds = studySubjectIds.replaceFirst(",", "");
ClinicalDataUnit cdata = new ClinicalDataUnit(dataSource, datasetBean, cdc.getOdmbean(), u.getStudy(), cdc.getCategory(), studySubjectIds);
cdata.setCategory(cdc.getCategory());
cdata.collectOdmClinicalData();
FullReportBean report = new FullReportBean();
report.setClinicalData(cdata.getOdmClinicalData());
report.setOdmStudyMap(mdc.getOdmStudyMap());
report.setODMVersion(odmVersion);
//report.setOdmStudy(mdc.getOdmStudy());
report.setOdmBean(mdc.getODMBean());
if (firstIteration && fromIndex >= newRows.size()) {
report.createChunkedOdmXml(Boolean.TRUE, true, true);
firstIteration = false;
} else if (firstIteration) {
report.createChunkedOdmXml(Boolean.TRUE, true, false);
firstIteration = false;
} else if (fromIndex >= newRows.size()) {
report.createChunkedOdmXml(Boolean.TRUE, false, true);
} else {
report.createChunkedOdmXml(Boolean.TRUE, false, false);
}
fId = createFileK(ODMXMLFileName, generalFileDir, report.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE,
false, zipped, deleteOld, userBean);
if (!"".equals(generalFileDirCopy)) {
int fId2 = createFileK(ODMXMLFileName, generalFileDirCopy, report.getXmlOutput().toString(), datasetBean, sysTimeEnd,
ExportFormatBean.XMLFILE, false, zipped, deleteOld, userBean);
}
}
}
sysTimeEnd = System.currentTimeMillis() - sysTimeBegin;
fId = createFileK(ODMXMLFileName, generalFileDir, "</ODM>", datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE, saveToDB, zipped, deleteOld, userBean);
if (!"".equals(generalFileDirCopy)) {
int fId2 = createFileK(ODMXMLFileName, generalFileDirCopy, "</ODM>", datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE, false, zipped, deleteOld, userBean);
}
//////////////////////////////////////////
////////// pre pagination extraction /////
/*
mdc.collectFileData();
adc.collectOdmAdminDataMap();
cdc.collectOdmClinicalDataMap();
FullReportBean report = new FullReportBean();
report.setClinicalDataMap(cdc.getOdmClinicalDataMap());
report.setAdminDataMap(adc.getOdmAdminDataMap());
report.setOdmStudyMap(mdc.getOdmStudyMap());
report.setOdmBean(mdc.getODMBean());
report.setODMVersion(odmVersion);
report.createOdmXml(Boolean.TRUE);
long sysTimeEnd = System.currentTimeMillis() - sysTimeBegin;
String ODMXMLFileName = mdc.getODMBean().getFileOID() + ".xml";
int fId = this.createFile(ODMXMLFileName, generalFileDir, report.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE, true);
if (!"".equals(generalFileDirCopy)) {
int fId2 = this.createFile(ODMXMLFileName, generalFileDirCopy, report.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE, false);
} */
HashMap answerMap = new HashMap<String, Integer>();
//JN: Zipped in the next stage as thats where the ODM file is named and copied over in default categories.
// if(zipped)
// { try {
// zipFile(ODMXMLFileName,generalFileDir);
//
// } catch (IOException e) {
// // TODO Auto-generated catch block
// logger.error(e.getMessage());
// e.printStackTrace();
// }
//
// } // return ODMXMLFileName;
answerMap.put(ODMXMLFileName, new Integer(fId));
// if(deleteOld && files!=null &&oldFiles!=null) setOldFiles(oldFiles);
return answerMap;
}
public int createFileK(String name, String dir, String content,
DatasetBean datasetBean, long time, ExportFormatBean efb,
boolean saveToDB, boolean zipped, boolean deleteOld, UserAccountBean userBean) {
ArchivedDatasetFileBean fbFinal = new ArchivedDatasetFileBean();
// >> tbh 04/2010 #4915 replace all names' spaces with underscores
name = name.replaceAll(" ", "_");
fbFinal.setId(0);
BufferedWriter w =null;
try {
File complete = new File(dir);
if (!complete.isDirectory()) {
complete.mkdirs();
}
// else if(deleteOld)// so directory exists check if the files are there
// {
// deleteDirectory(complete);
// }
//File newFile = new File(complete, name);
//newFile.setLastModified(System.currentTimeMillis());
File oldFile = new File(complete, name);
File newFile = null;
if (oldFile.exists()) {
newFile = oldFile;
if(oldFiles!=null || !oldFiles.isEmpty() )
oldFiles.remove(oldFile);
} else {
newFile = new File(complete, name);
}
//File
newFile.setLastModified(System.currentTimeMillis());
w = new BufferedWriter(new FileWriter(newFile, true));
w.write(content);
w.close();
LOG.info("finished writing the text file...");
// set up the zip to go into the database
if (saveToDB) {
ArchivedDatasetFileBean fb = new ArchivedDatasetFileBean();
if (zipped) {
fb.setName(name + ".zip");
fb.setFileReference(dir + name + ".zip");
} else {
fb.setName(name);
fb.setFileReference(dir + name);
}
// logger.info("ODM filename: " + name + ".zip");
// logger.info("ODM fileReference: " + dir + name + ".zip");
// current location of the file on the system
fb.setFileSize((int) newFile.length());
// logger.info("ODM setFileSize: " + (int)newFile.length() );
// set the above to compressed size?
fb.setRunTime((int) time);
// logger.info("ODM setRunTime: " + (int)time );
// need to set this in milliseconds, get it passed from above
// methods?
fb.setDatasetId(datasetBean.getId());
// logger.info("ODM setDatasetid: " + ds.getId() );
fb.setExportFormatBean(efb);
// logger.info("ODM setExportFormatBean: success" );
fb.setExportFormatId(efb.getId());
// logger.info("ODM setExportFormatId: " + efb.getId());
fb.setOwner(userBean);
// logger.info("ODM setOwner: " + sm.getUserBean());
fb.setOwnerId(userBean.getId());
// logger.info("ODM setOwnerId: " + sm.getUserBean().getId() );
fb.setDateCreated(new Date(System.currentTimeMillis()));
boolean write = true;
ArchivedDatasetFileDAO asdfDAO = new ArchivedDatasetFileDAO(dataSource);
// eliminating all checks so that we create multiple files, tbh 6-7
if (write) {
fbFinal = (ArchivedDatasetFileBean) asdfDAO.create(fb);
} else {
LOG.info("duplicate found: " + fb.getName());
}
}
// created in database!
} catch (Exception e) {
LOG.error(e.getMessage());
e.printStackTrace();
}
finally{
if(w!=null)
try {
w.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return fbFinal.getId();
}
private Integer getStudySubjectNumber(String studySubjectNumber){
try{
Integer value = Integer.valueOf(studySubjectNumber);
return value > 0 ? value : 99;
}catch (NumberFormatException e) {
return 99;
}
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public RuleSetRuleDao getRuleSetRuleDao() {
return ruleSetRuleDao;
}
public void setRuleSetRuleDao(RuleSetRuleDao ruleSetRuleDao) {
this.ruleSetRuleDao = ruleSetRuleDao;
}
public CoreResources getCoreResources() {
return coreResources;
}
public void setCoreResources(CoreResources coreResources) {
this.coreResources = coreResources;
}
}