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.framework.availability;
35
36 import info.magnolia.cms.security.AccessDeniedException;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.jcr.util.NodeUtil;
39 import info.magnolia.jcr.util.SessionUtil;
40 import info.magnolia.ui.api.availability.AbstractAvailabilityRule;
41 import info.magnolia.ui.vaadin.integration.jcr.JcrItemId;
42 import info.magnolia.ui.vaadin.integration.jcr.JcrPropertyItemId;
43
44 import javax.jcr.Node;
45 import javax.jcr.RepositoryException;
46
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50
51
52
53 public class IsPublishableRule extends AbstractAvailabilityRule {
54
55 private static final Logger log = LoggerFactory.getLogger(IsPublishableRule.class);
56
57 @Override
58 public boolean isAvailableForItem(Object itemId) {
59 if (itemId instanceof JcrItemId && !(itemId instanceof JcrPropertyItemId)) {
60 JcrItemId jcrItemId = (JcrItemId) itemId;
61 Node node = SessionUtil.getNodeByIdentifier(jcrItemId.getWorkspace(), jcrItemId.getUuid());
62 if (node != null) {
63 try {
64 return canBePublished(node);
65 } catch (RepositoryException e) {
66 log.warn("Error evaluating availability for node [{}], returning false: {}", NodeUtil.getPathIfPossible(node), e.getMessage());
67 }
68 }
69 }
70 return false;
71 }
72
73 private boolean canBePublished(final Node node) throws RepositoryException {
74 int level = node.getDepth();
75
76 while (level != 0) {
77 try {
78 Node ancestor = (Node) node.getAncestor(--level);
79
80 if (ancestor.getDepth() == 0) {
81 return true;
82 }
83 if (!NodeTypes.Activatable.isActivated(ancestor)) {
84 return false;
85 }
86 } catch (AccessDeniedException e) {
87 log.debug("Node {} didn't allow access to ancestors ", node.getIdentifier());
88 }
89 }
90 return true;
91 }
92 }