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