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.definition.migration;
35
36 import info.magnolia.ui.editor.ByLexicographicallyIndexedChildNodes;
37 import info.magnolia.ui.editor.CurrentItemProviderDefinition;
38 import info.magnolia.ui.editor.JcrChildNodeProviderDefinition;
39 import info.magnolia.ui.editor.JcrPropertyProvider;
40 import info.magnolia.ui.editor.LexicographicallyIndexedJcrNodeOrderHandler;
41 import info.magnolia.ui.editor.MultiFieldEntryResolution;
42 import info.magnolia.ui.field.AlwaysEmptyPrefixNameDecorator;
43 import info.magnolia.ui.field.CompositeFieldDefinition;
44 import info.magnolia.ui.field.ConfiguredSwitchableFieldDefinition;
45 import info.magnolia.ui.field.EditorPropertyDefinition;
46 import info.magnolia.ui.field.JcrMultiFieldDefinition;
47 import info.magnolia.ui.field.JcrMultiValueFieldDefinition;
48 import info.magnolia.ui.field.MultiFieldDefinition;
49 import info.magnolia.ui.field.NoopNameDecorator;
50 import info.magnolia.ui.form.definition.DefinitionConverter;
51 import info.magnolia.ui.form.field.definition.MultiValueFieldDefinition;
52 import info.magnolia.ui.form.field.transformer.composite.DelegatingCompositeFieldTransformer;
53 import info.magnolia.ui.form.field.transformer.composite.NoOpCompositeTransformer;
54 import info.magnolia.ui.form.field.transformer.multi.DelegatingMultiValueFieldTransformer;
55 import info.magnolia.ui.form.field.transformer.multi.DelegatingMultiValueSubnodeTransformer;
56 import info.magnolia.ui.form.field.transformer.multi.MultiValueSubChildrenNodePropertiesTransformer;
57 import info.magnolia.ui.form.field.transformer.multi.MultiValueTransformer;
58
59 import java.util.ArrayList;
60 import java.util.List;
61 import java.util.Optional;
62
63 import javax.jcr.Node;
64
65
66
67
68
69 public class MultiValueFieldDefinitionConverter extends AbstractComplexFieldDefinitionConverter<Node, MultiFieldDefinition<Node>, MultiValueFieldDefinition> {
70
71 public MultiFieldDefinition<Node> convert(MultiValueFieldDefinition oldDefinition) {
72 MultiFieldDefinition newDefinition = super.convert(oldDefinition);
73
74 Optional.ofNullable(oldDefinition.getField())
75 .filter(info.magnolia.ui.form.field.definition.CompositeFieldDefinition.class::isInstance)
76 .map(info.magnolia.ui.form.field.definition.CompositeFieldDefinition.class::cast)
77 .map(info.magnolia.ui.form.field.definition.CompositeFieldDefinition::getTransformerClass)
78 .filter(NoOpCompositeTransformer.class::equals)
79 .ifPresent(noop -> oldDefinition.getField().setTransformerClass(DelegatingCompositeFieldTransformer.class));
80
81 final EditorPropertyDefinition field = DefinitionConverter.FIELD.convert(oldDefinition.getField());
82 if (newDefinition instanceof JcrMultiValueFieldDefinition) {
83 final JcrPropertyProvider.Definition definition = new JcrPropertyProvider.Definition(oldDefinition.getName());
84 definition.setMultiple(true);
85 newDefinition.setItemProvider(definition);
86 newDefinition.setField(field);
87 ((JcrMultiValueFieldDefinition) newDefinition).init();
88 } else {
89 List<EditorPropertyDefinition> properties = new ArrayList<>();
90 properties.add(field);
91 CompositeFieldDefinition<Object> compositeFieldDefinition = new CompositeFieldDefinition<>();
92 final JcrChildNodeProviderDefinition providerDefinition = new JcrChildNodeProviderDefinition();
93 providerDefinition.setNodeName(oldDefinition.getName());
94 compositeFieldDefinition.setName(oldDefinition.getName());
95 compositeFieldDefinition.setProperties(properties);
96 newDefinition.setField(compositeFieldDefinition);
97 convertTransformerStrategy(oldDefinition, newDefinition);
98 }
99 return newDefinition;
100 }
101
102 @Override
103 MultiFieldDefinition createNewDefinition(MultiValueFieldDefinition oldDefinition) {
104 return oldDefinition.getTransformerClass().equals(MultiValueTransformer.class) ? new JcrMultiValueFieldDefinition() : new JcrMultiFieldDefinition();
105 }
106
107 private void convertTransformerStrategy(info.magnolia.ui.form.field.definition.MultiValueFieldDefinition oldDefinition, MultiFieldDefinition<Node> newDefinition) {
108 if (oldDefinition.getTransformerClass().equals(DelegatingMultiValueFieldTransformer.class)) {
109 newDefinition.setItemProvider(new CurrentItemProviderDefinition<>());
110 }
111 if (oldDefinition.getTransformerClass().equals(DelegatingMultiValueSubnodeTransformer.class)) {
112 JcrChildNodeProviderDefinition providerDefinition = new JcrChildNodeProviderDefinition();
113 providerDefinition.setSupportI18N(false);
114 newDefinition.setItemProvider(providerDefinition);
115 MultiFieldEntryResolution.Definition entryResolution = new MultiFieldEntryResolution.Definition();
116 entryResolution.setPropertyNameDecorator(AlwaysEmptyPrefixNameDecorator.class);
117 newDefinition.setEntryResolution(entryResolution);
118 }
119 if (oldDefinition.getTransformerClass().equals(MultiValueSubChildrenNodePropertiesTransformer.class)) {
120 JcrChildNodeProviderDefinition providerDefinition = new JcrChildNodeProviderDefinition();
121 providerDefinition.setSupportI18N(false);
122 newDefinition.setItemProvider(providerDefinition);
123 newDefinition.setEntryResolution(new ByLexicographicallyIndexedChildNodes.Definition());
124 newDefinition.setOrderHandler(new LexicographicallyIndexedJcrNodeOrderHandler.Definition());
125 Optional.ofNullable(newDefinition.getField())
126 .filter(CompositeFieldDefinition.class::isInstance)
127 .map(CompositeFieldDefinition.class::cast)
128 .map(CompositeFieldDefinition::getProperties)
129 .filter(properties -> !properties.isEmpty())
130 .map(properties -> properties.get(0))
131 .filter(ConfiguredSwitchableFieldDefinition.class::isInstance)
132 .map(ConfiguredSwitchableFieldDefinition.class::cast)
133 .ifPresent(switchable -> switchable.setPropertyNameDecorator(NoopNameDecorator.class));
134 }
135 }
136
137 @Override
138 protected boolean supportsTransformerClass(Class transformerClass) {
139 return transformerClass.equals(MultiValueTransformer.class) ||
140 transformerClass.equals(DelegatingMultiValueFieldTransformer.class) ||
141 transformerClass.equals(DelegatingMultiValueSubnodeTransformer.class) ||
142 transformerClass.equals(MultiValueSubChildrenNodePropertiesTransformer.class);
143 }
144 }