package com.gh.mygreen.xlsmapper.cellconvert.converter;
import java.lang.reflect.Array;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import com.gh.mygreen.xlsmapper.POIUtils;
import com.gh.mygreen.xlsmapper.Utils;
import com.gh.mygreen.xlsmapper.XlsMapperConfig;
import com.gh.mygreen.xlsmapper.XlsMapperException;
import com.gh.mygreen.xlsmapper.annotation.XlsArrayConverter;
import com.gh.mygreen.xlsmapper.annotation.XlsConverter;
import com.gh.mygreen.xlsmapper.annotation.XlsFormula;
import com.gh.mygreen.xlsmapper.cellconvert.AbstractCellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.ItemConverter;
import com.gh.mygreen.xlsmapper.fieldprocessor.FieldAdaptor;
/**
* 配列型を変換するためのConverter。
*
* @version 1.5
* @author T.TSUCHIE
*
*/
public class ArrayCellConverter extends AbstractCellConverter<Object[]> {
@Override
public Object[] toObject(final Cell cell, final FieldAdaptor adaptor, final XlsMapperConfig config)
throws XlsMapperException {
final ListCellConverter converter = new ListCellConverter();
final XlsArrayConverter anno = converter.getLoadingAnnotation(adaptor);
Class<?> itemClass = anno.itemClass();
if(itemClass == Object.class) {
itemClass = adaptor.getLoadingGenericClassType();
}
final List<?> list = converter.toObject(cell, adaptor, config);
return list.toArray(((Object[])Array.newInstance(itemClass, list.size())));
}
@Override
public Cell toCell(final FieldAdaptor adaptor, final Object[] targetValue, final Object targetBean,
final Sheet sheet, final int column, final int row,
final XlsMapperConfig config) throws XlsMapperException {
final ListCellConverter converter = new ListCellConverter();
final XlsConverter converterAnno = adaptor.getSavingAnnotation(XlsConverter.class);
final XlsArrayConverter anno = converter.getSavingAnnotation(adaptor);
final XlsFormula formulaAnno = adaptor.getSavingAnnotation(XlsFormula.class);
final boolean primaryFormula = formulaAnno == null ? false : formulaAnno.primary();
Class<?> itemClass = anno.itemClass();
if(itemClass == Object.class) {
itemClass = adaptor.getSavingGenericClassType();
}
final Cell cell = POIUtils.getCell(sheet, column, row);
// セルの書式設定
if(converterAnno != null) {
POIUtils.wrapCellText(cell, converterAnno.wrapText());
POIUtils.shrinkToFit(cell, converterAnno.shrinkToFit());
}
Object[] value = targetValue;
// デフォルト値から値を設定する
if(Utils.isEmpty(value) && Utils.hasDefaultValue(converterAnno)) {
final List<?> list = converter.convertList(Utils.getDefaultValue(converterAnno), itemClass, converterAnno, anno, config);
value = list.toArray(((Object[])Array.newInstance(itemClass, list.size())));
}
if(Utils.isNotEmpty(value) && !primaryFormula) {
final boolean trim = (converterAnno == null ? false : converterAnno.trim());
final ItemConverter itemConverter = converter.getItemConverter(anno.itemConverterClass(), config);
final String cellValue = Utils.join(value, anno.separator(), anno.ignoreEmptyItem(), trim, itemConverter);
cell.setCellValue(cellValue);
} else if(formulaAnno != null) {
Utils.setupCellFormula(adaptor, formulaAnno, config, cell, targetBean);
} else {
cell.setCellType(Cell.CELL_TYPE_BLANK);
}
return cell;
}
}