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;
35
36 import static info.magnolia.util.Functions.defaultCombiner;
37
38 import info.magnolia.objectfactory.ComponentProvider;
39
40 import java.util.Optional;
41
42 import org.apache.commons.lang3.ArrayUtils;
43
44 import com.vaadin.data.Binder;
45 import com.vaadin.data.Converter;
46 import com.vaadin.data.ErrorMessageProvider;
47 import com.vaadin.data.HasValue;
48 import com.vaadin.data.Validator;
49
50
51
52
53 public interface FieldBinder<T> {
54
55 <BT> Binder.BindingBuilder<BT, T> configureBinding(FieldDefinition<T> definition, Binder.BindingBuilder<BT, T> source);
56
57
58
59
60
61
62
63
64 class Default<T> implements FieldBinder<T> {
65
66 private final ComponentProvider componentProvider;
67
68 public Default(ComponentProvider componentProvider) {
69 this.componentProvider = componentProvider;
70 }
71
72 @Override
73 public <BT> Binder.BindingBuilder<BT, T> configureBinding(FieldDefinition<T> definition, Binder.BindingBuilder<BT, T> source) {
74 Binder.BindingBuilder<BT, T> result = source;
75
76 if (definition.isRequired()) {
77 source.asRequired(definition.getRequiredErrorMessage());
78 }
79
80 result = definition.getValidators().stream()
81 .map(this::newValidator)
82 .reduce(result, Binder.BindingBuilder::withValidator, defaultCombiner());
83
84
85 result = createConfiguredConverter(definition, result.getField()).map(result::withConverter).orElse((Binder.BindingBuilder) result);
86
87 return result;
88 }
89
90 private <VT> Validator<VT> newValidator(FieldValidatorDefinition definition, Object... parameters) {
91 FieldValidatorFactory fieldValidatorFactory = componentProvider.newInstance(definition.getFactoryClass(), ArrayUtils.add(parameters, definition));
92 return fieldValidatorFactory.createValidator();
93 }
94
95 protected <PT> Optional<Converter<PT, ?>> createConfiguredConverter(FieldDefinition<PT> definition, HasValue<?> field) {
96 ErrorMessageProvider errorMessageProvider = context -> definition.getConversionErrorMessage();
97 return Optional.ofNullable(definition.getConverterClass())
98 .map(converterClass -> componentProvider.newInstance(converterClass, field, errorMessageProvider));
99 }
100 }
101 }
102