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.contentapp;
35
36 import info.magnolia.ui.datasource.jcr.JcrDatasource;
37 import info.magnolia.ui.datasource.ItemResolver;
38
39 import java.util.Optional;
40
41 import javax.inject.Inject;
42 import javax.jcr.Item;
43 import javax.jcr.PathNotFoundException;
44 import javax.jcr.RepositoryException;
45
46 import org.apache.commons.lang3.StringUtils;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50 import com.machinezoo.noexception.Exceptions;
51
52
53
54
55 public class JcrNodeResolver implements ItemResolver<Item> {
56
57 private static final Logger log = LoggerFactory.getLogger(JcrNodeResolver.class);
58
59 private final JcrDatasource datasource;
60
61 @Inject
62 public JcrNodeResolver(JcrDatasource datasource) {
63 this.datasource = datasource;
64 }
65
66 @Override
67 public String getId(Item node) {
68 return Optional.of(node)
69 .map(Exceptions.wrap().function(Item::getPath))
70 .filter(path -> !"/".equals(path))
71 .orElse("");
72 }
73
74 @Override
75 public Optional<Item> getItemById(String path) {
76 String slashedPath = StringUtils.appendIfMissing(path, "/");
77
78 if (!"/".equals(slashedPath)) {
79 try {
80 if (slashedPath.startsWith("/")) {
81 return Optional.of(datasource.getJCRSession().getNode(slashedPath));
82 }
83 } catch (PathNotFoundException e) {
84
85 } catch (RepositoryException e) {
86 throw new RuntimeException(String.format("Failed to resolve node by path [%s]", path), e);
87 }
88 }
89 return Optional.empty();
90 }
91 }