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.datasource.jcr;
35
36 import static info.magnolia.ui.datasource.jcr.JcrDatasource.TMP_DELETED_NODE;
37
38 import info.magnolia.jcr.decoration.ContentDecoratorNodeWrapper;
39 import info.magnolia.jcr.util.NodeTypes;
40 import info.magnolia.jcr.util.NodeUtil;
41
42 import javax.jcr.ItemNotFoundException;
43 import javax.jcr.Node;
44 import javax.jcr.RepositoryException;
45 import javax.jcr.Session;
46
47 import com.machinezoo.noexception.Exceptions;
48
49 import lombok.EqualsAndHashCode;
50
51
52
53
54
55 @EqualsAndHashCode(callSuper = false, onlyExplicitlyIncluded = true)
56 public class JcrNodeWrapper extends ContentDecoratorNodeWrapper<JcrDatasource> {
57
58 private String newNodeType;
59 private String newNodePath;
60
61 @EqualsAndHashCode.Include
62 private final String uuid;
63
64 JcrNodeWrapper(Node node, JcrDatasource contentDecorator) {
65 super(node, contentDecorator);
66 this.uuid = Exceptions.wrap().get(node::getIdentifier);
67 }
68
69 @Override
70 public Node getWrappedNode() {
71 return Exceptions.wrap().get(() -> {
72 Node node = super.getWrappedNode();
73 if (!node.getSession().isLive()) {
74 Session session = getContentDecorator().getJCRSession().getWrappedSession();
75 try {
76 node = session.getNodeByIdentifier(uuid);
77 } catch (ItemNotFoundException e) {
78 node = createNewItem(session);
79 }
80 } else {
81 node = getContentDecorator().exists(node) ? node : createNewItem(wrapped.getSession());
82 }
83 setWrappedNode(node);
84 return node;
85 });
86 }
87
88 @Override
89 public Node addNode(String relPath, String primaryNodeTypeName) throws RepositoryException {
90 JcrNodeWrapper../../../info/magnolia/ui/datasource/jcr/JcrNodeWrapper.html#JcrNodeWrapper">JcrNodeWrapper node = (JcrNodeWrapper) super.addNode(relPath, primaryNodeTypeName);
91 node.newNodeType = primaryNodeTypeName;
92 node.newNodePath = node.getPath();
93 return node;
94 }
95
96 @Override
97 public Node addNode(String relPath) throws RepositoryException {
98 return addNode(relPath, null);
99 }
100
101 @Override
102 public void remove() throws RepositoryException {
103 super.remove();
104 newNodePath = null;
105 }
106
107 @Override
108 public String toString() {
109 return Exceptions.wrap().get(this::getPath);
110 }
111
112 private Node createNewItem(Session session) throws RepositoryException {
113 Node root = session.getRootNode();
114 if (newNodePath == null) {
115 return NodeUtil.createPath(root, TMP_DELETED_NODE, NodeTypes.System.NAME);
116 } else {
117 return NodeUtil.createPath(root, newNodePath, newNodeType);
118 }
119 }
120
121 }