OptionalProcessCase.java

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

  2. import java.util.Arrays;
  3. import java.util.Collection;
  4. import java.util.Collections;
  5. import java.util.HashSet;
  6. import java.util.NoSuchElementException;
  7. import java.util.Objects;
  8. import java.util.Optional;
  9. import java.util.Set;

  10. import com.gh.mygreen.xlsmapper.fieldprocessor.ProcessCase;

  11. /**
  12.  * 処理ケースが該当する
  13.  *
  14.  *
  15.  * @param <T> 保持する値のクラスタイプ
  16.  * @author T.TSUCHIE
  17.  */
  18. public class OptionalProcessCase<T> {

  19.     /**
  20.      * 空オブジェクト
  21.      */
  22.     private static final OptionalProcessCase<?> EMPTY = new OptionalProcessCase<>(Optional.empty(), Collections.emptyList());

  23.     private final Optional<T> value;

  24.     private final Set<ProcessCase> cases;

  25.     private OptionalProcessCase(Optional<T> value, Collection<ProcessCase> cases) {
  26.         this.value = value;
  27.         this.cases = new HashSet<>(cases);
  28.     }

  29.     /**
  30.      * 指定された非null値を含む{@link OptionalProcessCase} を返します。
  31.      * @param value 存在する値、非nullである必要がある
  32.      * @param cases 処理ケース。
  33.      * @return 存在する値での{@link OptionalProcessCase}.
  34.      */
  35.     public static <T> OptionalProcessCase<T> of(T value, ProcessCase... cases) {
  36.         return new OptionalProcessCase<>(Optional.of(value), Arrays.asList(cases));

  37.     }

  38.     /**
  39.      * 指定された値がnullでない場合はその値を記述する{@link OptionalProcessCase}を返し、
  40.      * それ以外の場合は空の{@link OptionalProcessCase}を返します。
  41.      *
  42.      * @param value 記述する値(nullも可)
  43.      * @param cases 処理ケース。
  44.      * @return 指定された値がnullでない場合は存在する値での{@link OptionalProcessCase}、それ以外の場合は空の{@link OptionalProcessCase}.
  45.      */
  46.     public static <T> OptionalProcessCase<T> ofNulable(T value, ProcessCase... cases) {
  47.         return new OptionalProcessCase<>(Optional.ofNullable(value), Arrays.asList(cases));
  48.     }

  49.     /**
  50.      * 空の{@link OptionalProcessCase}インスタンスを返します。この{@link OptionalProcessCase}の値は存在しません。
  51.      * @return 空の{@link OptionalProcessCase}
  52.      */
  53.     @SuppressWarnings("unchecked")
  54.     public static <T> OptionalProcessCase<T> empty() {
  55.         return (OptionalProcessCase<T>)EMPTY;
  56.     }

  57.     /**
  58.      * 存在する値がある場合はtrueを返し、それ以外の場合はfalseを返します。
  59.      * 処理ケースに該当する必要もあります。
  60.      * @param processCase 処理ケース
  61.      * @return 存在する値がない場合はtrue、それ以外の場合はfalse
  62.      */
  63.     public boolean isPresent(final ProcessCase processCase) {
  64.         return value.isPresent() & contains(processCase);
  65.     }

  66.     /**
  67.      * この{@link OptionalProcessCase}に値が存在する場合は値を返し、それ以外の場合は{@link NoSuchElementException}を返します。
  68.      * @param processCase 処理ケース
  69.      * @return この{@link NoSuchElementException}が保持する非null値
  70.      * @throws NoSuchElementException 存在する値がない場合
  71.      */
  72.     public T get(final ProcessCase processCase) {

  73.         if(!value.isPresent() || !isPresent(processCase)) {
  74.             throw new NoSuchElementException(String.format("No value present in processCase '%s'.", processCase.name()));
  75.         }

  76.         return value.get();
  77.     }

  78.     /**
  79.      * 処理ケースに該当するうかどうか判定します。
  80.      * 処理ケースが空の場合は、全てに該当します。
  81.      * @param processCase 判定する処理ケース
  82.      * @return trueの場合、該当する。
  83.      */
  84.     public boolean contains(final ProcessCase processCase) {
  85.         Objects.requireNonNull(processCase);

  86.         if(cases.isEmpty()) {
  87.             return true;
  88.         }

  89.         return cases.contains(processCase);

  90.     }

  91. }