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.contentapp;
35
36 import info.magnolia.objectfactory.ComponentProvider;
37 import info.magnolia.objectfactory.Components;
38 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
39 import info.magnolia.ui.datasource.PropertySetFactory;
40 import info.magnolia.ui.datasource.jcr.JcrDatasourceDefinition;
41 import info.magnolia.ui.editor.FormDefinition;
42 import info.magnolia.ui.editor.JcrItemPropertySet;
43 import info.magnolia.ui.editor.JcrItemPropertySet.JcrPropertyDescriptor;
44 import info.magnolia.ui.editor.JcrItemPropertySet.JcrPropertyDescriptor.JcrPropertyDescriptorBuilder;
45 import info.magnolia.ui.field.FieldDefinition;
46 import info.magnolia.ui.field.NoopNameDecorator;
47 import info.magnolia.ui.field.WithPropertyNameDecorator;
48 import info.magnolia.ui.field.WithPropertyNameDecorator.PropertyNameDecorator;
49
50 import java.util.Collection;
51 import java.util.List;
52 import java.util.Locale;
53 import java.util.Map;
54 import java.util.stream.Collectors;
55
56 import javax.inject.Inject;
57 import javax.jcr.Item;
58
59 import com.vaadin.data.PropertySet;
60
61
62
63
64 public class JcrPropertySetFactory implements PropertySetFactory<Item> {
65
66 private final I18NAuthoringSupport<Item> localisationSupport;
67 private final ComponentProvider componentProvider;
68 private final JcrDatasourceDefinition datasourceDefinition;
69
70 @Inject
71 JcrPropertySetFactory(I18NAuthoringSupport<Item> localisationSupport, ComponentProvider componentProvider, JcrDatasourceDefinition datasourceDefinition) {
72 this.localisationSupport = localisationSupport;
73 this.componentProvider = componentProvider;
74 this.datasourceDefinition = datasourceDefinition;
75 }
76
77
78
79
80 @Deprecated
81 public JcrPropertySetFactory(I18NAuthoringSupport<Item> localisationSupport, ComponentProvider componentProvider) {
82 this(localisationSupport, componentProvider, Components.getComponent(JcrDatasourceDefinition.class));
83 }
84
85 @Override
86 public PropertySet<Item> fromFormDefinition(FormDefinition<Item> formDefinition, Locale locale) {
87 final PropertyNameDecorator propertyNameDecorator;
88 if (formDefinition instanceof WithPropertyNameDecorator) {
89 Class<? extends PropertyNameDecorator> propertyNameDecoratorType =
90 ((WithPropertyNameDecorator) formDefinition).getPropertyNameDecorator();
91
92 propertyNameDecorator = componentProvider.newInstance(propertyNameDecoratorType);
93 } else {
94 propertyNameDecorator = new NoopNameDecorator();
95 }
96
97 final List<JcrPropertyDescriptor> propertyDefinitions =
98 formDefinition.getFieldDefinitions().stream()
99 .map(fieldDefinition -> initPropertyDescriptor(locale, fieldDefinition))
100 .map(propertyDescriptorBuilder -> propertyDescriptorBuilder.propertyNameDecorator(propertyNameDecorator))
101 .map(JcrPropertyDescriptorBuilder::build)
102 .collect(Collectors.toList());
103
104 return new JcrItemPropertySet(propertyDefinitions, locale, localisationSupport, propertyNameDecorator);
105 }
106
107 @Override
108 public PropertySet<Item> withProperties(Map<String, Class> properties) {
109 final List<JcrPropertyDescriptor> propertyDescriptors = properties.entrySet().stream()
110 .map(entry -> JcrPropertyDescriptor.builder()
111 .type(entry.getValue())
112 .name(entry.getKey())
113 .nodeNameProperty(datasourceDefinition.getNodeNameProperty())
114 .build())
115 .collect(Collectors.toList());
116
117 return new JcrItemPropertySet(propertyDescriptors, localisationSupport);
118 }
119
120 @Override
121 public PropertySet<Item> fromFieldDefinitions(Collection<FieldDefinition> fieldDefinitions, Locale locale) {
122 final List<JcrPropertyDescriptor> propertyDefinitions =
123 fieldDefinitions.stream()
124 .map(fieldDefinition -> initPropertyDescriptor(locale, fieldDefinition).build())
125 .collect(Collectors.toList());
126
127 return new JcrItemPropertySet(propertyDefinitions, locale, localisationSupport);
128 }
129
130 public JcrPropertyDescriptorBuilder initPropertyDescriptor(Locale locale, FieldDefinition fieldDefinition) {
131 return JcrPropertyDescriptor
132 .builder()
133 .name(fieldDefinition.getName())
134 .type(fieldDefinition.getType())
135 .isI18n(fieldDefinition.isI18n())
136 .locale(locale)
137 .nodeNameProperty(datasourceDefinition.getNodeNameProperty())
138 .isReadonly(fieldDefinition.isReadOnly());
139 }
140 }