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.task.app;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.objectfactory.Components;
38 import info.magnolia.task.Task;
39 import info.magnolia.ui.field.FieldDefinition;
40 import info.magnolia.ui.framework.datasource.components.PropertySetFactory;
41
42 import java.time.Instant;
43 import java.time.LocalDateTime;
44 import java.time.ZoneId;
45 import java.time.format.DateTimeFormatter;
46 import java.util.Calendar;
47 import java.util.Collection;
48 import java.util.HashMap;
49 import java.util.Locale;
50 import java.util.Map;
51 import java.util.Optional;
52 import java.util.stream.Stream;
53
54 import org.apache.commons.lang3.StringUtils;
55 import org.apache.commons.lang3.time.FastDateFormat;
56
57 import com.vaadin.data.BeanPropertySet;
58 import com.vaadin.data.PropertyDefinition;
59 import com.vaadin.data.PropertySet;
60 import com.vaadin.data.ValueProvider;
61 import com.vaadin.server.Setter;
62
63 import lombok.AllArgsConstructor;
64
65
66
67
68 public class TasksPropertySetFactory implements PropertySetFactory<Task> {
69
70 @Override
71 public PropertySet<Task> withProperties(Map<String, Class> properties) {
72 return BeanPropertySet.get(Task.class);
73 }
74
75 @Override
76 public PropertySet<Task> fromFieldDefinitions(Collection<FieldDefinition> fieldDefinitions, Locale locale) {
77 return new PropertySet<Task>() {
78 private final PropertySet<Task> propertySet = BeanPropertySet.get(Task.class);
79
80 @Override
81 public Stream<PropertyDefinition<Task, ?>> getProperties() {
82 return fieldDefinitions.stream().map(editorPropertyDefinition -> new TaskPropertyDefinition(propertySet, editorPropertyDefinition.getName()));
83 }
84
85 @Override
86 public Optional<PropertyDefinition<Task, ?>> getProperty(String name) {
87 return getProperties().filter(taskPropertyDefinition -> taskPropertyDefinition.getName().equals(name)).findFirst();
88 }
89 };
90 }
91
92 @AllArgsConstructor
93 private class TaskPropertyDefinition implements PropertyDefinition<Task, Object> {
94 private PropertySet<Task> propertySet;
95 private String name;
96
97 @Override
98 public ValueProvider<Task, Object> getGetter() {
99 return name.contains(".") ? getTaskObjectValueProvider() : (ValueProvider<Task, Object>) propertySet.getProperty(name).map(PropertyDefinition::getGetter).get();
100 }
101
102 private ValueProvider<Task, Object> getTaskObjectValueProvider() {
103 return (ValueProvider<Task, Object>) task -> {
104 Map subPropertySet = propertySet.getProperty(StringUtils.substringBefore(name, "."))
105 .map(PropertyDefinition::getGetter)
106 .map(taskValueProvider -> taskValueProvider.apply(task))
107 .filter(Map.class::isInstance)
108 .map(Map.class::cast)
109 .orElse(new HashMap());
110
111 return Optional.ofNullable(subPropertySet.get(StringUtils.substringAfter(name, ".")))
112 .map(object -> object instanceof Calendar ? getLocalDateTime(((Calendar) object).getTimeInMillis()).format(DateTimeFormatter.ofPattern(getDateTimePattern())) : String.valueOf(object))
113 .orElse(StringUtils.EMPTY);
114 };
115 }
116
117 private String getDateTimePattern() {
118 Locale locale = Components.getComponent(Context.class).getLocale();
119 return FastDateFormat.getDateTimeInstance(FastDateFormat.MEDIUM, FastDateFormat.SHORT, locale).getPattern();
120 }
121
122 private LocalDateTime getLocalDateTime(long ms) {
123 return Instant.ofEpochMilli(ms)
124 .atZone(ZoneId.systemDefault())
125 .toLocalDateTime();
126 }
127
128 @Override
129 public Optional<Setter<Task, Object>> getSetter() {
130 return Optional.empty();
131 }
132
133 @Override
134 public Class<Object> getType() {
135 return Object.class;
136 }
137
138 public Class<?> getPropertyHolderType() {
139 return Task.class;
140 }
141
142 @Override
143 public String getName() {
144 return name;
145 }
146
147 @Override
148 public PropertySet<Task> getPropertySet() {
149 return propertySet;
150 }
151
152 @Override
153 public String getCaption() {
154 return name.toUpperCase();
155 }
156
157 }
158
159 }