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.templating.elements.attribute;
35
36 import info.magnolia.jcr.RuntimeRepositoryException;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.jcr.util.NodeUtil;
39 import info.magnolia.rendering.template.AreaDefinition;
40 import info.magnolia.templating.elements.AreaElement;
41
42 import java.util.Optional;
43
44 import javax.jcr.Node;
45 import javax.jcr.RepositoryException;
46
47
48
49
50 public class ShowAddButton implements ElementAttribute<AreaElement> {
51
52 @Override
53 public Optional<String> getValue(AreaElement element) {
54 return Optional.of(shouldShowAddButton(element))
55 .map(Object::toString);
56 }
57
58 private boolean shouldShowAddButton(AreaElement element) {
59 return element.getContent() != null &&
60 !element.getType().equals(AreaDefinition.TYPE_NO_COMPONENT) &&
61 (!element.getType().equals(AreaDefinition.TYPE_SINGLE) || !hasComponents(element.getContent())) && numberOfComponents(element.getContent()) < element.getMaxComponents();
62 }
63
64 boolean hasComponents(Node parent) {
65 try {
66 return NodeUtil.getNodes(parent, NodeTypes.Component.NAME).iterator().hasNext();
67 } catch (RepositoryException e) {
68 throw new RuntimeRepositoryException(e);
69 }
70 }
71
72 private int numberOfComponents(Node parent) {
73 try {
74 return NodeUtil.asList(NodeUtil.getNodes(parent, NodeTypes.Component.NAME)).size();
75 } catch (RepositoryException e) {
76 throw new RuntimeRepositoryException(e);
77 }
78 }
79 }