View Javadoc
1   package com.github.mygreen.supercsv.cellprocessor.format;
2   
3   import java.sql.Time;
4   import java.sql.Timestamp;
5   import java.text.DateFormat;
6   import java.text.ParseException;
7   import java.text.SimpleDateFormat;
8   import java.util.Date;
9   import java.util.HashMap;
10  import java.util.Map;
11  import java.util.Objects;
12  import java.util.Optional;
13  
14  /**
15   * スレッドセーフな{@link DateFormat}。
16   *
17   * @since 1.2
18   * @author T.TSUCHIE
19   *
20   */
21  public class DateFormatWrapper<T extends Date> extends AbstractTextFormatter<T> {
22      
23      private final DateFormat formatter;
24      
25      private final Class<T> type;
26      
27      /**
28       * フォーマッタを指定してインスタンスを作成するコンストラクタ。
29       * @param formatter 日時のフォーマッタ。
30       * @param type 対応する日時のクラス。
31       * @throws NullPointerException if formatter is null.
32       */
33      public DateFormatWrapper(final DateFormat formatter, final Class<T> type) {
34          Objects.requireNonNull(formatter);
35          Objects.requireNonNull(type);
36          
37          this.formatter = (DateFormat) formatter.clone();
38          this.type = type;
39          
40      }
41      
42      /**
43       * 日時のクラス型を指定してインスタンスを作成するコンストラクタ。
44       * <p>書式は、指定したクラスタイプによりにより、自動的に決まります。</p>
45       * <ul>
46       *  <li>{@link Timestamp}型の場合、書式は「yyyy-MM-dd HH:mm:ss.SSS」となります。</li>
47       *  <li>{@link Time}型の場合、書式は「HH:mm:ss」となります。</li>
48       *  <li>{@link java.sql.Date}型の場合、書式は「yyyy-MM-dd」となります。</li>
49       *  <li>{@link Date}型の場合、書式は「yyyy-MM-dd HH:mm:ss」となります。</li>
50       * </ul>
51       * 
52       * @param type 日時型のクラスタイプ。
53       * @throws NullPointerException if dateClass is null.
54       */
55      public DateFormatWrapper(final Class<T> type) {
56          Objects.requireNonNull(type);
57          this.type = type;
58          
59          final String pattern;
60          if(Timestamp.class.isAssignableFrom(type)) {
61              pattern = "yyyy-MM-dd HH:mm:ss.SSS";
62              
63          } else if(Time.class.isAssignableFrom(type)) {
64              pattern = "HH:mm:ss";
65              
66          } else if(java.sql.Date.class.isAssignableFrom(type)) {
67              pattern = "yyyy-MM-dd";
68              
69          } else {
70              pattern = "yyyy-MM-dd HH:mm:ss";
71          }
72          
73          this.formatter = new SimpleDateFormat(pattern);
74      }
75      
76      /**
77       * 日時オブジェクトを文字列にフォーマットします。
78       * @param date 日時オブジェクト。
79       * @return フォーマットした文字列。
80       */
81      @Override
82      public synchronized String print(final Date date) {
83          return formatter.format(date);
84          
85      }
86      
87      @SuppressWarnings("unchecked")
88      @Override
89      public synchronized T parse(final String text) throws TextParseException {
90          
91          final Date date;
92          try {
93              date = formatter.parse(text);
94          } catch (ParseException e) {
95              throw new TextParseException(text, Date.class);
96          }
97          
98          if(Timestamp.class.isAssignableFrom(type)) {
99              return (T)new Timestamp(date.getTime());
100             
101         } else if(Time.class.isAssignableFrom(type)) {
102             return (T)new Time(date.getTime());
103             
104         } else if(java.sql.Date.class.isAssignableFrom(type)) {
105             return (T)new java.sql.Date(date.getTime());
106             
107         } else if(Date.class.isAssignableFrom(type)) {
108             return (T)date;
109             
110         } else {
111             throw new TextParseException(text, type, "Cannot support type.");
112         }
113     }
114     
115     @Override
116     public Optional<String> getPattern() {
117         
118         if(formatter instanceof SimpleDateFormat) {
119             SimpleDateFormat sdf = (SimpleDateFormat) formatter;
120             return Optional.of(sdf.toPattern());
121         }
122         
123         return Optional.empty();
124         
125     }
126     
127     @Override
128     public Map<String, Object> getMessageVariables() {
129         
130         final Map<String, Object> vars = new HashMap<>();
131         getPattern().ifPresent(p -> vars.put("pattern", p));
132         return vars;
133     }
134     
135 }