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.api.action.ActionExecutionException;
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.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 node.getSession().save();
93 } catch (final RepositoryException e) {
94 throw new ActionExecutionException(e);
95 }
96 callback.onSuccess(getDefinition().getName());
97
98 } else {
99
100 }
101 }
102
103 private String[] itemPropertyToArray(JcrNodeAdapter item, String propertyName) {
104 String identifiers = item.getItemProperty(propertyName).getValue().toString();
105 identifiers = StringUtils.remove(identifiers, '[');
106 identifiers = StringUtils.remove(identifiers, ']');
107 return StringUtils.split(identifiers, ',');
108 }
109
110 private void replacePropertyWithSubnode(Node node, String name, String[] ids) throws RepositoryException {
111 try {
112 node.getProperty(name).remove();
113 } catch (RepositoryException ex) {
114 log.warn("Cannot remove [" + name + "] property of the group [" + node.getName() + "]: " + ex.getMessage());
115 }
116 try {
117
118 Node subnode = NodeUtil.createPath(node, name, NodeTypes.ContentNode.NAME);
119
120 PropertyIterator pi = subnode.getProperties();
121 while (pi.hasNext()) {
122 javax.jcr.Property p = pi.nextProperty();
123 if (!p.getName().startsWith(NodeTypes.JCR_PREFIX) && !p.getName().startsWith(NodeTypes.MGNL_PREFIX)) {
124 p.remove();
125 }
126 }
127
128 int i = 0;
129 for (String id : ids) {
130 PropertyUtil.setProperty(subnode, "" + i, id.trim());
131 i++;
132 }
133 } catch (RepositoryException ex) {
134 log.error("Error saving assigned " + name + " of the [" + node.getName() + "] group.", ex);
135 throw new RepositoryException("Error saving assigned " + name + " of the [" + node.getName() + "] group.", ex);
136 }
137 }
138
139 }