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