ListFormatter.java
package com.gh.mygreen.xlsmapper.textformatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.gh.mygreen.xlsmapper.cellconverter.ConversionException;
import com.gh.mygreen.xlsmapper.cellconverter.DefaultElementConverter;
import com.gh.mygreen.xlsmapper.cellconverter.ElementConverter;
import com.gh.mygreen.xlsmapper.util.Utils;
/**
* リストの形式に変換するフォーマッタ。
*
* @version 2.0
* @author T.TSUCHIE
*
*/
@SuppressWarnings("rawtypes")
public class ListFormatter implements TextFormatter<List> {
/**
* 要素のクラスタイプ
*/
private final Class<?> elementType;
/**
* 要素の区切り
*/
private String separator = ",";
/**
* フォーマットする際に空の要素は無視するかどうか
*/
private boolean ignoreEmptyElement = false;
/**
* トリムして処理をするかどうか
*/
private boolean trimmed = false;
/**
* 要素の変換クラス
*/
private ElementConverter elementConverter = new DefaultElementConverter();
public ListFormatter(final Class<?> elementType) {
this.elementType = elementType;
}
@SuppressWarnings("unchecked")
@Override
public List parse(final String text) throws TextParseException {
if(Utils.isEmpty(text)) {
return Collections.emptyList();
}
final String[] split = text.split(separator);
if(split.length == 0) {
return Collections.emptyList();
}
final List list = new ArrayList<>();
for(String element : split) {
String strVal = Utils.trim(element, trimmed);
if(ignoreEmptyElement && Utils.isEmpty(strVal)) {
continue;
}
try {
list.add(elementConverter.convertToObject(strVal, elementType));
} catch(ConversionException e) {
final Map<String, Object> vars = new HashMap<>();
vars.put("separator", separator);
vars.put("ignoreEmptyElement", ignoreEmptyElement);
vars.put("trimmed", trimmed);
vars.put("elementClass", elementType.getName());
throw new TextParseException(text, List.class, e, vars);
}
}
return list;
}
@Override
public String format(final List value) {
if(value == null) {
return "";
}
return Utils.join(value, separator, ignoreEmptyElement, trimmed, elementConverter);
}
/**
* 要素の区切り文字を設定します。
* @param separator 区切り文字
*/
public void setSeparator(String separator) {
this.separator = separator;
}
/**
* フォーマットする際に空の要素は無視するかどうか設定します。
* @param ignoreEmptyElement 空の要素は無視するかどうか
*/
public void setIgnoreEmptyElement(boolean ignoreEmptyElement) {
this.ignoreEmptyElement = ignoreEmptyElement;
}
/**
* トリムして処理をするかどうか設定します。
* @param trimmed トリムして処理をするかどうか
*/
public void setTrimmed(boolean trimmed) {
this.trimmed = trimmed;
}
/**
* 要素の変換処理方法を設定します。
* @param elementConverter 要素の変換処理方法
*/
public void setElementConverter(ElementConverter elementConverter) {
this.elementConverter = elementConverter;
}
}