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.config.registry.DefinitionProvider;
37 import info.magnolia.config.registry.Registry;
38 import info.magnolia.config.registry.RegistryFacade;
39 import info.magnolia.jcr.util.NodeUtil;
40 import info.magnolia.jcr.util.SessionUtil;
41 import info.magnolia.ui.api.availability.AbstractAvailabilityRule;
42 import info.magnolia.ui.vaadin.integration.jcr.JcrItemId;
43 import info.magnolia.ui.vaadin.integration.jcr.JcrPropertyItemId;
44
45 import java.util.Collection;
46
47 import javax.inject.Inject;
48 import javax.jcr.Node;
49
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53
54
55
56 public class IsDefinitionRule extends AbstractAvailabilityRule {
57
58 private static final Logger log = LoggerFactory.getLogger(IsDefinitionRule.class);
59
60 private final Collection<Registry> registries;
61
62 @Inject
63 public IsDefinitionRule(RegistryFacade registryFacade) {
64 this.registries = registryFacade.all();
65 }
66
67 @Override
68 protected boolean isAvailableForItem(Object itemId) {
69 if (itemId instanceof JcrItemId && !(itemId instanceof JcrPropertyItemId)) {
70 JcrItemId jcrItemId = (JcrItemId) itemId;
71 Node node = SessionUtil.getNodeByIdentifier(jcrItemId.getWorkspace(), jcrItemId.getUuid());
72 if (node != null) {
73 try {
74 String nodePath = node.getPath();
75 return hasDefinitionFor(nodePath);
76 } catch (Exception e) {
77 log.warn("Error evaluating availability for node [{}], returning false: {}", NodeUtil.getPathIfPossible(node), e.getMessage());
78 }
79 }
80 }
81 return false;
82 }
83
84 @SuppressWarnings("unchecked")
85 private boolean hasDefinitionFor(String nodePath) {
86
87 for (Registry registry : registries) {
88 Collection<DefinitionProvider> providers = registry.getAllProviders();
89 for (DefinitionProvider provider : providers) {
90 if (provider.getMetadata().getLocation().equals(nodePath)) {
91 return true;
92 }
93 }
94 }
95 return false;
96 }
97 }