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 static info.magnolia.ui.contentapp.detail.ContentDetailSubApp.LocationContext;
37
38 import info.magnolia.context.Context;
39 import info.magnolia.jcr.util.NodeUtil;
40 import info.magnolia.ui.contentapp.detail.ContentDetailSubApp;
41 import info.magnolia.ui.databinding.JcrNodeFromLocationResolutionDefinition;
42 import info.magnolia.ui.framework.databinding.ItemProviderStrategy;
43 import info.magnolia.ui.framework.datasource.DatasourceComponent;
44 import info.magnolia.ui.framework.datasource.components.ItemResolver;
45
46 import java.util.Optional;
47
48 import javax.inject.Provider;
49 import javax.jcr.Node;
50 import javax.jcr.Session;
51
52 import lombok.SneakyThrows;
53
54
55
56
57
58 public class ResolveJcrNodeFromLocationContext implements ItemProviderStrategy<Node> {
59
60 private final JcrNodeFromLocationResolutionDefinition definition;
61 private final LocationContext locationContext;
62 private final Provider<Context> contextProvider;
63 private final ItemResolver<Node> itemResolver;
64
65 public ResolveJcrNodeFromLocationContext(
66 JcrNodeFromLocationResolutionDefinition definition,
67 LocationContext locationContext,
68 Provider<Context> contextProvider,
69 @DatasourceComponent ItemResolver<Node> itemResolver) {
70 this.definition = definition;
71 this.locationContext = locationContext;
72 this.contextProvider = contextProvider;
73 this.itemResolver = itemResolver;
74 }
75
76 @Override
77 public Optional<Node> read() {
78 return locationContext.location()
79 .value()
80 .flatMap(this::resolveNode);
81 }
82
83 private Optional<Node> resolveNode(ContentDetailSubApp.DetailLocation location) {
84 final String nodePath = location.getNodePath();
85 final String viewType = location.getViewType();
86
87 switch (viewType) {
88 case "add":
89 return Optional.ofNullable(this.createNode(String.format("%s/%s", nodePath, "untitled")));
90 case "edit": case "view":
91 return itemResolver.getItemByPath(nodePath);
92 default:
93 return Optional.empty();
94 }
95 }
96
97 @SneakyThrows
98 private Node createNode(String path) {
99 final Session jcrSession = this.contextProvider.get().getJCRSession(this.definition.getWorkspace());
100 return NodeUtil.createPath(jcrSession.getRootNode(), path, definition.getNodeType());
101 }
102 }