All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sfm.csv.impl.CsvMapperCellHandler Maven / Gradle / Ivy

package org.sfm.csv.impl;

import org.sfm.csv.CsvColumnKey;
import org.sfm.map.FieldMapperErrorHandler;
import org.sfm.reflect.Instantiator;
import org.sfm.utils.ErrorHelper;

public abstract class CsvMapperCellHandler {
    protected final Instantiator, T> instantiator;
    protected final CsvColumnKey[] columns;
    protected final int totalLength;
    protected final int delayedCellSettersLength;
    protected final ParsingContext parsingContext;

    protected final FieldMapperErrorHandler fieldErrorHandler;


    protected T currentInstance;

    public CsvMapperCellHandler(Instantiator, T> instantiator,
                                CsvColumnKey[] columns, int delayedCellSettersLength, int cellSettersLength,
                                ParsingContext parsingContext, FieldMapperErrorHandler fieldErrorHandler) {
        this.instantiator = instantiator;
        this.columns = columns;
        this.parsingContext = parsingContext;
        this.fieldErrorHandler = fieldErrorHandler;
        this.totalLength = delayedCellSettersLength + cellSettersLength;
        this.delayedCellSettersLength = delayedCellSettersLength;
    }

    public abstract void delayedCellValue(char[] chars, int offset, int length, int cellIndex);

    public abstract void cellValue(char[] chars, int offset, int length, int cellIndex);

    public abstract void applyDelayedSetters();

    public abstract DelayedCellSetter getDelayedCellSetter(int index);

    public abstract Object peekDelayedCellSetterValue(CsvColumnKey key);


    public final void createInstance() {
        try {
            currentInstance = instantiator.newInstance(this);
        } catch (Exception e) {
            ErrorHelper.rethrow(e);
        }
    }

    public final boolean isDelayedSetter(int cellIndex) {
        return cellIndex < delayedCellSettersLength;
    }


    protected final void fieldError(int cellIndex, Exception e) {
        fieldErrorHandler.errorMappingField(getColumn(cellIndex), this, currentInstance, e);
    }

    private CsvColumnKey getColumn(int cellIndex) {
        for (CsvColumnKey key : columns) {
            if (key.getIndex() == cellIndex) {
                return key;
            }
        }
        return null;
    }

    public final T getCurrentInstance() {
        return currentInstance;
    }

    public final void createInstanceIfNull() {
        if (currentInstance == null) {
            createInstance();
        }
    }

    public final void resetCurrentInstance() {
        currentInstance = null;
    }

    public final boolean hasInstance() {
        return currentInstance != null;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy