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.jcr.RuntimeRepositoryException;
37 import info.magnolia.jcr.util.NodeNameHelper;
38 import info.magnolia.jcr.util.NodeUtil;
39 import info.magnolia.ui.contentapp.detail.ContentDetailSubApp;
40 import info.magnolia.ui.editor.JcrNodeFromLocationResolutionDefinition;
41 import info.magnolia.ui.datasource.jcr.JcrDatasource;
42 import info.magnolia.ui.editor.ItemProviderStrategy;
43 import info.magnolia.ui.datasource.ItemResolver;
44 import info.magnolia.ui.contentapp.version.VersionResolver;
45
46 import java.util.Optional;
47
48 import javax.inject.Inject;
49 import javax.jcr.Node;
50 import javax.jcr.RepositoryException;
51 import javax.jcr.Session;
52
53
54
55
56
57 public class ResolveJcrNodeFromLocationContext implements ItemProviderStrategy<Node, ContentDetailSubApp.DetailLocation> {
58
59 private final JcrNodeFromLocationResolutionDefinition definition;
60 private final ItemResolver<Node> itemResolver;
61 private final VersionResolver<Node> versionResolver;
62 private final JcrDatasource datasource;
63 private final NodeNameHelper nodeNameHelper;
64
65 @Inject
66 public ResolveJcrNodeFromLocationContext(
67 JcrNodeFromLocationResolutionDefinition definition,
68 JcrDatasource datasource,
69 ItemResolver<Node> itemResolver,
70 VersionResolver<Node> versionResolver,
71 NodeNameHelper nodeNameHelper) {
72 this.definition = definition;
73 this.datasource = datasource;
74 this.itemResolver = itemResolver;
75 this.versionResolver = versionResolver;
76 this.nodeNameHelper = nodeNameHelper;
77 }
78
79 @Override
80 public Optional<Node> read(ContentDetailSubApp.DetailLocation location) {
81 return resolveNode(location);
82 }
83
84 private Optional<Node> resolveNode(ContentDetailSubApp.DetailLocation location) {
85 final String nodePath = location.getNodePath();
86 final String viewType = location.getViewType();
87
88 switch (viewType) {
89 case "add":
90 return Optional.ofNullable(createNewNode(nodePath));
91 case "version":
92 return versionResolver.getVersion(nodePath, location.getVersion());
93 case "edit":
94 case "view":
95 default:
96 return itemResolver.getItemById(nodePath);
97 }
98 }
99
100 private Node createNewNode(String path) {
101 final Session jcrSession;
102 try {
103 jcrSession = datasource.getJCRSession();
104 Node parent = jcrSession.getNode(path);
105 String name = nodeNameHelper.getUniqueName(parent, nodeNameHelper.getValidatedName(null));
106 return NodeUtil.createPath(parent, name, definition.getNodeType());
107 } catch (RepositoryException e) {
108 throw new RuntimeRepositoryException(e);
109 }
110 }
111 }