Skip to content

Commit

Permalink
refs #28 Calendar型のConverterの追加。
Browse files Browse the repository at this point in the history
  • Loading branch information
mygreen committed Jul 5, 2015
1 parent c5e8e6a commit 3ac356b
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.net.URI;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
Expand All @@ -21,6 +22,7 @@
import com.gh.mygreen.xlsmapper.cellconvert.converter.BigIntegerCellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.converter.BooleanCellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.converter.ByteCellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.converter.CalendarCellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.converter.CellLinkCellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.converter.CharacterCellConverter;
import com.gh.mygreen.xlsmapper.cellconvert.converter.DateCellConverter;
Expand Down Expand Up @@ -115,6 +117,8 @@ public CellConverter create(final Class<CellConverter> clazz) {
registerConverter(Timestamp.class, new SqlTimestampCellConverter());
registerConverter(Time.class, new SqlTimeCellConverter());

registerConverter(Calendar.class, new CalendarCellConverter());

registerConverter(Enum.class, new EnumCellConverter());

registerConverter(List.class, new ListCellConverter());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ protected DateFormat createDateFormat(final XlsDateConverter anno) throws Annota
/**
* 型変換エラー時のメッセージ変数の作成
*/
private Map<String, Object> createTypeErrorMessageVars(final XlsDateConverter anno) {
Map<String, Object> createTypeErrorMessageVars(final XlsDateConverter anno) {

final Map<String, Object> vars = new LinkedHashMap<>();
vars.put("pattern", anno.pattern());
Expand Down Expand Up @@ -185,7 +185,7 @@ public boolean lenient() {
};
}

private XlsDateConverter getLoadingAnnotation(final FieldAdaptor adaptor) {
XlsDateConverter getLoadingAnnotation(final FieldAdaptor adaptor) {
XlsDateConverter anno = adaptor.getLoadingAnnotation(XlsDateConverter.class);
if(anno == null) {
anno = getDefaultDateConverterAnnotation();
Expand All @@ -194,15 +194,15 @@ private XlsDateConverter getLoadingAnnotation(final FieldAdaptor adaptor) {
return anno;
}

private XlsDateConverter getSavingAnnotation(final FieldAdaptor adaptor) {
XlsDateConverter getSavingAnnotation(final FieldAdaptor adaptor) {
XlsDateConverter anno = adaptor.getSavingAnnotation(XlsDateConverter.class);
if(anno == null) {
anno = getDefaultDateConverterAnnotation();
}

return anno;
}

@Override
public Cell toCell(final FieldAdaptor adaptor, final Object targetObj, final Sheet sheet, final int column, final int row,
final XlsMapperConfig config) throws XlsMapperException {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package com.gh.mygreen.xlsmapper.cellconvert.converter;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

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.converter.XlsConverter;
import com.gh.mygreen.xlsmapper.annotation.converter.XlsDateConverter;
import com.gh.mygreen.xlsmapper.cellconvert.AbstractCellConverter;
import com.gh.mygreen.xlsmapper.fieldprocessor.FieldAdaptor;


/**
* {@link Calendar}型の変換用クラス。
*
* @since 1.0
* @author T.TSUCHIE
*
*/
public class CalendarCellConverter extends AbstractCellConverter<Calendar> {

private DateCellConverter dateConverter;

public CalendarCellConverter() {
this.dateConverter = new DateCellConverter();
}

@Override
public Calendar toObject(final Cell cell, final FieldAdaptor adaptor, final XlsMapperConfig config)
throws XlsMapperException {

final Date date = dateConverter.toObject(cell, adaptor, config);
Calendar cal = null;
if(date != null) {
cal = Calendar.getInstance();
cal.setTime(date);
}

return cal;
}

@Override
public Cell toCell(final FieldAdaptor adaptor, final Object targetObj, final Sheet sheet, final int column, final int row,
final XlsMapperConfig config) throws XlsMapperException {

return toCell(adaptor, targetObj, sheet, column, row, config, null);
}

@Override
public Cell toCellWithMap(final FieldAdaptor adaptor, final String key, final Object targetObj, final Sheet sheet,
final int column, final int row, XlsMapperConfig config) throws XlsMapperException {

return toCell(adaptor, targetObj, sheet, column, row, config, key);
}

private Cell toCell(final FieldAdaptor adaptor, final Object targetObj, final Sheet sheet, final int column, final int row,
final XlsMapperConfig config, final String mapKey) throws XlsMapperException {

final XlsConverter converterAnno = adaptor.getLoadingAnnotation(XlsConverter.class);
final XlsDateConverter anno = dateConverter.getSavingAnnotation(adaptor);

final Cell cell = POIUtils.getCell(sheet, column, row);

// セルの書式設定
if(converterAnno != null) {
POIUtils.wrapCellText(cell, converterAnno.forceWrapText());
POIUtils.shrinkToFit(cell, converterAnno.forceShrinkToFit());
}

Calendar value;
if(mapKey == null) {
value = (Calendar) adaptor.getValue(targetObj);
} else {
value = (Calendar) adaptor.getValueOfMap(mapKey, targetObj);
}

// デフォルト値から値を設定する
if(value == null && Utils.hasDefaultValue(converterAnno)) {
final String defaultValue = converterAnno.defaultValue();
if(Utils.isNotEmpty(anno.pattern())) {
try {
Date date = dateConverter.parseDate(defaultValue, dateConverter.createDateFormat(anno));
Calendar cal = Calendar.getInstance();
cal.setTime(date);
value = cal;
} catch (ParseException e) {
throw newTypeBindException(e, cell, adaptor, defaultValue)
.addAllMessageVars(dateConverter.createTypeErrorMessageVars(anno));
}
} else {
value = (Calendar) Utils.convertToObject(defaultValue, adaptor.getTargetClass());
}

}

// セルの書式の設定
if(Utils.isNotEmpty(anno.pattern())) {
cell.getCellStyle().setDataFormat(POIUtils.getDataFormatIndex(sheet, anno.pattern()));
}

if(value != null) {
cell.setCellValue(value);
} else {
cell.setCellType(Cell.CELL_TYPE_BLANK);
}

return cell;
}


}

0 comments on commit 3ac356b

Please sign in to comment.