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