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;
    }
    
}