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.admincentral.dialog.action.SaveDialogAction;
40 import info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition;
41 import info.magnolia.ui.form.EditorCallback;
42 import info.magnolia.ui.form.EditorValidator;
43 import info.magnolia.ui.api.action.ActionExecutionException;
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.lang.StringUtils;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54 import com.vaadin.data.Item;
55
56
57
58
59 public class SaveGroupDialogAction extends SaveDialogAction {
60
61 private static final Logger log = LoggerFactory.getLogger(SaveGroupDialogAction.class);
62
63 public SaveGroupDialogAction(SaveDialogActionDefinition definition, Item item, EditorValidator validator, EditorCallback callback) {
64 super(definition, item, validator, callback);
65 }
66
67 @Override
68 public void execute() throws ActionExecutionException {
69
70 validator.showValidation(true);
71 if (validator.isValid()) {
72 final JcrNodeAdapter itemChanged = (JcrNodeAdapter) item;
73
74 try {
75 final Node node = itemChanged.applyChanges();
76
77
78 try {
79 replacePropertyWithSubnode(node, "groups", itemPropertyToArray(itemChanged, "groups"));
80 } catch (RepositoryException ex) {
81 log.error(ex.getMessage(), ex);
82 throw new ActionExecutionException(ex.getMessage(), ex);
83 }
84
85 try {
86 replacePropertyWithSubnode(node, "roles", itemPropertyToArray(itemChanged, "roles"));
87 } catch (RepositoryException ex) {
88 log.error(ex.getMessage(), ex);
89 throw new ActionExecutionException(ex.getMessage(), ex);
90 }
91
92 NodeTypes.LastModified.update(node);
93 node.getSession().save();
94 } catch (final RepositoryException e) {
95 throw new ActionExecutionException(e);
96 }
97 callback.onSuccess(getDefinition().getName());
98
99 } else {
100
101 }
102 }
103
104 private String[] itemPropertyToArray(JcrNodeAdapter item, String propertyName) {
105 String identifiers = item.getItemProperty(propertyName).getValue().toString();
106 identifiers = StringUtils.remove(identifiers, '[');
107 identifiers = StringUtils.remove(identifiers, ']');
108 return StringUtils.split(identifiers, ',');
109 }
110
111 private void replacePropertyWithSubnode(Node node, String name, String[] ids) throws RepositoryException {
112 try {
113 node.getProperty(name).remove();
114 } catch (RepositoryException ex) {
115 log.warn("Cannot remove [" + name + "] property of the group [" + node.getName() + "]: " + ex.getMessage());
116 }
117 try {
118
119 Node subnode = NodeUtil.createPath(node, name, NodeTypes.ContentNode.NAME);
120
121 PropertyIterator pi = subnode.getProperties();
122 while (pi.hasNext()) {
123 javax.jcr.Property p = pi.nextProperty();
124 if (!p.getName().startsWith(NodeTypes.JCR_PREFIX)) {
125 p.remove();
126 }
127 }
128
129 int i = 0;
130 for (String id : ids) {
131 PropertyUtil.setProperty(subnode, "" + i, id.trim());
132 i++;
133 }
134 } catch (RepositoryException ex) {
135 log.error("Error saving assigned " + name + " of the [" + node.getName() + "] group.", ex);
136 throw new RepositoryException("Error saving assigned " + name + " of the [" + node.getName() + "] group.", ex);
137 }
138 }
139
140 }