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.jcr.util.NodeTypes;
37 import info.magnolia.jcr.util.NodeUtil;
38 import info.magnolia.jcr.util.PropertyUtil;
39 import info.magnolia.ui.api.action.ActionExecutionException;
40 import info.magnolia.ui.dialog.action.SaveDialogAction;
41 import info.magnolia.ui.dialog.action.SaveDialogActionDefinition;
42 import info.magnolia.ui.form.EditorCallback;
43 import info.magnolia.ui.form.EditorValidator;
44 import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter;
45
46 import javax.jcr.Node;
47 import javax.jcr.PropertyIterator;
48 import javax.jcr.RepositoryException;
49
50 import org.apache.commons.lang3.StringUtils;
51
52 import com.vaadin.v7.data.Item;
53
54
55
56
57 public class SaveGroupDialogAction extends SaveDialogAction {
58
59 public SaveGroupDialogAction(SaveDialogActionDefinition definition, Item item, EditorValidator validator, EditorCallback callback) {
60 super(definition, item, validator, callback);
61 }
62
63 @Override
64 public void execute() throws ActionExecutionException {
65 if (validateForm()) {
66 final JcrNodeAdapter itemChanged = (JcrNodeAdapter) item;
67
68 try {
69 final Node node = itemChanged.applyChanges();
70
71
72 replacePropertyWithSubnode(node, "groups", itemPropertyToArray(itemChanged, "groups"));
73
74
75 replacePropertyWithSubnode(node, "roles", itemPropertyToArray(itemChanged, "roles"));
76
77
78 node.getSession().save();
79 } catch (final RepositoryException e) {
80 throw new ActionExecutionException(e);
81 }
82 callback.onSuccess(getDefinition().getName());
83 }
84 }
85
86 private String[] itemPropertyToArray(JcrNodeAdapter item, String propertyName) {
87 String identifiers = item.getItemProperty(propertyName).getValue().toString();
88 identifiers = StringUtils.remove(identifiers, '[');
89 identifiers = StringUtils.remove(identifiers, ']');
90 return StringUtils.split(identifiers, ',');
91 }
92
93 private void replacePropertyWithSubnode(Node node, String name, String[] ids) throws RepositoryException {
94 node.getProperty(name).remove();
95
96 Node subnode = NodeUtil.createPath(node, name, NodeTypes.ContentNode.NAME);
97
98 PropertyIterator pi = subnode.getProperties();
99 while (pi.hasNext()) {
100 javax.jcr.Property p = pi.nextProperty();
101 if (!p.getName().startsWith(NodeTypes.JCR_PREFIX) && !p.getName().startsWith(NodeTypes.MGNL_PREFIX)) {
102 p.remove();
103 }
104 }
105
106 int i = 0;
107 for (String id : ids) {
108 PropertyUtil.setProperty(subnode, "" + i, id.trim());
109 i++;
110 }
111 }
112
113 }