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
16
17
18
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
30
31
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
45
46
47
48
49
50
51
52
53
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
79
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 }