package fr.openwide.core.imports.table.opencsv.mapping.column.builder; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import com.google.common.base.Function; import com.google.common.base.Predicate; import fr.openwide.core.commons.util.functional.SerializableFunction; import fr.openwide.core.imports.table.common.event.ITableImportEventHandler; import fr.openwide.core.imports.table.common.event.exception.TableImportHeaderLabelMappingException; import fr.openwide.core.imports.table.common.location.ITableImportNavigator; import fr.openwide.core.imports.table.common.mapping.column.builder.ITableImportColumnMapper; import fr.openwide.core.imports.table.common.mapping.column.builder.MappingConstraint; import fr.openwide.core.imports.table.opencsv.model.CsvCell; import fr.openwide.core.imports.table.opencsv.model.CsvCellReference; import fr.openwide.core.imports.table.opencsv.model.CsvRow; import fr.openwide.core.imports.table.opencsv.model.CsvTable; /*package*/ class HeaderLabelOpenCsvImportColumnMapper implements ITableImportColumnMapper<CsvTable, CsvRow, CsvCell, CsvCellReference> { private final String expectedHeaderLabel; private final Predicate<? super String> predicate; private final int indexAmongMatchedColumns; private final MappingConstraint mappingConstraint; /** * @param indexAmongMatchedColumns The 0-based index of this column among the columns matching the given <code>predicate</code>. */ public HeaderLabelOpenCsvImportColumnMapper(String expectedHeaderLabel, Predicate<? super String> predicate, int indexAmongMatchedColumns, MappingConstraint mappingConstraint) { super(); Validate.notNull(predicate, "predicate must not be null"); this.expectedHeaderLabel = expectedHeaderLabel; this.predicate = predicate; this.indexAmongMatchedColumns = indexAmongMatchedColumns; this.mappingConstraint = mappingConstraint; } @Override public Function<? super CsvRow, CsvCellReference> tryMap(CsvTable sheet, ITableImportNavigator<CsvTable, CsvRow, CsvCell, CsvCellReference> navigator, ITableImportEventHandler eventHandler) throws TableImportHeaderLabelMappingException { int matchedColumnsCount = 0; CsvRow headersRow = sheet.getRow(0); if (headersRow != null) { for (CsvCell cell : headersRow) { String cellValue = StringUtils.trimToNull(cell.getContent()); if (predicate.apply(cellValue)) { if (matchedColumnsCount == indexAmongMatchedColumns) { final int index = cell.getIndex(); return new SerializableFunction<CsvRow, CsvCellReference>() { private static final long serialVersionUID = 1L; @Override public CsvCellReference apply(CsvRow row) { return row == null ? null : new CsvCellReference(row.getIndex(), index); } }; } else { ++matchedColumnsCount; } } } } // Could not map the header to a column index if (MappingConstraint.REQUIRED.equals(mappingConstraint)) { eventHandler.headerLabelMappingError(expectedHeaderLabel, indexAmongMatchedColumns, navigator.getLocation(sheet, headersRow, null)); } return null; } }