package com.constellio.app.services.schemas.bulkImport.data.excel;
import static java.util.Arrays.asList;
import java.io.File;
import java.io.IOException;
import java.util.List;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.read.biff.BiffException;
import com.constellio.app.services.schemas.bulkImport.data.ImportDataIterator;
import com.constellio.app.services.schemas.bulkImport.data.ImportDataIteratorRuntimeException.ImportDataIteratorRuntimeException_InvalidDate;
import com.constellio.app.services.schemas.bulkImport.data.ImportDataProvider;
import com.constellio.app.services.schemas.bulkImport.data.ImportDataProviderRuntimeException;
import com.constellio.app.services.schemas.bulkImport.data.ImportDataProviderRuntimeException.ImportDataProviderRuntimeException_InvalidDate;
public class Excel2003ImportDataProvider implements ImportDataProvider {
private File excelFile;
private Workbook workbook;
public Excel2003ImportDataProvider(File excelFile) {
this.excelFile = excelFile;
}
@Override
public int size(String schemaType)
throws ImportDataProviderRuntimeException {
int count = 0;
ImportDataIterator iterator = newDataIterator(schemaType);
try {
while (iterator.hasNext()) {
iterator.next();
count++;
}
} catch (RuntimeException e) {
if (e instanceof ImportDataIteratorRuntimeException_InvalidDate) {
ImportDataIteratorRuntimeException_InvalidDate exception = (ImportDataIteratorRuntimeException_InvalidDate) e;
throw new ImportDataProviderRuntimeException_InvalidDate(exception.getDateFormat(), exception.getInvalidValue());
}
throw new ImportDataProviderRuntimeException(e);
}
return count;
}
@Override
public void initialize() {
this.workbook = loadWorkbook(excelFile);
}
@Override
public void close() {
workbook.close();
}
@Override
public List<String> getAvailableSchemaTypes() {
return asList(workbook.getSheetNames());
}
@Override
public ImportDataIterator newDataIterator(String schemaType) {
if(getAvailableSchemaTypes().contains(schemaType))
return new ExcelImportDataIterator(getExcelSheet(schemaType));
throw new RuntimeException("There are no sheet with this schema type");
}
public Workbook loadWorkbook(File workbookFile) {
WorkbookSettings settings = new WorkbookSettings();
settings.setEncoding("LATIN1");
try {
return Workbook.getWorkbook(workbookFile, settings);
} catch (BiffException | IOException e) {
throw new RuntimeException(e);
}
}
public static Excel2003ImportDataProvider fromFile(File excelFile) {
Excel2003ImportDataProvider instance = new Excel2003ImportDataProvider(excelFile);
instance.initialize();
return instance;
}
public ExcelSheet getExcelSheet(String schemaType) {
return new Excel2003Sheet(workbook.getSheet(schemaType));
}
}