package edu.harvard.i2b2.crc.loader.ejb; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import javax.naming.InitialContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import edu.harvard.i2b2.common.exception.I2B2Exception; import edu.harvard.i2b2.crc.loader.dao.IPidDAO; import edu.harvard.i2b2.crc.loader.dao.IUploaderDAOFactory; import edu.harvard.i2b2.crc.loader.dao.UploadStatusDAO; import edu.harvard.i2b2.crc.loader.dao.UploadStatusDAOI; import edu.harvard.i2b2.crc.loader.datavo.loader.UploadSetStatus; /** * This specific loader class for Visit dimension. This class performs three * operations, namely. 1.Build PatientData xml file based, if input file is csv * 2.Load PatientData xml information into staging area in database. 3.Run * procedure which will merge staging area into Visit dimension. * * @author rk903 * */ public class PidLoader extends AbstractDimensionLoader { private static Log log = LogFactory.getLog(PidLoader.class); private IUploaderDAOFactory uploaderDaoFactory = null; public PidLoader(IUploaderDAOFactory uploaderDaoFactory, String inputLoadFile, String inputLoadFileFormat, String encounterSource, String sourceSystemCd, int uploadId) { this.uploaderDaoFactory = uploaderDaoFactory; setUploaderDaoFactory(uploaderDaoFactory); setInputLoadFile(inputLoadFile); setInputLoadFileFormat(inputLoadFileFormat); setEncounterSource(encounterSource); setUploadId(uploadId); setSourceSystemCd(sourceSystemCd); } public void setStartStatus() { // update the status table UploadStatusDAOI uploadStatusDao = uploaderDaoFactory .getUploadStatusDAO(); UploadSetStatus setStatus = new UploadSetStatus(); setStatus.setUploadId(getUploadId()); setStatus.setLoadStatus("STARTED"); setStatus.setSetTypeId(UploadStatusDAO.PID_SET); setStatus.setInputFileName(this.getInputLoadFile()); setStatus.setSourceCd(getSourceSystemCd()); setStatus.setLoadDate(new Date(System.currentTimeMillis())); uploadStatusDao.insertUploadSetStatus(setStatus); } @Override public void createTempTable() throws I2B2Exception { setOutputXmlFileName(getInputLoadFile()); String tempPatientMappingTableName = "TEMP_PID_MAP_" + getUploadId(); setStagingTableName(tempPatientMappingTableName); IPidDAO pidDAO = uploaderDaoFactory.getPidDAO(); pidDAO.createTempTable(getStagingTableName()); log.info("Created PID staging table" + getStagingTableName()); } public int loadTempTable() throws I2B2Exception { PidXmlDbLoader pidDbLoader = new PidXmlDbLoader( this.uploaderDaoFactory, getOutputXmlFileName(), getStagingTableName(), getUploadId()); pidDbLoader.doUpload(); log.info("Uploaded " + getOutputXmlFileName() + "to staging table" + getStagingTableName()); return pidDbLoader.getRowCount(); } public int mergeTempTable() throws I2B2Exception { IPidDAO pidDAO = uploaderDaoFactory.getPidDAO(); pidDAO .createPidFromTempTable(this.getStagingTableName(), getUploadId()); log.info("Completed PID insert operation for staging table" + getStagingTableName()); UploadSetStatus setStatus = new UploadSetStatus(); setStatus.setUploadId(getUploadId()); setStatus.setLoadStatus("STARTED"); setStatus.setSetTypeId(UploadStatusDAO.PID_SET); setStatus.setInputFileName(this.getInputLoadFile()); setStatus.setSourceCd(getSourceSystemCd()); setStatus.setLoadDate(new Date(System.currentTimeMillis())); UploadStatusDAOI uploadStatusDao = uploaderDaoFactory .getUploadStatusDAO(); setStatus = uploadStatusDao.getUploadSetStatus(getUploadId(), UploadStatusDAO.PID_SET); setStatus.setLoadStatus("COMPLETED"); setStatus.setLoadedRecord(pidDAO .getRecordCountByUploadId(getUploadId())); setStatus.setEndDate(new Date(System.currentTimeMillis())); setStatus.setNoOfRecord(10000); uploadStatusDao.updateUploadSetStatus(setStatus); return pidDAO.getRecordCountByUploadId(getUploadId()); } public void load() throws I2B2Exception { UploadStatusDAOI uploadStatusDao = null; InitialContext context = null; try { // update the status table uploadStatusDao = uploaderDaoFactory.getUploadStatusDAO(); UploadSetStatus setStatus = new UploadSetStatus(); setStatus.setUploadId(getUploadId()); setStatus.setLoadStatus("STARTED"); setStatus.setSetTypeId(UploadStatusDAO.PID_SET); setStatus.setInputFileName(this.getInputLoadFile()); setStatus.setSourceCd(getSourceSystemCd()); setStatus.setLoadDate(new Date(System.currentTimeMillis())); uploadStatusDao.insertUploadSetStatus(setStatus); // set pdo xml file setOutputXmlFileName(getInputLoadFile()); String tempPatientMappingTableName = "TEMP_PID_MAP_" + getUploadId(); setStagingTableName(tempPatientMappingTableName); IPidDAO pidDAO = uploaderDaoFactory.getPidDAO(); pidDAO.createTempTable(getStagingTableName()); log.info("Created PID staging table" + getStagingTableName()); PidXmlDbLoader pidDbLoader = new PidXmlDbLoader( this.uploaderDaoFactory, getOutputXmlFileName(), getStagingTableName(), getUploadId()); pidDbLoader.doUpload(); log.info("Uploaded " + getOutputXmlFileName() + "to staging table" + getStagingTableName()); pidDAO.createPidFromTempTable(tempPatientMappingTableName, getUploadId()); log.info("Completed PID insert operation for staging table" + getStagingTableName()); setStatus = uploadStatusDao.getUploadSetStatus(getUploadId(), UploadStatusDAO.PID_SET); setStatus.setLoadStatus("COMPLETED"); setStatus.setLoadedRecord(pidDAO .getRecordCountByUploadId(getUploadId())); setStatus.setEndDate(new Date(System.currentTimeMillis())); setStatus.setNoOfRecord(pidDbLoader.getRowCount()); uploadStatusDao.updateUploadSetStatus(setStatus); } catch (I2B2Exception i2b2Ex) { // try to write error to set status table, if that fails then simply // pass the exception to top level UploadSetStatus setStatus = uploadStatusDao.getUploadSetStatus( getUploadId(), UploadStatusDAO.PID_SET); setStatus.setLoadStatus("ERROR"); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); i2b2Ex.printStackTrace(pw); setStatus.setMessage(sw.toString().substring(0, 500)); uploadStatusDao.updateUploadSetStatus(setStatus); throw i2b2Ex; } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }