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