1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.field.converter;
35
36 import info.magnolia.ui.field.DateFieldDefinition;
37
38 import java.time.LocalDate;
39 import java.time.LocalDateTime;
40 import java.time.ZoneId;
41 import java.time.format.DateTimeFormatter;
42 import java.time.temporal.Temporal;
43 import java.util.Date;
44 import java.util.Locale;
45 import java.util.Optional;
46
47 import javax.inject.Inject;
48
49 import com.vaadin.data.Converter;
50 import com.vaadin.data.Result;
51 import com.vaadin.data.ValueContext;
52 import com.vaadin.data.converter.LocalDateTimeToDateConverter;
53 import com.vaadin.data.converter.LocalDateToDateConverter;
54
55
56
57
58
59
60
61 public class DateConverter implements Converter<Temporal, Object> {
62
63 private final ZoneId zoneId = ZoneId.systemDefault();
64 private final DateFieldDefinition definition;
65
66 @Inject
67 public DateConverter(DateFieldDefinition definition) {
68 this.definition = definition;
69 }
70
71 @Override
72 public Result<Object> convertToModel(Temporal value, ValueContext valueContext) {
73 if (value instanceof LocalDate) {
74 return Result.ok(Date.from(((LocalDate) value).atStartOfDay(zoneId).toInstant()));
75 }
76 return Result.ok(Optional.ofNullable(value)
77 .map(nonNullDateTime -> Date.from(((LocalDateTime) nonNullDateTime).atZone(zoneId).toInstant()))
78 .orElse(null));
79 }
80
81 @Override
82 public Temporal convertToPresentation(Object value, ValueContext valueContext) {
83 if (value == null) {
84 return null;
85 }
86
87 if (value instanceof String) {
88 return asTemporal((String) value);
89 }
90
91 Converter converter = definition.isTime() ?
92 new LocalDateTimeToDateConverter(zoneId) :
93 new LocalDateToDateConverter(zoneId);
94
95 return (Temporal) converter.convertToPresentation(value, valueContext);
96 }
97
98 private Temporal asTemporal(String defaultValue) {
99 if (DateFieldDefinition.NOW.equalsIgnoreCase(defaultValue)) {
100 return definition.isTime() ? LocalDateTime.now() : LocalDate.now();
101 }
102
103 if (definition.isTime()) {
104 return LocalDateTime.parse(defaultValue, DateTimeFormatter.ofPattern(definition.getDateFormat() + " " + definition.getTimeFormat(), Locale.ENGLISH));
105 } else {
106 return LocalDate.parse(defaultValue, DateTimeFormatter.ofPattern(definition.getDateFormat(), Locale.ENGLISH));
107 }
108 }
109 }