FieldAccessorProxyComparator.java
- package com.gh.mygreen.xlsmapper.fieldaccessor;
- import java.util.Comparator;
- import java.util.Optional;
- import com.gh.mygreen.xlsmapper.annotation.XlsOrder;
- /**
- * アノテーション{@link XlsOrder}に従いフィールドの順番を並び替えるComparator。
- * <ul>
- * <li>{@code @XlsOrder}の属性valueの順に並び替えます。</li>
- * <li>{@code @XlsOrder}の属性valueの値が同じ場合は、第2並び順としてフィールド名の昇順を使用します。</li>
- * <li>{@code @XlsOrder}が付与されていないフィールドは、付与されているフィールドよりも後になります。</li>
- * <li>{@code @XlsOrder}が付与されていないフィールドは、フィールド名の昇順で並び替えます。</li>
- * </ul>
- *
- * @author T.TSUCHIE
- *
- */
- public class FieldAccessorProxyComparator implements Comparator<FieldAccessorProxy> {
- @Override
- public int compare(final FieldAccessorProxy o1, final FieldAccessorProxy o2) {
- final Optional<Integer> order1 = getOrder(o1);
- final Optional<Integer> order2 = getOrder(o2);
- if(!order1.isPresent() && !order2.isPresent()) {
- // 並び順がない場合は、フィールド名の昇順
- return o1.getField().getName().compareTo(o2.getField().getName());
- } else if(!order1.isPresent()) {
- return -1;
- } else if(!order2.isPresent()) {
- return 1;
- }
- final int value1 = order1.get();
- final int value2 = order2.get();
- if(value1 == value2) {
- // 並び順が同じ場合は、フィールド名の昇順
- return o1.getField().getName().compareTo(o2.getField().getName());
- } else if(value1 > value2) {
- return 1;
- } else {
- return -1;
- }
- }
- private Optional<Integer> getOrder(final FieldAccessorProxy accessorProxy) {
- return accessorProxy.getField().getAnnotation(XlsOrder.class)
- .map(anno -> anno.value());
- }
- }