View Javadoc
1   package com.gh.mygreen.xlsmapper.cellconverter;
2   
3   import java.util.Arrays;
4   import java.util.Collection;
5   import java.util.Collections;
6   import java.util.HashSet;
7   import java.util.NoSuchElementException;
8   import java.util.Objects;
9   import java.util.Optional;
10  import java.util.Set;
11  
12  import com.gh.mygreen.xlsmapper.fieldprocessor.ProcessCase;
13  
14  /**
15   * 処理ケースが該当する
16   *
17   *
18   * @param <T> 保持する値のクラスタイプ
19   * @author T.TSUCHIE
20   */
21  public class OptionalProcessCase<T> {
22  
23      /**
24       * 空オブジェクト
25       */
26      private static final OptionalProcessCase<?> EMPTY = new OptionalProcessCase<>(Optional.empty(), Collections.emptyList());
27  
28      private final Optional<T> value;
29  
30      private final Set<ProcessCase> cases;
31  
32      private OptionalProcessCase(Optional<T> value, Collection<ProcessCase> cases) {
33          this.value = value;
34          this.cases = new HashSet<>(cases);
35      }
36  
37      /**
38       * 指定された非null値を含む{@link OptionalProcessCase} を返します。
39       * @param value 存在する値、非nullである必要がある
40       * @param cases 処理ケース。
41       * @return 存在する値での{@link OptionalProcessCase}.
42       */
43      public static <T> OptionalProcessCase<T> of(T value, ProcessCase... cases) {
44          return new OptionalProcessCase<>(Optional.of(value), Arrays.asList(cases));
45  
46      }
47  
48      /**
49       * 指定された値がnullでない場合はその値を記述する{@link OptionalProcessCase}を返し、
50       * それ以外の場合は空の{@link OptionalProcessCase}を返します。
51       *
52       * @param value 記述する値(nullも可)
53       * @param cases 処理ケース。
54       * @return 指定された値がnullでない場合は存在する値での{@link OptionalProcessCase}、それ以外の場合は空の{@link OptionalProcessCase}.
55       */
56      public static <T> OptionalProcessCase<T> ofNulable(T value, ProcessCase... cases) {
57          return new OptionalProcessCase<>(Optional.ofNullable(value), Arrays.asList(cases));
58      }
59  
60      /**
61       * 空の{@link OptionalProcessCase}インスタンスを返します。この{@link OptionalProcessCase}の値は存在しません。
62       * @return 空の{@link OptionalProcessCase}
63       */
64      @SuppressWarnings("unchecked")
65      public static <T> OptionalProcessCase<T> empty() {
66          return (OptionalProcessCase<T>)EMPTY;
67      }
68  
69      /**
70       * 存在する値がある場合はtrueを返し、それ以外の場合はfalseを返します。
71       * 処理ケースに該当する必要もあります。
72       * @param processCase 処理ケース
73       * @return 存在する値がない場合はtrue、それ以外の場合はfalse
74       */
75      public boolean isPresent(final ProcessCase processCase) {
76          return value.isPresent() & contains(processCase);
77      }
78  
79      /**
80       * この{@link OptionalProcessCase}に値が存在する場合は値を返し、それ以外の場合は{@link NoSuchElementException}を返します。
81       * @param processCase 処理ケース
82       * @return この{@link NoSuchElementException}が保持する非null値
83       * @throws NoSuchElementException 存在する値がない場合
84       */
85      public T get(final ProcessCase processCase) {
86  
87          if(!value.isPresent() || !isPresent(processCase)) {
88              throw new NoSuchElementException(String.format("No value present in processCase '%s'.", processCase.name()));
89          }
90  
91          return value.get();
92      }
93  
94      /**
95       * 処理ケースに該当するうかどうか判定します。
96       * 処理ケースが空の場合は、全てに該当します。
97       * @param processCase 判定する処理ケース
98       * @return trueの場合、該当する。
99       */
100     public boolean contains(final ProcessCase processCase) {
101         Objects.requireNonNull(processCase);
102 
103         if(cases.isEmpty()) {
104             return true;
105         }
106 
107         return cases.contains(processCase);
108 
109     }
110 
111 }