package model.manager.excel.reports.in; import java.io.File; import java.util.ArrayList; import java.util.List; import model.manager.excel.download.XLReadManager; import model.manager.excel.download.XLWriteManager; import model.manager.excel.interfaces.ReadExcelReportInterface; import org.eclipse.core.runtime.IProgressMonitor; import org.hibernate.Session; import org.hibernate.Transaction; public abstract class BaseImportSheet implements ReadExcelReportInterface { private int errorCol = -1; private XLReadManager xlr = null; protected XLWriteManager xlw = null; protected int dataStartRow = 0; private final String sheetName; private Session session; private int errorCount; public BaseImportSheet(String sheetName) { super(); this.sheetName = sheetName; } @Override public void init() { } public String getSheetName() { return sheetName; } @Override public void setSession(Session hSession) { this.session = hSession; } protected Session getSession() { return session; } /** * Method closeSheet. * * @see model.manager.excel.interfaces.ReadExcelReportInterface#closeSheet() */ @Override public void closeSheet() { xlr = null; } /** * Method openSheet. * * @param stream * byte[] * @see model.manager.excel.interfaces.ReadExcelReportInterface#openSheet(File) */ @Override public boolean openSheet(File file) { try { xlr = new XLReadManager(file, sheetName); return xlr.getReadableSheet() != null; } catch (Exception e) { e.printStackTrace(); } return false; } /** * checks if all fields are blank, if so, returns true * * @param row * int * @return boolean */ protected List<String> getRow(int row) { List<String> rowList = new ArrayList<String>(); boolean allEmpty = true; for (int i = 0; i < errorCol; i++) { String txt = xlr.readCell(i, row, true); rowList.add(txt); if (!txt.isEmpty()) { allEmpty = false; } } if (allEmpty){ rowList.clear(); } return rowList; } /** * Method persistData. * * @param session * Session * @see model.manager.excel.interfaces.ReadExcelReportInterface#persistData(Session) */ @Override public void persistData(IProgressMonitor monitor) { Transaction tx = null; try { /** * open error file for writing */ xlw = new XLWriteManager(getSheetName()); monitor.setTaskName("Writing columns to error file"); copyColumnHeadersToErrorFile(); int rows = xlr.getReadableSheet().getRows(); for (int i = dataStartRow; i < rows; i++) { monitor.setTaskName("Processing row: " + i); if (monitor.isCanceled()){ return; } /** * Check if its end of file */ List<String> row = getRow(i); if (row.isEmpty()) return; tx = session.beginTransaction(); if (!readRow(i, row)){ errorCount++; tx.rollback(); } else { tx.commit(); } monitor.worked(100); } // close write file session.flush(); } catch (Exception e) { errorCount++; xlw.writeCell(0, 0, e.getMessage()); if (tx != null) { tx.rollback(); } } finally { xlw.closeFile(); } } @Override public int getErrorCount() { return errorCount; } @Override public File getErrorFile(){ return xlw.getErrorFile(); } /** * Method findColumns. * * @return boolean * @see model.manager.excel.interfaces.ReadExcelReportInterface#findColumns() */ @Override public void findColumns() { List<String> rowList = new ArrayList<String>(); int maxColumns = xlr.getReadableSheet().getColumns(); boolean allEmpty = true; do { rowList.clear(); for (int i = 0; i < maxColumns; i++) { String txt = xlr.readCell(i, dataStartRow, false).trim(); rowList.add(txt); if (!txt.isEmpty()) { allEmpty = false; } } dataStartRow++; } while (allEmpty); findColumns(rowList); } protected abstract void findColumns(List<String> rowList); protected abstract boolean readRow(int rowNumber, List<String> row); /** * Method to write the column headings for the error file The error file * will have the same headings as the input file plus an extra column fo the * reason of error * */ protected void copyColumnHeadersToErrorFile() { int maxColumns = xlr.getReadableSheet().getColumns(); // marker to mark where last REAL column is int marker = maxColumns; // write columns as is from input file for (int i = 0; i < maxColumns; i++) { String string = xlr.readCell(i, dataStartRow - 1, false); if (!string.isEmpty()) { xlw.writeHeadingCell(i, string); } else { marker = i; break; } } // add a column to indicate reason for error only if it hasn't been // added already if (errorCol == -1) { xlw.writeHeadingCell(marker, "Reason for Error"); errorCol = marker; } xlw.incrRowCount(); } protected void copyRowToErrorFile(int row, String errorMessage) { int maxColumns = xlr.getReadableSheet().getColumns(); int writeRow = xlw.getRowCount(); for (int i = 0; i < maxColumns; i++) { String entry = xlr.readCell(i, row, false); xlw.writeCell(i, writeRow, entry); } xlw.writeCell(errorCol, writeRow, errorMessage); xlw.incrRowCount(); } public void writeTemplateSheet(String filePath){ xlw = new XLWriteManager("Sheet1", filePath); int rowNum = 0; List<String> row = getTemplateHeaders(); for (int i = 0; i < row.size(); i++) { xlw.writeHeadingCell(i, rowNum, row.get(i)); } rowNum++; row = getTemplateCompulsoryValues(); for (int i = 0; i < row.size(); i++) { xlw.writeCell(i, rowNum, row.get(i)); } rowNum++; row = getTemplateColumnTypes(); for (int i = 0; i < row.size(); i++) { xlw.writeCell(i, rowNum, row.get(i)); } xlw.closeFile(); } protected List<String> getTemplateHeaders() { return new ArrayList<String>(); } protected List<String> getTemplateCompulsoryValues() { return new ArrayList<String>(); } protected List<String> getTemplateColumnTypes() { return new ArrayList<String>(); } }