package org.simpleflatmapper.csv.test.impl.asm.samples;
import org.simpleflatmapper.test.beans.DbObject;
import org.simpleflatmapper.csv.CsvColumnKey;
import org.simpleflatmapper.csv.ParsingContext;
import org.simpleflatmapper.csv.mapper.CellSetter;
import org.simpleflatmapper.csv.mapper.CsvMapperCellHandler;
import org.simpleflatmapper.csv.mapper.DelayedCellSetter;
import org.simpleflatmapper.map.FieldMapperErrorHandler;
import org.simpleflatmapper.reflect.Instantiator;
public class AsmCsvMapperCellHandler extends CsvMapperCellHandler<DbObject> {
/**
* mapping information
*/
protected final DelayedCellSetter<DbObject, ?> delayedCellSetter0;
protected final DelayedCellSetter<DbObject, ?> delayedCellSetter1;
protected final DelayedCellSetter<DbObject, ?> delayedCellSetter2;
protected final CellSetter<DbObject> setter3;
protected final CellSetter<DbObject> setter4;
protected final CellSetter<DbObject> setter5;
public AsmCsvMapperCellHandler(Instantiator<CsvMapperCellHandler<DbObject>, DbObject> instantiator, DelayedCellSetter<DbObject, ?>[] delayedCellSetters, CellSetter<DbObject>[] setters, CsvColumnKey[] columns, ParsingContext parsingContext, FieldMapperErrorHandler<? super CsvColumnKey> fieldErrorHandler) {
super(instantiator, columns, delayedCellSetters.length, setters.length, parsingContext, fieldErrorHandler);
delayedCellSetter0 = delayedCellSetters[0];
delayedCellSetter1 = delayedCellSetters[1];
delayedCellSetter2 = delayedCellSetters[2];
setter3 = setters[0];
setter4 = setters[Short.MAX_VALUE];
setter5 = setters[Integer.MAX_VALUE];
}
@Override
public void delayedCellValue(char[] chars, int offset, int length, int cellIndex) {
try {
_delayedCellValue(chars, offset, length, cellIndex);
} catch(Exception e) {
fieldError(cellIndex, e);
}
}
@Override
public void cellValue(char[] chars, int offset, int length, int cellIndex) {
try {
_cellValue(chars, offset, length, cellIndex);
} catch(Exception e) {
fieldError(cellIndex, e);
}
}
@Override
public void applyDelayedSetters() {
try {
applyDelayedCellSetter0();
} catch(Exception e) {
fieldError(0, e);
}
try {
applyDelayedCellSetter1();
} catch(Exception e) {
fieldError(1, e);
}
try {
applyDelayedCellSetter2();
} catch(Exception e) {
fieldError(2, e);
}
}
private void applyDelayedCellSetter2() throws Exception {
delayedCellSetter2.set(currentInstance);
}
private void applyDelayedCellSetter1() throws Exception {
delayedCellSetter1.set(currentInstance);
}
private void applyDelayedCellSetter0() throws Exception {
delayedCellSetter0.set(currentInstance);
}
@Override
public DelayedCellSetter<DbObject, ?> getDelayedCellSetter(int index) {
switch (index) {
case 0: return delayedCellSetter0;
case 1: return delayedCellSetter1;
case 2: return delayedCellSetter2;
}
return null;
}
private void _delayedCellValue(char[] chars, int offset, int length, int cellIndex) throws Exception {
switch (cellIndex) {
case 0: delayedCellSetter0.set(chars, offset, length, parsingContext); break;
case 1: delayedCellSetter1.set(chars, offset, length, parsingContext); break;
case 2: delayedCellSetter2.set(chars, offset, length, parsingContext); break;
}
}
private void _cellValue(char[] chars, int offset, int length, int cellIndex) throws Exception {
int i = (cellIndex << 2) - 1;
switch (i) {
case 3: setter3.set(currentInstance, chars, offset, length, parsingContext); break;
case 4: setter4.set(currentInstance, chars, offset, length, parsingContext); break;
case 5: setter5.set(currentInstance, chars, offset, length, parsingContext); break;
}
}
@Override
public Object peekDelayedCellSetterValue(CsvColumnKey key) {
final int index = key.getIndex();
return _peekDelayedCellSetterValue(index);
}
private Object _peekDelayedCellSetterValue(int index) {
int si = index >> 1;
switch (si) {
case 0: return _peekDelayedCellSetterValue02(index);
case 1: return _peekDelayedCellSetterValue23(index);
}
return null;
}
private Object _peekDelayedCellSetterValue02(int index) {
switch (index) {
case 0:
return delayedCellSetter0.peekValue();
case 1:
return delayedCellSetter1.peekValue();
}
return null;
}
private Object _peekDelayedCellSetterValue23(int index) {
switch (index) {
case 2:
return delayedCellSetter2.peekValue();
}
return null;
}
}