FieldAccessorUtils.java

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

  2. import java.lang.annotation.Annotation;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.stream.Collectors;

  8. import com.gh.mygreen.xlsmapper.Configuration;
  9. import com.gh.mygreen.xlsmapper.annotation.XlsArrayColumns;
  10. import com.gh.mygreen.xlsmapper.annotation.XlsColumn;
  11. import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
  12. import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessorFactory;
  13. import com.gh.mygreen.xlsmapper.xml.AnnotationReader;

  14. /**
  15.  * {@link FieldAccessor}に対するユーティリティクラス。
  16.  *
  17.  * @since 2.0
  18.  * @author T.TSUCHIE
  19.  *
  20.  */
  21. public class FieldAccessorUtils {
  22.    
  23.     /**
  24.      * 指定したアノテーションを持つBeanのプロパティ(フィールド、アクセッサメソッド)の一覧を取得します。
  25.      * @param targetClass 取得元のクラス情報
  26.      * @param annoReader {@link AnnotationReader}のインスタンス。
  27.      * @param annoClass アノテーションのクラス
  28.      * @return プロパティの一覧。存在しない場合は、空のリストを返す。
  29.      * @throws IllegalArgumentException {@literal targetClass == null or annoReader == null or annoClass == null.}
  30.      */
  31.     public static List<FieldAccessor> getPropertiesWithAnnotation(final Class<?> targetClass, final AnnotationReader annoReader,
  32.             final Class<? extends Annotation> annoClass) {
  33.        
  34.         ArgUtils.notNull(targetClass, "targetClass");
  35.         ArgUtils.notNull(annoReader, "annoReader");
  36.         ArgUtils.notNull(annoClass, "annoClass");
  37.        
  38.         final FieldAccessorFactory accessorFactory = new FieldAccessorFactory(annoReader);
  39.         final List<FieldAccessor> list = new ArrayList<>();
  40.        
  41.         for(Method method : targetClass.getMethods()) {
  42.             if(!ClassUtils.isAccessorMethod(method)) {
  43.                 continue;
  44.             }
  45.            
  46.             method.setAccessible(true);
  47.            
  48.             final FieldAccessor accessor = accessorFactory.create(method);
  49.             if(accessor.hasAnnotation(annoClass) && !list.contains(accessor)) {
  50.                 list.add(accessor);
  51.             }
  52.         }
  53.        
  54.         for(Field field : targetClass.getDeclaredFields()) {
  55.             field.setAccessible(true);
  56.            
  57.             final FieldAccessor accessor = accessorFactory.create(field);
  58.             if(accessor.hasAnnotation(annoClass) && !list.contains(accessor)) {
  59.                 list.add(accessor);
  60.             }
  61.            
  62.         }
  63.        
  64.         return list;
  65.        
  66.     }
  67.    
  68.     /**
  69.      * アノテーション{@link XlsColumn}が付与されているBeanのプロパティ(フィールド、アクセッサメソッド)の一覧を取得します。
  70.      * ただし、属性{@link XlsColumn#columnName()}の値が、指定した値と等しいか判定します。
  71.      *
  72.      * @param targetClass 取得元のクラス情報
  73.      * @param annoReader {@link AnnotationReader}のインスタンス。
  74.      * @param config システム設定情報
  75.      * @param columnName カラムの値
  76.      * @return プロパティの一覧。存在しない場合は、空のリストを返す。
  77.      * @throws IllegalArgumentException {@literal config == null || columnName == null.}
  78.      */
  79.     public static List<FieldAccessor> getColumnPropertiesByName(final Class<?> targetClass, final AnnotationReader annoReader,
  80.             final Configuration config, final String columnName) {
  81.        
  82.         return getPropertiesWithAnnotation(targetClass, annoReader, XlsColumn.class)
  83.             .stream()
  84.             .filter(accessor -> Utils.matches(columnName, accessor.getAnnotation(XlsColumn.class).get().columnName(), config))
  85.             .collect(Collectors.toList());
  86.        
  87.     }
  88.    
  89.     /**
  90.      * アノテーション{@link XlsArrayColumns}が付与されているBeanのプロパティ(フィールド、アクセッサメソッド)の一覧を取得します。
  91.      * ただし、属性{@link XlsArrayColumns#columnName()}の値が、指定した値と等しいか判定します。
  92.      *
  93.      * @param targetClass 取得元のクラス情報
  94.      * @param annoReader {@link AnnotationReader}のインスタンス。
  95.      * @param config システム設定情報
  96.      * @param columnName カラムの値
  97.      * @return プロパティの一覧。存在しない場合は、空のリストを返す。
  98.      * @throws IllegalArgumentException {@literal config == null || columnName == null.}
  99.      */
  100.     public static List<FieldAccessor> getArrayColumnsPropertiesByName(final Class<?> targetClass, final AnnotationReader annoReader,
  101.             final Configuration config, final String columnName) {
  102.        
  103.         return getPropertiesWithAnnotation(targetClass, annoReader, XlsArrayColumns.class)
  104.             .stream()
  105.             .filter(accessor -> Utils.matches(columnName, accessor.getAnnotation(XlsArrayColumns.class).get().columnName(), config))
  106.             .collect(Collectors.toList());
  107.        
  108.     }
  109. }