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 info.magnolia.ui.api.ioc.UiContextScoped;
37 import info.magnolia.ui.field.FieldDefinition;
38 import info.magnolia.ui.field.FieldFactory;
39 import info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider;
40
41 import java.util.Optional;
42
43 import javax.inject.Inject;
44
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import com.vaadin.data.HasValue;
49
50
51
52
53 @UiContextScoped
54 public class FormFieldFactory {
55
56 private static final Logger log = LoggerFactory.getLogger(FormFieldFactory.class);
57
58 private final UiContextBoundComponentProvider parentComponentProvider;
59
60 @Inject
61 public FormFieldFactory(UiContextBoundComponentProvider parentComponentProvider) {
62 this.parentComponentProvider = parentComponentProvider;
63 }
64
65
66
67
68
69
70 public <TYPE, FIELD extends HasValue<TYPE>> FIELD createField(FieldDefinition<TYPE> definition, Object... parameters) {
71 return (FIELD) createFieldFactory(definition, parameters).createField();
72 }
73
74 public <TYPE> FieldFactory<TYPE> createFieldFactory(FieldDefinition<TYPE> definition, Object... parameters) {
75 Class<? extends FieldFactory<TYPE>> factoryClass = definition.getFactoryClass();
76 if (factoryClass == null) {
77 log.warn("No factory class set for definition class [{}]. Please check your configuration.", definition.getClass().getName());
78 return null;
79 }
80
81 Object[] combinedParameters = new Object[parameters.length + 1];
82 combinedParameters[0] = definition;
83 System.arraycopy(parameters, 0, combinedParameters, 1, parameters.length);
84
85 return parentComponentProvider
86 .inChildContext(Optional.ofNullable(definition.getName()).orElse("no-name"), definition)
87 .newInstance(factoryClass, combinedParameters);
88 }
89 }