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.app.security.dialog.field;
35
36 import info.magnolia.cms.util.QueryUtil;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.repository.RepositoryConstants;
39 import info.magnolia.ui.admincentral.field.builder.TwinColSelectFieldBuilder;
40 import info.magnolia.ui.model.field.definition.SelectFieldOptionDefinition;
41 import info.magnolia.ui.vaadin.integration.jcr.DefaultProperty;
42
43 import java.util.ArrayList;
44 import java.util.HashSet;
45 import java.util.List;
46 import java.util.Set;
47
48 import javax.jcr.Node;
49 import javax.jcr.NodeIterator;
50 import javax.jcr.Property;
51 import javax.jcr.PropertyIterator;
52 import javax.jcr.RepositoryException;
53
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57 import com.vaadin.data.Item;
58 import com.vaadin.data.util.converter.Converter;
59 import com.vaadin.ui.AbstractSelect;
60 import com.vaadin.ui.TwinColSelect;
61
62
63
64
65 public class GroupManagementField extends TwinColSelectFieldBuilder<GroupManagementFieldDefinition> {
66
67
68
69
70 public static class Group {
71 public String name;
72 public String uuid;
73
74 public Group(String name, String uuid) {
75 this.name = name;
76 this.uuid = uuid;
77 }
78 }
79
80 private static final Logger log = LoggerFactory.getLogger(GroupManagementField.class);
81
82 public GroupManagementField(GroupManagementFieldDefinition definition, Item relatedFieldItem) {
83 super(definition, relatedFieldItem);
84 this.definition.setOptions(getSelectFieldOptionDefinition());
85 }
86
87 @Override
88 protected AbstractSelect buildField() {
89 super.buildField();
90 select.setMultiSelect(true);
91 select.setNullSelectionAllowed(true);
92 select.setImmediate(true);
93 return select;
94 }
95
96 @Override
97 protected AbstractSelect createSelectionField() {
98 return new TwinColSelect() {
99 @Override
100 public void setConverter(Converter<Object, ?> converter) {
101 System.out.println("Set the converter bldjad! " + converter);
102 super.setConverter(converter);
103 }
104 };
105 }
106
107
108
109
110
111 @Override
112 public List<SelectFieldOptionDefinition> getSelectFieldOptionDefinition() {
113 List<SelectFieldOptionDefinition> options = new ArrayList<SelectFieldOptionDefinition>();
114 List<Group> allGroups = getAllGroups();
115 Set<String> assignedGroups = getAssignedGroups();
116 String currentUUID = null;
117 try {
118 currentUUID = getRelatedNode(item).getIdentifier();
119 } catch (RepositoryException e) {
120
121 }
122 for (Group group : allGroups) {
123 SelectFieldOptionDefinition option = new SelectFieldOptionDefinition();
124 option.setValue(group.uuid);
125 option.setLabel(group.name);
126 if (assignedGroups.contains(group.uuid)) {
127 option.setSelected(true);
128 }
129 if (!group.uuid.equals(currentUUID)) {
130
131 options.add(option);
132 }
133 }
134 return options;
135 }
136
137 private List<Group> getAllGroups() {
138 List<Group> groups = new ArrayList<Group>();
139 try {
140 NodeIterator ni = QueryUtil.search(RepositoryConstants.USER_GROUPS, "SELECT * FROM [" + NodeTypes.Group.NAME + "] ORDER BY name()");
141
142 while (ni.hasNext()) {
143 Node n = ni.nextNode();
144 String name = n.getName();
145 String uuid = n.getIdentifier();
146 groups.add(new Group(name, uuid));
147 }
148 } catch (RepositoryException e) {
149 log.error("Cannot read groups from the [" + RepositoryConstants.USER_GROUPS + "] workspace.", e);
150 }
151 return groups;
152 }
153
154 private Set<String> getAssignedGroups() {
155 Set<String> groups = new HashSet<String>();
156 Node mainNode = getRelatedNode(item);
157 try {
158 if (mainNode.hasNode("groups")) {
159 Node groupsNode = mainNode.getNode("groups");
160 if (groupsNode == null) {
161
162 return groups;
163 }
164 PropertyIterator pi = groupsNode.getProperties();
165 while (pi.hasNext()) {
166 Property p = pi.nextProperty();
167 if (!p.getName().startsWith(NodeTypes.JCR_PREFIX)) {
168
169 groups.add(p.getString());
170 }
171 }
172 }
173 } catch (RepositoryException re) {
174 log.error("Cannot read assigned groups of the node [" + mainNode + "].", re);
175 }
176 return groups;
177 }
178
179 @Override
180 public com.vaadin.data.Property<?> getOrCreateProperty() {
181 DefaultProperty<Set> prop = new DefaultProperty<Set>("groups", Set.class, getAssignedGroups());
182 item.addItemProperty("groups", prop);
183 return prop;
184 }
185 }