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.form.field.factory;
35
36 import info.magnolia.objectfactory.ComponentProvider;
37 import info.magnolia.registry.RegistrationException;
38 import info.magnolia.ui.form.field.definition.FieldDefinition;
39 import info.magnolia.ui.form.fieldtype.definition.FieldTypeDefinition;
40 import info.magnolia.ui.form.fieldtype.registry.FieldTypeDefinitionRegistry;
41 import info.magnolia.ui.form.validator.registry.FieldValidatorFactoryFactory;
42
43 import java.io.Serializable;
44
45 import javax.inject.Inject;
46
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50
51
52
53
54
55
56 public class FieldFactoryFactory implements Serializable {
57
58 private static final Logger log = LoggerFactory.getLogger(FieldFactoryFactory.class);
59
60 private final ComponentProvider componentProvider;
61 private final FieldTypeDefinitionRegistry fieldTypeDefinitionRegistry;
62 private final FieldValidatorFactoryFactory fieldValidatorFactoryFactory;
63
64 @Inject
65 public FieldFactoryFactory(ComponentProvider componentProvider, FieldTypeDefinitionRegistry fieldTypeDefinitionRegistry, FieldValidatorFactoryFactory fieldValidatorFactoryFactory) {
66 this.componentProvider = componentProvider;
67 this.fieldTypeDefinitionRegistry = fieldTypeDefinitionRegistry;
68 this.fieldValidatorFactoryFactory = fieldValidatorFactoryFactory;
69 }
70
71
72
73
74
75
76
77
78
79 public FieldFactory createFieldFactory(FieldDefinition definition, Object... parameters) {
80
81 FieldTypeDefinition fieldTypeDefinition;
82 try {
83 fieldTypeDefinition = fieldTypeDefinitionRegistry.getByDefinition(definition.getClass());
84 if (fieldTypeDefinition == null) {
85 return null;
86 }
87 } catch (RegistrationException e) {
88 log.error("No field type definition found for " + definition.getName(), e);
89 return null;
90 }
91
92 Class<? extends FieldFactory> factoryClass = fieldTypeDefinition.getFactoryClass();
93 if (factoryClass == null) {
94 log.warn("No factory class set for definition class [{}]. Please check your configuration.", definition.getClass().getName());
95 return null;
96 }
97
98 Object[] combinedParameters = new Object[parameters.length + 1];
99 combinedParameters[0] = definition;
100 System.arraycopy(parameters, 0, combinedParameters, 1, parameters.length);
101
102 FieldFactory fieldFactory = componentProvider.newInstance(factoryClass, combinedParameters);
103 fieldFactory.setFieldValidatorFactoryFactory(fieldValidatorFactoryFactory);
104
105 return fieldFactory;
106 }
107 }