FieldAccessorProxyComparator.java

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

  2. import java.util.Comparator;
  3. import java.util.Optional;

  4. import com.gh.mygreen.xlsmapper.annotation.XlsOrder;


  5. /**
  6.  * アノテーション{@link XlsOrder}に従いフィールドの順番を並び替えるComparator。
  7.  * <ul>
  8.  *  <li>{@code @XlsOrder}の属性valueの順に並び替えます。</li>
  9.  *  <li>{@code @XlsOrder}の属性valueの値が同じ場合は、第2並び順としてフィールド名の昇順を使用します。</li>
  10.  *  <li>{@code @XlsOrder}が付与されていないフィールドは、付与されているフィールドよりも後になります。</li>
  11.  *  <li>{@code @XlsOrder}が付与されていないフィールドは、フィールド名の昇順で並び替えます。</li>
  12.  * </ul>
  13.  *
  14.  * @author T.TSUCHIE
  15.  *
  16.  */
  17. public class FieldAccessorProxyComparator implements Comparator<FieldAccessorProxy> {

  18.     @Override
  19.     public int compare(final FieldAccessorProxy o1, final FieldAccessorProxy o2) {

  20.         final Optional<Integer> order1 = getOrder(o1);
  21.         final Optional<Integer> order2 = getOrder(o2);

  22.         if(!order1.isPresent() && !order2.isPresent()) {
  23.             // 並び順がない場合は、フィールド名の昇順
  24.             return o1.getField().getName().compareTo(o2.getField().getName());
  25.         } else if(!order1.isPresent()) {
  26.             return -1;
  27.         } else if(!order2.isPresent()) {
  28.             return 1;
  29.         }

  30.         final int value1 = order1.get();
  31.         final int value2 = order2.get();
  32.         if(value1 == value2) {
  33.             // 並び順が同じ場合は、フィールド名の昇順
  34.             return o1.getField().getName().compareTo(o2.getField().getName());
  35.         } else if(value1 > value2) {
  36.             return 1;
  37.         } else {
  38.             return -1;
  39.         }

  40.     }

  41.     private Optional<Integer> getOrder(final FieldAccessorProxy accessorProxy) {

  42.         return accessorProxy.getField().getAnnotation(XlsOrder.class)
  43.                 .map(anno -> anno.value());

  44.     }
  45. }