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.editor;
35
36 import info.magnolia.config.NamedDefinition;
37 import info.magnolia.ui.field.CompositeFieldDefinition;
38 import info.magnolia.ui.field.ConfiguredComplexPropertyDefinition;
39 import info.magnolia.ui.field.EditorPropertyDefinition;
40 import info.magnolia.ui.field.MultiFieldDefinition;
41 import info.magnolia.ui.framework.layout.SingleFieldLayoutProducer;
42
43 import java.util.Collections;
44 import java.util.Optional;
45 import java.util.concurrent.CompletableFuture;
46 import java.util.stream.Stream;
47
48 import javax.inject.Inject;
49 import javax.jcr.Item;
50 import javax.jcr.Property;
51
52 import com.machinezoo.noexception.Exceptions;
53
54
55
56
57 public class ByMultiValueProperties implements MultiFormView.EntryResolution<Property> {
58
59 private int lastIndex;
60
61 private final NamedDefinition propertyDefinition;
62 private final MultiFieldDefinition<Item> relatedPropertyDefinition;
63
64 @Inject
65 ByMultiValueProperties(MultiFieldDefinition<Item> relatedPropertyDefinition) {
66 this.propertyDefinition = relatedPropertyDefinition;
67 this.relatedPropertyDefinition = relatedPropertyDefinition;
68 }
69
70 @Override
71 public Stream<ComplexPropertyDefinition<Property>> resolveForRoot(Property property) {
72 Stream.Builder<ComplexPropertyDefinition<Property>> collector = Stream.builder();
73 for (; lastIndex < Exceptions.wrap().get(() -> property.getValues().length); lastIndex++) {
74 resolvePropertyDefinition(lastIndex).ifPresent(collector::add);
75 }
76 return collector.build();
77 }
78
79 @Override
80 public CompletableFuture<ComplexPropertyDefinition<Property>> pick() {
81 return CompletableFuture.completedFuture(resolvePropertyDefinition(lastIndex++).orElse(null));
82 }
83
84 private Optional<EditorDefinition<Property>> resolveEntryEditorDefinition(int index) {
85 EditorPropertyDefinition field = this.relatedPropertyDefinition.getField();
86 CompositeFieldDefinition<Property> wrapper = new CompositeFieldDefinition<>();
87 wrapper.setName(field.getName());
88 wrapper.setItemProvider(new JcrIndexedMultiPropertyValueProvider.Definition(relatedPropertyDefinition.getName(), index));
89 wrapper.setProperties(Collections.singletonList(field));
90 wrapper.setLayout(new SingleFieldLayoutProducer.Definition());
91 return Optional.of(wrapper);
92 }
93
94 private Optional<ConfiguredComplexPropertyDefinition<Property>> resolvePropertyDefinition(int index) {
95 return resolveEntryEditorDefinition(index)
96 .map(entryEditorDefinition -> {
97 ConfiguredComplexPropertyDefinition<Property> property = new ConfiguredComplexPropertyDefinition.Wrapper<>(entryEditorDefinition);
98 ItemProviderDefinition<Property, Property> indexedItemProvider = new JcrIndexedMultiPropertyValueProvider.Definition(this.propertyDefinition.getName(), index);
99 property.setItemProvider(indexedItemProvider);
100 return property;
101 }
102 );
103 }
104
105
106
107
108 public static class Definition extends MultiFormView.EntryResolution.Definition<Property> {
109
110 public Definition() {
111 setImplementationClass(ByMultiValueProperties.class);
112 }
113 }
114 }