ListFormatter.java

  1. package com.gh.mygreen.xlsmapper.textformatter;

  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;

  7. import com.gh.mygreen.xlsmapper.cellconverter.ConversionException;
  8. import com.gh.mygreen.xlsmapper.cellconverter.DefaultElementConverter;
  9. import com.gh.mygreen.xlsmapper.cellconverter.ElementConverter;
  10. import com.gh.mygreen.xlsmapper.util.Utils;

  11. /**
  12.  * リストの形式に変換するフォーマッタ。
  13.  *
  14.  * @version 2.0
  15.  * @author T.TSUCHIE
  16.  *
  17.  */
  18. @SuppressWarnings("rawtypes")
  19. public class ListFormatter implements TextFormatter<List> {
  20.    
  21.     /**
  22.      * 要素のクラスタイプ
  23.      */
  24.     private final Class<?> elementType;
  25.    
  26.     /**
  27.      * 要素の区切り
  28.      */
  29.     private String separator = ",";
  30.    
  31.     /**
  32.      * フォーマットする際に空の要素は無視するかどうか
  33.      */
  34.     private boolean ignoreEmptyElement = false;
  35.    
  36.     /**
  37.      * トリムして処理をするかどうか
  38.      */
  39.     private boolean trimmed = false;
  40.    
  41.     /**
  42.      * 要素の変換クラス
  43.      */
  44.     private ElementConverter elementConverter = new DefaultElementConverter();
  45.    
  46.     public ListFormatter(final Class<?> elementType) {
  47.         this.elementType = elementType;
  48.     }
  49.    
  50.     @SuppressWarnings("unchecked")
  51.     @Override
  52.     public List parse(final String text) throws TextParseException {
  53.        
  54.         if(Utils.isEmpty(text)) {
  55.             return Collections.emptyList();
  56.         }
  57.        
  58.         final String[] split = text.split(separator);
  59.         if(split.length == 0) {
  60.             return Collections.emptyList();
  61.         }
  62.        
  63.         final List list = new ArrayList<>();
  64.         for(String element : split) {
  65.             String strVal = Utils.trim(element, trimmed);
  66.             if(ignoreEmptyElement && Utils.isEmpty(strVal)) {
  67.                 continue;
  68.             }
  69.            
  70.             try {
  71.                 list.add(elementConverter.convertToObject(strVal, elementType));
  72.                
  73.             } catch(ConversionException e) {
  74.                 final Map<String, Object> vars = new HashMap<>();
  75.                 vars.put("separator", separator);
  76.                 vars.put("ignoreEmptyElement", ignoreEmptyElement);
  77.                 vars.put("trimmed", trimmed);
  78.                 vars.put("elementClass", elementType.getName());
  79.                
  80.                 throw new TextParseException(text, List.class, e, vars);
  81.             }
  82.         }
  83.        
  84.         return list;
  85.     }
  86.    
  87.     @Override
  88.     public String format(final List value) {
  89.         if(value == null) {
  90.             return "";
  91.         }
  92.         return Utils.join(value, separator, ignoreEmptyElement, trimmed, elementConverter);
  93.     }
  94.    
  95.     /**
  96.      * 要素の区切り文字を設定します。
  97.      * @param separator 区切り文字
  98.      */
  99.     public void setSeparator(String separator) {
  100.         this.separator = separator;
  101.     }
  102.    
  103.     /**
  104.      * フォーマットする際に空の要素は無視するかどうか設定します。
  105.      * @param ignoreEmptyElement 空の要素は無視するかどうか
  106.      */
  107.     public void setIgnoreEmptyElement(boolean ignoreEmptyElement) {
  108.         this.ignoreEmptyElement = ignoreEmptyElement;
  109.     }
  110.    
  111.     /**
  112.      * トリムして処理をするかどうか設定します。
  113.      * @param trimmed トリムして処理をするかどうか
  114.      */
  115.     public void setTrimmed(boolean trimmed) {
  116.         this.trimmed = trimmed;
  117.     }
  118.    
  119.     /**
  120.      * 要素の変換処理方法を設定します。
  121.      * @param elementConverter 要素の変換処理方法
  122.      */
  123.     public void setElementConverter(ElementConverter elementConverter) {
  124.         this.elementConverter = elementConverter;
  125.     }
  126.    
  127. }