in src/main/java/com/univocity/parsers/common/processor/core/BeanConversionProcessor.java [397:481]
private void mapFieldIndexes(Context context, Object[] row, String[] headers, int[] indexes, boolean columnsReordered) {
if (headers == null) {
headers = ArgumentUtils.EMPTY_STRING_ARRAY;
}
boolean boundToIndex = false;
int last = headers.length > row.length ? headers.length : row.length;
for (FieldMapping mapping : parsedFields) {
int index = mapping.getIndex();
if (last <= index) {
last = index;
boundToIndex = true;
}
}
if (boundToIndex) {
last++;
}
FieldMapping[] fieldOrder = new FieldMapping[last];
TreeSet<String> fieldsNotFound = new TreeSet<String>();
for (FieldMapping mapping : parsedFields) {
if (mapping.isMappedToField()) {
int[] positions = ArgumentUtils.indexesOf(headers, mapping.getFieldName());
if (positions.length == 0) {
fieldsNotFound.add(mapping.getFieldName());
continue;
}
for (int i = 0; i < positions.length; i++) {
fieldOrder[positions[i]] = mapping;
}
} else if (mapping.getIndex() < fieldOrder.length) {
fieldOrder[mapping.getIndex()] = mapping;
}
}
if (context != null && !fieldsNotFound.isEmpty()) { //Trigger this validation only when reading, not writing.
if (headers.length == 0) {
throw new DataProcessingException("Could not find fields " + fieldsNotFound.toString() + " in input. Please enable header extraction in the parser settings in order to match field names.");
}
if (strictHeaderValidationEnabled) {
DataProcessingException exception = new DataProcessingException("Could not find fields " + fieldsNotFound.toString() + "' in input. Names found: {headers}");
exception.setValue("headers", Arrays.toString(headers));
throw exception;
}
}
if (indexes != null) {
// sets fields not read from CSV to null.
for (int i = 0; i < fieldOrder.length; i++) {
boolean isIndexUsed = false;
for (int j = 0; j < indexes.length; j++) {
if (indexes[j] == i) {
isIndexUsed = true;
break;
}
}
if (!isIndexUsed) {
fieldOrder[i] = null;
}
}
// reorders the fields so they are positioned in the same order as in the incoming row[]
if (columnsReordered) {
FieldMapping[] newFieldOrder = new FieldMapping[indexes.length];
for (int i = 0; i < indexes.length; i++) {
for (int j = 0; j < fieldOrder.length; j++) {
int index = indexes[i];
if (index != -1) {
FieldMapping field = fieldOrder[index];
newFieldOrder[i] = field;
}
}
}
fieldOrder = newFieldOrder;
}
}
readOrder = fieldOrder;
initializeValuesForMissing();
}