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