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 ComponentProvider componentProvider;
61 private FieldTypeDefinitionRegistry fieldTypeDefinitionRegistry;
62 private 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 public FieldFactory createFieldFactory(FieldDefinition definition, Object... parameters) {
79
80 FieldTypeDefinition fieldTypeDefinition;
81 try {
82 fieldTypeDefinition = fieldTypeDefinitionRegistry.getByDefinition(definition.getClass());
83 if (fieldTypeDefinition == null) {
84 return null;
85 }
86 } catch (RegistrationException e) {
87 log.error("No field type definition found for " + definition.getName(), e);
88 return null;
89 }
90
91 Class<? extends FieldFactory> factoryClass = fieldTypeDefinition.getFactoryClass();
92 if (factoryClass == null) {
93 log.warn("No factory class set for definition class [{}]. Please check your configuration.", definition.getClass().getName());
94 return null;
95 }
96
97 Object[] combinedParameters = new Object[parameters.length + 1];
98 combinedParameters[0] = definition;
99 System.arraycopy(parameters, 0, combinedParameters, 1, parameters.length);
100
101 FieldFactory fieldFactory = componentProvider.newInstance(factoryClass, combinedParameters);
102 fieldFactory.setFieldValidatorFactoryFactory(fieldValidatorFactoryFactory);
103
104 return fieldFactory;
105 }
106 }