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