View Javadoc
1   package com.github.mygreen.supercsv.builder;
2   
3   import java.util.LinkedHashSet;
4   import java.util.List;
5   import java.util.Set;
6   
7   import com.github.mygreen.supercsv.annotation.CsvBean;
8   import com.github.mygreen.supercsv.annotation.conversion.CsvFixedSize;
9   import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException;
10  import com.github.mygreen.supercsv.localization.MessageBuilder;
11  import com.github.mygreen.supercsv.util.Utils;
12  
13  /**
14   * 固定長用のBean定義からCSVのマッピング情報を作成するクラス。
15   *
16   * @since 2.5
17   * @author T.TSUCHIE
18   *
19   */
20  public class FixedSizeBeanMappingFactory extends BeanMappingFactory {
21  
22      /**
23       * デフォルトコンストラクタ
24       */
25      public FixedSizeBeanMappingFactory() {
26  
27      }
28      
29      /**
30       * ヘッダーの処理のデフォルトを {@link FixedSizeHeaderMapper}に設定する。
31       * {@inheritDoc}
32       */
33      @Override
34      protected <T> void buildHeaderMapper(final BeanMapping<T> beanMapping, final CsvBean beanAnno) {
35          
36          final HeaderMapper headerMapper;
37          if (beanAnno.headerMapper().equals(DefaultHeaderMapper.class)) {
38              // デフォルトのヘッダーマッパーを指定している場合、固定長用のヘッダーマッパーに置き換える
39              headerMapper= (HeaderMapper) getConfiguration().getBeanFactory().create(FixedSizeHeaderMapper.class);
40          } else {
41              headerMapper = (HeaderMapper) getConfiguration().getBeanFactory().create(beanAnno.headerMapper());
42          }
43          
44          beanMapping.setHeaderMapper(headerMapper);
45          beanMapping.setHeader(beanAnno.header());
46          beanMapping.setValidateHeader(beanAnno.validateHeader());
47          
48      }
49  
50      @Override
51      protected void validateColumnAndSupplyPartialColumn(final Class<?> beanType, final List<ColumnMapping> list) {
52  
53          super.validateColumnAndSupplyPartialColumn(beanType, list);
54          
55          // 全てのカラムに固定長の設定が付与されているかどうかチェックする
56          Set<String> notFixedColumnList = new LinkedHashSet<>();
57          for(ColumnMapping columnMapping : list) {
58              if(columnMapping.getFixedSizeProperty() == null) {
59                  // エラーメッセージ用のカラム名の組み立て
60                  final String columnName;
61                  if(Utils.isNotEmpty(columnMapping.getName())) {
62                      columnName = String.format("%s(%d)", columnMapping.getName(), columnMapping.getNumber());
63                  } else {
64                      columnName = String.format("%s(%d)", columnMapping.getLabel(), columnMapping.getNumber());
65                  }
66                  notFixedColumnList.add(columnName);
67              }
68          }
69          
70          if(!notFixedColumnList.isEmpty()) {
71              // 固定長カラムの設定がない numberが存在する場合
72              throw new SuperCsvInvalidAnnotationException(MessageBuilder.create("anno.CsvFixedSize.notFoundFixedAnno")
73                      .var("property", beanType.getName())
74                      .varWithAnno("anno", CsvFixedSize.class)
75                      .var("columnList", notFixedColumnList)
76                      .format());
77          }
78          
79      }
80  
81  }