package model.manager.excel.reports.in; import java.util.List; import model.manager.excel.conversion.exceptions.PatientException; import model.manager.excel.interfaces.BaseImportColumn; import model.manager.excel.interfaces.ImportColumn; import model.manager.excel.interfaces.ImportConverter; import model.manager.excel.interfaces.ImportValidator; import model.manager.excel.interfaces.SessionBasedImportConverter; import model.manager.excel.interfaces.SessionBasedImportValidator; import org.hibernate.Session; public class SingleImportColumn<T> extends BaseImportColumn<T> implements ImportColumn<T> { private final String columnHeader; private final boolean allowBlank; private final ImportConverter<T> converter; private final ImportValidator<T> validator; private int columnNumber = -1; private final T defaultValue; String rawValue; public SingleImportColumn(String columnHeader, String beanProperty) { super(beanProperty); this.columnHeader = columnHeader; this.allowBlank = true; this.converter = null; this.validator = null; this.defaultValue= null; } public SingleImportColumn(String columnHeader, boolean allowBlank, ImportConverter<T> converter, ImportValidator<T> validator,String beanProperty) { super(beanProperty); this.columnHeader = columnHeader; this.allowBlank = allowBlank; this.converter = converter; this.validator = validator; this.defaultValue= null; } public SingleImportColumn(String columnHeader, boolean allowBlank, ImportConverter<T> converter, ImportValidator<T> validator,String beanProperty, T defaultValue) { super(beanProperty); this.columnHeader = columnHeader; this.allowBlank = allowBlank; this.converter = converter; this.validator = validator; this.defaultValue = defaultValue; } @Override public String getHeader() { return columnHeader; } @Override public boolean isAllowBlank() { return allowBlank; } @Override public String getConverterDescription(){ if (converter == null){ return ""; } return converter.getDescription(); } public ImportConverter<T> getConverter() { return converter; } public ImportValidator<T> getValidator() { return validator; } /* (non-Javadoc) * @see model.manager.excel.interfaces.BaseImportColumn#findColumn(java.util.List) */ @Override public void findColumn(List<String> columnHeaders){ for (int i = 0; i < columnHeaders.size(); i++) { if (columnHeaders.get(i).toLowerCase().contains(columnHeader.toLowerCase())){ columnNumber = i; return; } } } @Override public boolean checkColumn() { return getColumnNumber() >= 0 || isAllowBlank(); } /* (non-Javadoc) * @see model.manager.excel.interfaces.BaseImportColumn#process(java.util.List, org.celllife.idart.database.hibernate.Patient, org.hibernate.Session) */ @Override @SuppressWarnings("unchecked") public boolean process(List<String> rawValues, Session session) throws PatientException { if (columnNumber < 0){ if (!allowBlank){ throw new PatientException(columnHeader + " is not allowed to be empty"); } else { rawValue = ""; } } else { rawValue = rawValues.get(columnNumber).trim(); } convertedValue = null; if (rawValue.isEmpty()) { if (!allowBlank){ throw new PatientException(columnHeader + " is not allowed to be empty"); } else if (defaultValue != null){ convertedValue = defaultValue; } else { return false; } } // if converted value hasn't already been set from the defatul value if (convertedValue == null) { if (converter != null){ if (converter instanceof SessionBasedImportConverter){ ((SessionBasedImportConverter<?>)converter).initialise(session); } convertedValue = converter.convert(rawValue); }else { // assume that type is String convertedValue = (T) rawValue; } } if (convertedValue == null) { if (!allowBlank && defaultValue == null){ throw new PatientException("Error converting " + rawValue + " for " + columnHeader + " column"); } else if (defaultValue != null){ convertedValue = defaultValue; } else { return false; } } if (validator != null){ if (validator instanceof SessionBasedImportValidator){ ((SessionBasedImportValidator<?>)validator).initialise(session); } String errorMessage = validator.validate(convertedValue); if (errorMessage != null){ throw new PatientException(errorMessage); } } return true; } @Override public String getRawValue(){ return rawValue; } @Override public int getColumnNumber() { return columnNumber; } @Override public String toString() { return columnHeader + ": " + rawValue; } }