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.action;
35
36 import info.magnolia.jcr.util.NodeNameHelper;
37 import info.magnolia.jcr.util.NodeUtil;
38 import info.magnolia.jcr.util.PropertyUtil;
39 import info.magnolia.ui.api.action.AbstractAction;
40 import info.magnolia.ui.api.action.ActionExecutionException;
41 import info.magnolia.ui.contentapp.browser.context.ValueContext;
42 import info.magnolia.ui.datasource.jcr.SupportsRenaming;
43 import info.magnolia.ui.framework.datasource.components.SelectedItems;
44
45 import java.util.Objects;
46
47 import javax.inject.Inject;
48 import javax.jcr.Item;
49 import javax.jcr.Node;
50 import javax.jcr.Property;
51 import javax.jcr.RepositoryException;
52 import javax.jcr.Session;
53
54
55
56
57
58
59 public class SaveSessionAction extends AbstractAction<SaveSessionActionDefinition> {
60
61 private final Item jcrItem;
62 private final NodeNameHelper nodeNameHelper;
63
64 @Inject
65 public SaveSessionAction(SaveSessionActionDefinition definition, ValueContext<Item> valueContext, NodeNameHelper nodeNameHelper) {
66 super(definition);
67 this.jcrItem = valueContext.current().value().flatMap(SelectedItems::getFirst).orElse(null);
68 this.nodeNameHelper = nodeNameHelper;
69 }
70
71 @Override
72 public void execute() throws ActionExecutionException {
73 if (jcrItem == null) {
74 return;
75 }
76
77 try {
78 final Session session = jcrItem.getSession();
79 handleJcrItemNameChange();
80 session.save();
81 } catch (RepositoryException e) {
82 throw new ActionExecutionException("Failed to handle JCR item change saving...", e);
83 }
84 }
85
86 private void handleJcrItemNameChange() throws RepositoryException {
87 if (jcrItem instanceof SupportsRenaming) {
88 final String pendingNewName = ((SupportsRenaming) jcrItem).getPendingNewName().orElse(null);
89 if (pendingNewName != null && !Objects.equals(pendingNewName, jcrItem.getName())) {
90 final String sanitisedNewName = this.nodeNameHelper.getUniqueName(jcrItem.getParent(), pendingNewName);
91 if (jcrItem.isNode()) {
92 NodeUtil.renameNode((Node) jcrItem, sanitisedNewName);
93 } else {
94 PropertyUtil.renameProperty((Property) jcrItem, sanitisedNewName);
95 }
96 }
97 }
98 }
99 }