1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.kuali.rice.kim.impl.jaxb;
20
21 import static org.kuali.rice.core.api.criteria.PredicateFactory.equal;
22
23 import java.io.Serializable;
24 import java.util.ArrayList;
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Set;
28
29 import javax.xml.bind.Marshaller;
30 import javax.xml.bind.UnmarshalException;
31 import javax.xml.bind.Unmarshaller;
32 import javax.xml.bind.annotation.XmlAccessType;
33 import javax.xml.bind.annotation.XmlAccessorType;
34 import javax.xml.bind.annotation.XmlElement;
35 import javax.xml.bind.annotation.XmlTransient;
36 import javax.xml.bind.annotation.XmlType;
37
38 import org.kuali.rice.core.api.criteria.QueryByCriteria;
39 import org.kuali.rice.core.util.jaxb.RiceXmlExportList;
40 import org.kuali.rice.core.util.jaxb.RiceXmlImportList;
41 import org.kuali.rice.core.util.jaxb.RiceXmlListAdditionListener;
42 import org.kuali.rice.core.util.jaxb.RiceXmlListGetterListener;
43 import org.kuali.rice.kim.api.role.RoleMember;
44 import org.kuali.rice.kim.api.role.RoleMemberContract;
45 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
46
47
48
49
50
51
52
53 @XmlTransient
54 public abstract class RoleMembersXmlDTO<T extends RoleMemberXmlDTO> implements RiceXmlListAdditionListener<T>, Serializable {
55
56 private static final long serialVersionUID = 1L;
57
58 public abstract List<T> getRoleMembers();
59
60 public abstract void setRoleMembers(List<T> roleMembers);
61
62 void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException {
63 setRoleMembers(new RiceXmlImportList<T>(this));
64 }
65
66 void afterUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException {
67 setRoleMembers(null);
68 }
69
70
71
72
73
74
75
76
77 @XmlAccessorType(XmlAccessType.FIELD)
78 @XmlType(name="StandaloneRoleMembersType", propOrder={"roleMembers"})
79 public static class OutsideOfRole extends RoleMembersXmlDTO<RoleMemberXmlDTO.OutsideOfRole> {
80
81 private static final long serialVersionUID = 1L;
82
83 @XmlElement(name="roleMember")
84 private List<RoleMemberXmlDTO.OutsideOfRole> roleMembers;
85
86
87
88
89 @Override
90 public List<RoleMemberXmlDTO.OutsideOfRole> getRoleMembers() {
91 return this.roleMembers;
92 }
93
94
95
96
97 @Override
98 public void setRoleMembers(List<RoleMemberXmlDTO.OutsideOfRole> roleMembers) {
99 this.roleMembers = roleMembers;
100 }
101
102
103
104
105 @Override
106 public void newItemAdded(RoleMemberXmlDTO.OutsideOfRole item) {
107 try {
108 RoleXmlUtil.validateAndPersistNewRoleMember(item);
109 } catch (UnmarshalException e) {
110 throw new RuntimeException(e);
111 }
112 }
113 }
114
115
116
117
118
119
120
121
122 @XmlAccessorType(XmlAccessType.FIELD)
123 @XmlType(name="RoleMembersType", propOrder={"roleMembers"})
124 public static class WithinRole extends RoleMembersXmlDTO<RoleMemberXmlDTO.WithinRole>
125 implements RiceXmlListGetterListener<RoleMemberXmlDTO.WithinRole,String> {
126
127 private static final long serialVersionUID = 1L;
128
129 @XmlElement(name="roleMember")
130 private List<RoleMemberXmlDTO.WithinRole> roleMembers;
131
132 @XmlTransient
133 private String roleId;
134
135 @XmlTransient
136 private Set<String> existingRoleMemberIds;
137
138 public WithinRole() {}
139
140 public WithinRole(String roleId) {
141 this.roleId = roleId;
142 }
143
144
145
146
147 @Override
148 public List<org.kuali.rice.kim.impl.jaxb.RoleMemberXmlDTO.WithinRole> getRoleMembers() {
149 return this.roleMembers;
150 }
151
152
153
154
155 @Override
156 public void setRoleMembers(List<org.kuali.rice.kim.impl.jaxb.RoleMemberXmlDTO.WithinRole> roleMembers) {
157 this.roleMembers = roleMembers;
158 }
159
160
161
162
163 public String getRoleId() {
164 return this.roleId;
165 }
166
167
168
169
170 @Override
171 void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException {
172 if (parent instanceof RoleXmlDTO) {
173
174 RoleXmlDTO parentRole = (RoleXmlDTO) parent;
175 if (!parentRole.isAlreadyPersisted()) {
176 RoleXmlUtil.validateAndPersistNewRole(parentRole);
177 }
178 roleId = parentRole.getRoleId();
179 }
180 existingRoleMemberIds = new HashSet<String>();
181 super.beforeUnmarshal(unmarshaller, parent);
182 }
183
184
185
186
187
188
189 @Override
190 void afterUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException {
191 super.afterUnmarshal(unmarshaller, parent);
192 if (parent instanceof RoleXmlDTO) {
193 ((RoleXmlDTO)parent).setExistingRoleMemberIds(existingRoleMemberIds);
194 }
195 existingRoleMemberIds = null;
196 }
197
198
199
200
201 @Override
202 public void newItemAdded(org.kuali.rice.kim.impl.jaxb.RoleMemberXmlDTO.WithinRole item) {
203
204 try {
205 existingRoleMemberIds.add(RoleXmlUtil.validateAndPersistNewRoleMember(item));
206 } catch (UnmarshalException e) {
207 throw new RuntimeException(e);
208 }
209 }
210
211 void beforeMarshal(Marshaller marshaller) {
212 List<RoleMember> tempMembers = KimApiServiceLocator.getRoleService().findRoleMembers(
213 QueryByCriteria.Builder.fromPredicates(equal("roleId", roleId))).getResults();
214 if (tempMembers != null && !tempMembers.isEmpty()) {
215 List<String> roleMemberIds = new ArrayList<String>();
216
217 for (RoleMemberContract tempMember : tempMembers) {
218 if (tempMember.isActive(null)) {
219 roleMemberIds.add(tempMember.getId());
220 }
221 }
222
223 if (!roleMemberIds.isEmpty()) {
224 setRoleMembers(new RiceXmlExportList<RoleMemberXmlDTO.WithinRole,String>(roleMemberIds, this));
225 }
226 }
227 }
228
229 void afterMarshal(Marshaller marshaller) {
230 setRoleMembers(null);
231 }
232
233
234
235
236 @Override
237 public RoleMemberXmlDTO.WithinRole gettingNextItem(String nextItem, int index) {
238 return new RoleMemberXmlDTO.WithinRole(KimApiServiceLocator.getRoleService().findRoleMembers(QueryByCriteria.Builder.fromPredicates(equal("roleMemberId", nextItem))).getResults().get(0), false);
239 }
240 }
241 }