package model.manager.exports.iedea; import java.io.File; import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import model.manager.PatientManager; import model.manager.excel.conversion.exceptions.ReportException; import model.nonPersistent.EntitySet; import org.apache.log4j.Logger; import org.celllife.idart.database.hibernate.Patient; import org.celllife.idart.database.hibernate.util.HibernateUtil; import org.eclipse.core.runtime.IProgressMonitor; import org.hibernate.Session; import org.iedea.ARKEKapaExport; import org.iedea.util.IedeaJaxbUtil; public class IedeaExporter { static Logger log = Logger.getLogger(IedeaExporter.class); static final int PAGE_SIZE = 25; protected Session session; private IProgressMonitor monitor; public IedeaExporter() { super(); } public void generate(String exportPath) throws ReportException { File file = new File(exportPath); if (!file.isDirectory()) { throw new ReportException("Please select a directory"); } ARKEKapaExport arkExport = new ARKEKapaExport(); IedeaExport export = new IedeaExport(arkExport); session = HibernateUtil.getNewSession(); EntitySet entitySet = getPatientSet(); if (monitor != null) { monitor.beginTask("Generating report", entitySet.getSize()); } int page = 0; int total = entitySet.size(); int pages = total / PAGE_SIZE; try { while (!isCancelled()) { // Set up list of patients if one wasn't passed into this method EntitySet pagedEntitySet = entitySet.getPage(page * PAGE_SIZE, PAGE_SIZE); if (pagedEntitySet.size() == 0) { break; } log.debug("Starting data export page " + page + " of " + pages); updateMonitorMessage("Processed " + page * PAGE_SIZE + " patients of " + total); try { exportPage(pagedEntitySet, export); } catch (Exception e) { throw new ReportException("Error running data export.", e); } finally { log.debug("Completed data export page " + page + " of " + pages); updateMonitorStatus(PAGE_SIZE); page++; pagedEntitySet = null; log.debug("Clearing hibernate session"); session.clear(); // clear out the excess objects System.gc(); System.gc(); } } IedeaJaxbUtil.instance().write( arkExport, new FileOutputStream(new File(file.getAbsolutePath(), "idart_tier-net_export_" + new SimpleDateFormat("yyyy-MM-dd") .format(new Date())+ ".xml"))); } catch (Exception e) { throw new ReportException(e); } finally { entitySet = null; session.close(); } } private void exportPage(EntitySet pagedEntitySet, IedeaExport export) { for (Integer patientId : pagedEntitySet.getEntityIds()) { Patient patient = PatientManager.getPatient(session, patientId); try { export.writeDataExport(session, patient); } catch (Exception e) { e.printStackTrace(); } } } /** * Generate the patientSet according to this report's characteristics * * @return patientSet to be used with report template */ private EntitySet getPatientSet() { @SuppressWarnings("unchecked") List<Integer> ids = session.createQuery("select id from Patient").list(); EntitySet patientSet = new EntitySet(); patientSet.setEntityIds(ids); return patientSet; } private void updateMonitorStatus(int work) { if (monitor != null) { monitor.worked(work); } } private void updateMonitorMessage(String message) { if (monitor != null) { monitor.subTask(message); } } private boolean isCancelled() { if (monitor != null) return monitor.isCanceled(); return false; } public void setMonitor(IProgressMonitor monitor) { this.monitor = monitor; } }