CellConverterRegistry.java

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

  2. import java.math.BigDecimal;
  3. import java.math.BigInteger;
  4. import java.net.URI;
  5. import java.sql.Time;
  6. import java.sql.Timestamp;
  7. import java.time.LocalDate;
  8. import java.time.LocalDateTime;
  9. import java.time.LocalTime;
  10. import java.util.Calendar;
  11. import java.util.Date;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Set;
  15. import java.util.concurrent.ConcurrentHashMap;

  16. import com.gh.mygreen.xlsmapper.cellconverter.impl.ArrayCellConverterFactory;
  17. import com.gh.mygreen.xlsmapper.cellconverter.impl.BigDecimalCellConverterFactory;
  18. import com.gh.mygreen.xlsmapper.cellconverter.impl.BigIntegerCellConverterFactory;
  19. import com.gh.mygreen.xlsmapper.cellconverter.impl.BooleanCellConverterFactory;
  20. import com.gh.mygreen.xlsmapper.cellconverter.impl.ByteCellConverterFactory;
  21. import com.gh.mygreen.xlsmapper.cellconverter.impl.CalendarCellConverterFactory;
  22. import com.gh.mygreen.xlsmapper.cellconverter.impl.CellLinkCellConverterFactory;
  23. import com.gh.mygreen.xlsmapper.cellconverter.impl.CharacterCellConverterFactory;
  24. import com.gh.mygreen.xlsmapper.cellconverter.impl.DateCellConverterFactory;
  25. import com.gh.mygreen.xlsmapper.cellconverter.impl.DoubleCellConverterFactory;
  26. import com.gh.mygreen.xlsmapper.cellconverter.impl.EnumCellConverterFactory;
  27. import com.gh.mygreen.xlsmapper.cellconverter.impl.FloatCellConverterFactory;
  28. import com.gh.mygreen.xlsmapper.cellconverter.impl.IntegerCellConverterFactory;
  29. import com.gh.mygreen.xlsmapper.cellconverter.impl.ListCellConverterFactory;
  30. import com.gh.mygreen.xlsmapper.cellconverter.impl.LocalDateCellConverterFactory;
  31. import com.gh.mygreen.xlsmapper.cellconverter.impl.LocalDateTimeCellConverterFactory;
  32. import com.gh.mygreen.xlsmapper.cellconverter.impl.LocalTimeCellConverterFactory;
  33. import com.gh.mygreen.xlsmapper.cellconverter.impl.LongCellConverterFactory;
  34. import com.gh.mygreen.xlsmapper.cellconverter.impl.SetCellConverterFactory;
  35. import com.gh.mygreen.xlsmapper.cellconverter.impl.ShortCellConverterFactory;
  36. import com.gh.mygreen.xlsmapper.cellconverter.impl.SqlDateCellConverterFactory;
  37. import com.gh.mygreen.xlsmapper.cellconverter.impl.SqlTimeCellConverterFactory;
  38. import com.gh.mygreen.xlsmapper.cellconverter.impl.SqlTimestampCellConverterFactory;
  39. import com.gh.mygreen.xlsmapper.cellconverter.impl.StringCellConverterFactory;
  40. import com.gh.mygreen.xlsmapper.cellconverter.impl.URICellConverterFactory;
  41. import com.gh.mygreen.xlsmapper.util.ArgUtils;


  42. /**
  43.  * ExcelのCell {@literal <=>} Javaオブジェクト の相互変換をする{@link CellConverter}を管理するクラス。
  44.  * 独自の{@link CellConverter}を登録したりする場合は、このクラスを経由する。
  45.  *
  46.  * @version 1.0
  47.  * @author T.TSUCHIE
  48.  *
  49.  */
  50. public class CellConverterRegistry {
  51.    
  52.     /**
  53.      * {@link CellConverterFactory}のクラスのキャッシュ情報
  54.      * ・key = 変換対象のJavaのクラスタイプ
  55.      * ・value = Converterクラスのインスタンス。
  56.      */
  57.     private Map<Class<?>, CellConverterFactory<?>> converterFactoryMap;
  58.    
  59.     public CellConverterRegistry() {
  60.         init();
  61.     }
  62.    
  63.     /**
  64.      * 初期化を行います。
  65.      * <p>システム標準の{@link CellConverter}を登録などを行います。
  66.      */
  67.     protected void init() {
  68.        
  69.         if(converterFactoryMap == null) {
  70.             this.converterFactoryMap = new ConcurrentHashMap<>();
  71.         } else {
  72.             converterFactoryMap.clear();
  73.         }
  74.        
  75.         registerConverter(Boolean.class, new BooleanCellConverterFactory());
  76.         registerConverter(boolean.class, new BooleanCellConverterFactory());
  77.        
  78.         registerConverter(Character.class, new CharacterCellConverterFactory());
  79.         registerConverter(char.class, new CharacterCellConverterFactory());
  80.        
  81.         registerConverter(String.class, new StringCellConverterFactory());
  82.        
  83.         registerConverter(Short.class, new ShortCellConverterFactory());
  84.         registerConverter(short.class, new ShortCellConverterFactory());
  85.        
  86.         registerConverter(Byte.class, new ByteCellConverterFactory());
  87.         registerConverter(byte.class, new ByteCellConverterFactory());
  88.        
  89.         registerConverter(Integer.class, new IntegerCellConverterFactory());
  90.         registerConverter(int.class, new IntegerCellConverterFactory());
  91.        
  92.         registerConverter(Long.class, new LongCellConverterFactory());
  93.         registerConverter(long.class, new LongCellConverterFactory());
  94.        
  95.         registerConverter(Float.class, new FloatCellConverterFactory());
  96.         registerConverter(float.class, new FloatCellConverterFactory());
  97.        
  98.         registerConverter(Double.class, new DoubleCellConverterFactory());
  99.         registerConverter(double.class, new DoubleCellConverterFactory());
  100.        
  101.         registerConverter(BigDecimal.class, new BigDecimalCellConverterFactory());
  102.         registerConverter(BigInteger.class, new BigIntegerCellConverterFactory());
  103.        
  104.         registerConverter(Date.class, new DateCellConverterFactory());
  105.         registerConverter(java.sql.Date.class, new SqlDateCellConverterFactory());
  106.         registerConverter(Timestamp.class, new SqlTimestampCellConverterFactory());
  107.         registerConverter(Time.class, new SqlTimeCellConverterFactory());
  108.        
  109.         registerConverter(Calendar.class, new CalendarCellConverterFactory());
  110.        
  111.         registerConverter(Enum.class, new EnumCellConverterFactory());
  112.        
  113.         registerConverter(List.class, new ListCellConverterFactory());
  114.         registerConverter(Set.class, new SetCellConverterFactory());
  115.         registerConverter(Object[].class, new ArrayCellConverterFactory());
  116.        
  117.         registerConverter(URI.class, new URICellConverterFactory());
  118.         registerConverter(CellLink.class, new CellLinkCellConverterFactory());
  119.        
  120.         registerConverter(LocalDateTime.class, new LocalDateTimeCellConverterFactory());
  121.         registerConverter(LocalDate.class, new LocalDateCellConverterFactory());
  122.         registerConverter(LocalTime.class, new LocalTimeCellConverterFactory());
  123.        
  124.     }
  125.    
  126.     /**
  127.      * タイプに対する{@link CellConverterFactory}を取得する。
  128.      * @param clazz 取得対象の{@link CellConverterFactory}のクラス。
  129.      * @return 見つからない場合はnullを返す。
  130.      */
  131.     @SuppressWarnings("unchecked")
  132.     public <T> CellConverterFactory<T> getConverterFactory(final Class<T> clazz) {
  133.         ArgUtils.notNull(clazz, "clazz");
  134.        
  135.         CellConverterFactory<T> converterFactory = (CellConverterFactory<T>) converterFactoryMap.get(clazz);
  136.         if(converterFactory == null) {
  137.             // 特別に判定が必要なクラス
  138.             if(Enum.class.isAssignableFrom(clazz)) {
  139.                 converterFactory = (CellConverterFactory<T>) converterFactoryMap.get(Enum.class);
  140.                
  141.             } else if(List.class.isAssignableFrom(clazz)) {
  142.                 converterFactory = (CellConverterFactory<T>) converterFactoryMap.get(List.class);
  143.                
  144.             } else if(clazz.isArray()) {
  145.                 converterFactory = (CellConverterFactory<T>) converterFactoryMap.get(Object[].class);
  146.                
  147.             }
  148.         }
  149.        
  150.         return converterFactory;
  151.     }
  152.    
  153.     /**
  154.      * タイプに対する{@link CellConverter}を登録する。
  155.      * @param clazz 変換対象のJavaのクラスタイプ。
  156.      * @param converterFactory 変換する{@link CellConverterFactory}のインスタンス。
  157.      */
  158.     public <T> void registerConverter(final Class<T> clazz, final CellConverterFactory<T> converterFactory) {
  159.         ArgUtils.notNull(clazz, "clazz");
  160.         ArgUtils.notNull(converterFactory, "converterFactory");
  161.        
  162.         converterFactoryMap.put(clazz, converterFactory);
  163.     }
  164.    
  165. }