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.framework.action;
35
36 import info.magnolia.cms.core.Path;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.event.EventBus;
39 import info.magnolia.jcr.util.NodeTypes;
40 import info.magnolia.jcr.util.NodeUtil;
41 import info.magnolia.repository.RepositoryConstants;
42 import info.magnolia.ui.api.event.AdmincentralEventBus;
43 import info.magnolia.ui.vaadin.integration.jcr.JcrItemAdapter;
44 import info.magnolia.ui.vaadin.integration.jcr.JcrItemUtil;
45
46 import javax.inject.Named;
47 import javax.jcr.Item;
48 import javax.jcr.Node;
49 import javax.jcr.NodeIterator;
50 import javax.jcr.RepositoryException;
51
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55
56
57
58
59
60 public class DuplicateNodeAction extends AbstractRepositoryAction<DuplicateNodeActionDefinition> {
61
62 private static final Logger log = LoggerFactory.getLogger(DuplicateNodeAction.class);
63
64 public DuplicateNodeAction(DuplicateNodeActionDefinition definition, JcrItemAdapter item, @Named(AdmincentralEventBus.NAME) EventBus eventBus) {
65 super(definition, item, eventBus);
66 }
67
68 @Override
69 protected void onExecute(JcrItemAdapter item) throws RepositoryException {
70 Item jcrItem = item.getJcrItem();
71 if (jcrItem.isNode()) {
72 Node node = (Node) jcrItem;
73 Node parentNode = node.getParent();
74
75
76 String newName = getUniqueNewItemName(parentNode, node.getName());
77 String newPath = Path.getAbsolutePath(parentNode.getPath(), newName);
78
79
80 node.getSession().getWorkspace().copy(node.getPath(), newPath);
81
82
83 Node duplicateNode = node.getSession().getNode(newPath);
84
85 activatableUpdate(duplicateNode, MgnlContext.getUser().getName());
86
87 setItemIdOfChangedItem(JcrItemUtil.getItemId(duplicateNode));
88
89 log.debug("Created a copy of {} with new path {}", node.getPath(), newPath);
90 }
91 }
92
93 private void activatableUpdate(Node node, String userName) throws RepositoryException {
94 if (NodeUtil.isNodeType(node, NodeTypes.Activatable.NAME) ||
95 (RepositoryConstants.CONFIG.equals(node.getSession().getWorkspace().getName()) && NodeUtil.isNodeType(node, NodeTypes.ContentNode.NAME))) {
96 NodeTypes.Activatable.update(node, userName, false);
97 }
98
99 NodeIterator nodeIterator = node.getNodes();
100 while (nodeIterator.hasNext()) {
101 activatableUpdate(nodeIterator.nextNode(), userName);
102 }
103 }
104 }