/* * 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.logic.odmExport; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.TimeZone; import javax.sql.DataSource; import org.akaza.openclinica.bean.extract.DatasetBean; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean; import org.akaza.openclinica.bean.odmbeans.ODMBean; import org.akaza.openclinica.dao.managestudy.StudyDAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Prepare data for one ODM XML file. * * @author ywang (May, 2008) */ public abstract class OdmDataCollector { protected DataSource ds; protected DatasetBean dataset; private ODMBean odmbean; // key is study/site oc_oid. private LinkedHashMap<String, OdmStudyBase> studyBaseMap; // 0: one Study Element; 1: one parent study and its sites private int category; protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); public OdmDataCollector() { } /** * Constructor for an ODM XML file containing information of the passed * StudyBean. If it is a site, * only contains information of this site. If it is a study, * contains information of this study and its sites if appliable. * * @param ds * @param study */ public OdmDataCollector(DataSource ds, StudyBean study) { this.ds = ds; if (this.ds == null) { logger.info("DataSource is null!"); return; } if(study == null) createFakeStudyObj(); else{ if (study.getId() < 1) { logger.info("There is no study."); return; } dataset = new DatasetBean(); odmbean = new ODMBean(); if(study!=null) { if (study.isSite(study.getParentStudyId())) { this.studyBaseMap = new LinkedHashMap<String, OdmStudyBase>(); this.studyBaseMap.put(study.getOid(), new OdmStudyBase(ds, study)); this.category = 0; } else { int parentStudyId = study.getParentStudyId() > 0 ? study.getParentStudyId() : study.getId(); this.studyBaseMap = populateCompletedStudyBaseMap(parentStudyId); category = 1; } } } } private void createFakeStudyObj() { dataset = new DatasetBean(); odmbean = new ODMBean(); StudyBean studyBean = new StudyBean(); studyBean.setName(MetadataUnit.FAKE_STUDY_NAME); studyBean.setOid(MetadataUnit.FAKE_STUDY_OID); studyBean.setParentStudyId(0); StudyEventDefinitionBean sedFake = new StudyEventDefinitionBean(); sedFake.setName(MetadataUnit.FAKE_SE_NAME); sedFake.setOid(MetadataUnit.FAKE_STUDY_EVENT_OID); List<StudyEventDefinitionBean> seds = new ArrayList<StudyEventDefinitionBean>(); seds.add(sedFake); LinkedHashMap<String, OdmStudyBase> Bases = new LinkedHashMap<String, OdmStudyBase>(); Bases.put(studyBean.getOid(),new OdmStudyBase(ds, studyBean,seds)); //this.studyBaseMap = new LinkedHashMap<String, OdmStudyBase>(); this.studyBaseMap = Bases; } /** * Constructor for dataset of current study. If current study is a site, * only contains information of this site. If current study is a study, * contains information of this study and its sites if appliable. * * @param ds * @param dataset */ public OdmDataCollector(DataSource ds, DatasetBean dataset, StudyBean currentStudy) { this.ds = ds; if (this.ds == null) { logger.info("DataSource is null!"); return; } this.dataset = dataset; odmbean = new ODMBean(); StudyBean study = (StudyBean) new StudyDAO(ds).findByPK(dataset.getStudyId()); if (currentStudy.isSite(currentStudy.getParentStudyId())) { this.studyBaseMap = new LinkedHashMap<String, OdmStudyBase>(); this.studyBaseMap.put(study.getOid(), new OdmStudyBase(ds, study)); this.category = 0; } else { int parentStudyId = study.getParentStudyId() > 0 ? study.getParentStudyId() : study.getId(); this.studyBaseMap = populateCompletedStudyBaseMap(parentStudyId); category = 1; } } /** * Populate a HashMap<String, OdmStudyBase> of a study and its sites if * appliable, the key is study/site oc_oid. * * @param parentStudyId * @return */ public LinkedHashMap<String, OdmStudyBase> populateCompletedStudyBaseMap(int parentStudyId) { LinkedHashMap<String, OdmStudyBase> Bases = new LinkedHashMap<String, OdmStudyBase>(); StudyDAO sdao = new StudyDAO(this.ds); for (StudyBean s : (ArrayList<StudyBean>) sdao.findAllByParentStudyIdOrderedByIdAsc(parentStudyId)) { Bases.put(s.getOid(), new OdmStudyBase(ds, s)); } return Bases; } /** * Populate a HashMap<String, OdmStudyBase> of a single study/site. The key * is study/site oc_oid. * * @param studyId * @return */ public LinkedHashMap<String, OdmStudyBase> populateStudyBaseMap(int studyId) { LinkedHashMap<String, OdmStudyBase> Bases = new LinkedHashMap<String, OdmStudyBase>(); StudyBean study = (StudyBean) new StudyDAO(this.ds).findByPK(studyId); Bases.put(study.getOid(), new OdmStudyBase(ds, study)); return Bases; } public abstract void collectFileData(); /** * Create an ODMBean with default ODMBean properties. * * @return */ public void collectOdmRoot() { if (this.dataset == null) { logger.info("empty ODMBean has been returned because dataset is null!"); return; } Date creationDatetime = new Date(); SimpleDateFormat localTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); TimeZone timeZone = TimeZone.getDefault(); localTime.setTimeZone(timeZone); int offset = localTime.getTimeZone().getOffset(creationDatetime.getTime()); String sign = "+"; if (offset < 0) { offset = -offset; sign = "-"; } int hours = offset / 3600000; int minutes = (offset - hours * 3600000) / 60000; DecimalFormat twoDigits = new DecimalFormat("00"); if(dataset.getId()>0) { odmbean.setFileOID(this.dataset.getName() + "D" + new SimpleDateFormat("yyyyMMddHHmmssZ").format(creationDatetime)); odmbean.setDescription(this.dataset.getDescription().trim()); } else { odmbean.setFileOID( "Study-Meta"+ "D" + new SimpleDateFormat("yyyyMMddHHmmssZ").format(creationDatetime)); odmbean.setDescription("Study Metadata"); } odmbean.setCreationDateTime(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss" + sign + twoDigits.format(hours) + ":" + twoDigits.format(minutes)) .format(creationDatetime)); } public void setDataset(DatasetBean dataset) { this.dataset = dataset; } public DatasetBean getDataset() { return this.dataset; } public void setODMBean(ODMBean odmbean) { this.odmbean = odmbean; } public ODMBean getODMBean() { return this.odmbean; } public DataSource getDataSource() { return ds; } public void setDataSource(DataSource ds) { this.ds = ds; } public ODMBean getOdmbean() { return odmbean; } public void setOdmbean(ODMBean odmbean) { this.odmbean = odmbean; } public HashMap<String, OdmStudyBase> getStudyBaseMap() { return studyBaseMap; } public void setStudyBaseMap(LinkedHashMap<String, OdmStudyBase> studyBaseMap) { this.studyBaseMap = studyBaseMap; } public int getCategory() { return category; } public void setCategory(int category) { this.category = category; } }