001 /**
002 * Copyright 2005-2011 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kim.api.role;
017
018 import org.apache.commons.collections.CollectionUtils;
019 import org.apache.commons.lang.StringUtils;
020 import org.apache.commons.lang.builder.EqualsBuilder;
021 import org.apache.commons.lang.builder.HashCodeBuilder;
022 import org.apache.commons.lang.builder.ToStringBuilder;
023 import org.kuali.rice.core.api.CoreConstants;
024 import org.kuali.rice.core.api.membership.MemberType;
025 import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
026 import org.kuali.rice.core.api.mo.ModelBuilder;
027 import org.kuali.rice.core.api.mo.ModelObjectComplete;
028 import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter;
029 import org.kuali.rice.kim.api.KimConstants;
030 import org.kuali.rice.kim.api.common.delegate.DelegateType;
031 import org.kuali.rice.kim.api.common.delegate.DelegateTypeContract;
032 import org.w3c.dom.Element;
033
034 import javax.xml.bind.annotation.XmlAccessType;
035 import javax.xml.bind.annotation.XmlAccessorType;
036 import javax.xml.bind.annotation.XmlAnyElement;
037 import javax.xml.bind.annotation.XmlElement;
038 import javax.xml.bind.annotation.XmlRootElement;
039 import javax.xml.bind.annotation.XmlType;
040 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
041 import java.util.ArrayList;
042 import java.util.Collection;
043 import java.util.Collections;
044 import java.util.List;
045 import java.util.Map;
046
047 @XmlRootElement(name = RoleMembership.Constants.ROOT_ELEMENT_NAME)
048 @XmlAccessorType(XmlAccessType.NONE)
049 @XmlType(name = RoleMembership.Constants.TYPE_NAME, propOrder = {
050 RoleMembership.Elements.ROLE_ID,
051 RoleMembership.Elements.ROLE_MEMBER_ID,
052 RoleMembership.Elements.EMBEDDED_ROLE_ID,
053 RoleMembership.Elements.MEMBER_ID,
054 RoleMembership.Elements.MEMBER_TYPE_CODE,
055 RoleMembership.Elements.ROLE_SORTING_CODE,
056 RoleMembership.Elements.QUALIFIER,
057 RoleMembership.Elements.DELEGATES,
058 CoreConstants.CommonElements.FUTURE_ELEMENTS
059 })
060 public class RoleMembership extends AbstractDataTransferObject implements RoleMembershipContract {
061 private static final long serialVersionUID = 1L;
062
063 @XmlElement(name=Elements.ROLE_ID)
064 private final String roleId;
065
066 @XmlElement(name=Elements.ROLE_MEMBER_ID)
067 private final String roleMemberId;
068
069 @XmlElement(name=Elements.EMBEDDED_ROLE_ID)
070 private final String embeddedRoleId;
071
072 @XmlElement(name=Elements.MEMBER_ID, required = true)
073 private final String memberId;
074
075 @XmlElement(name=Elements.MEMBER_TYPE_CODE, required = true)
076 private final String memberTypeCode;
077
078 @XmlElement(name=Elements.ROLE_SORTING_CODE)
079 private final String roleSortingCode;
080
081 @XmlElement(name=Elements.QUALIFIER)
082 @XmlJavaTypeAdapter(value = MapStringStringAdapter.class)
083 private final Map<String, String> qualifier;
084
085 @XmlElement(name=Elements.DELEGATES)
086 private final List<DelegateType> delegates;
087
088 @SuppressWarnings("unused")
089 @XmlAnyElement
090 private final Collection<Element> _futureElements = null;
091
092 /**
093 * Private constructor for JAXB only
094 */
095 @SuppressWarnings("unused")
096 private RoleMembership() {
097 roleId = null;
098 roleMemberId = null;
099 embeddedRoleId = null;
100 memberId = null;
101 memberTypeCode = null;
102 roleSortingCode = null;
103 qualifier = null;
104 delegates = null;
105 }
106
107 private RoleMembership(Builder b) {
108 roleId = b.getRoleId();
109 roleMemberId = b.getRoleMemberId();
110 embeddedRoleId = b.getEmbeddedRoleId();
111 memberId = b.getMemberId();
112 memberTypeCode = b.getMemberType().getCode();
113 roleSortingCode = b.getRoleSortingCode();
114 qualifier = b.getQualifier();
115
116 delegates = new ArrayList<DelegateType>();
117 if (!CollectionUtils.isEmpty(b.getDelegates())) {
118 for (DelegateType.Builder delegateBuilder : b.getDelegates()) {
119 delegates.add(delegateBuilder.build());
120 }
121 }
122 }
123
124 public String getRoleId() {
125 return roleId;
126 }
127
128 public String getRoleMemberId() {
129 return roleMemberId;
130 }
131
132 public String getEmbeddedRoleId() {
133 return embeddedRoleId;
134 }
135
136 public String getMemberId() {
137 return memberId;
138 }
139
140 public MemberType getMemberType() {
141 return MemberType.fromCode(memberTypeCode);
142 }
143
144 public String getRoleSortingCode() {
145 return roleSortingCode;
146 }
147
148 public Map<String, String> getQualifier() {
149 return qualifier;
150 }
151
152 public List<DelegateType> getDelegates() {
153 return Collections.unmodifiableList(delegates);
154 }
155
156
157 public static final class Builder implements ModelBuilder, RoleMembershipContract, ModelObjectComplete {
158 private String roleId;
159 private String roleMemberId;
160 private String embeddedRoleId;
161 private String memberId;
162 private MemberType memberType;
163 private String roleSortingCode;
164 private Map<String, String> qualifier;
165 private List<DelegateType.Builder> delegates;
166
167 private Builder() {
168 }
169
170 public static Builder create(String roleId, String roleMemberId, String memberId, MemberType memberType,
171 Map<String, String> qualifier) {
172
173 Builder b = new Builder();
174 b.setRoleId(roleId);
175 b.setRoleMemberId(roleMemberId);
176 b.setMemberId(memberId);
177 b.setMemberType(memberType);
178 b.setQualifier(qualifier);
179 return b;
180 }
181
182 public static Builder create(RoleMembershipContract contract) {
183 Builder b = new Builder();
184 b.setRoleId(contract.getRoleId());
185 b.setRoleMemberId(contract.getRoleMemberId());
186 b.setEmbeddedRoleId(contract.getEmbeddedRoleId());
187 b.setMemberId(contract.getMemberId());
188 b.setMemberType(contract.getMemberType());
189 b.setRoleSortingCode(contract.getRoleSortingCode());
190 b.setQualifier(contract.getQualifier());
191
192 List<DelegateType.Builder> delegateBuilders = new ArrayList<DelegateType.Builder>();
193 if (!CollectionUtils.isEmpty(contract.getDelegates())) {
194 for (DelegateTypeContract delegateContract : contract.getDelegates()) {
195 delegateBuilders.add(DelegateType.Builder.create(delegateContract));
196 }
197 }
198 b.setDelegates(delegateBuilders);
199
200 return b;
201 }
202
203 @Override
204 public RoleMembership build() {
205 return new RoleMembership(this);
206 }
207
208 public String getRoleId() {
209 return this.roleId;
210 }
211
212 public void setRoleId(String roleId) {
213 this.roleId = roleId;
214 }
215
216 public Map<String, String> getQualifier() {
217 return this.qualifier;
218 }
219
220 public void setQualifier(Map<String, String> qualifier) {
221 this.qualifier = qualifier;
222 }
223
224 public List<DelegateType.Builder> getDelegates() {
225 return this.delegates;
226 }
227
228 public void setDelegates(List<DelegateType.Builder> delegates) {
229 this.delegates = delegates;
230 }
231
232 public String getRoleMemberId() {
233 return this.roleMemberId;
234 }
235
236 public void setRoleMemberId(String roleMemberId) {
237 this.roleMemberId = roleMemberId;
238 }
239
240 public String getMemberId() {
241 return this.memberId;
242 }
243
244 public void setMemberId(String memberId) {
245 if (StringUtils.isEmpty(memberId)) {
246 throw new IllegalArgumentException("memberId cannot be empty or null");
247 }
248 this.memberId = memberId;
249 }
250
251 public MemberType getMemberType() {
252 return this.memberType;
253 }
254
255 public void setMemberType(MemberType memberType) {
256 if (memberType == null) {
257 throw new IllegalArgumentException("memberTypeCode cannot be null");
258 }
259 this.memberType = memberType;
260 }
261
262 public String getEmbeddedRoleId() {
263 return this.embeddedRoleId;
264 }
265
266 public void setEmbeddedRoleId(String embeddedRoleId) {
267 this.embeddedRoleId = embeddedRoleId;
268 }
269
270 public String getRoleSortingCode() {
271 return this.roleSortingCode;
272 }
273
274 public void setRoleSortingCode(String roleSortingCode) {
275 this.roleSortingCode = roleSortingCode;
276 }
277
278 @Override
279 public int hashCode() {
280 return HashCodeBuilder.reflectionHashCode(this);
281 }
282
283 @Override
284 public boolean equals(Object obj) {
285 return EqualsBuilder.reflectionEquals(obj, this);
286 }
287
288 @Override
289 public String toString() {
290 return ToStringBuilder.reflectionToString(this);
291 }
292
293
294 }
295
296 /**
297 * A private class which exposes constants which define the XML element names to use
298 * when this object is marshalled to XML.
299 */
300 static class Elements {
301 final static String ROLE_ID = "roleId";
302 final static String ROLE_MEMBER_ID = "roleMemberId";
303 final static String EMBEDDED_ROLE_ID = "embeddedRoleId";
304 final static String MEMBER_ID = "memberId";
305 final static String MEMBER_TYPE_CODE = "memberTypeCode";
306 final static String ROLE_SORTING_CODE = "roleSortingCode";
307 final static String QUALIFIER = "qualifier";
308 final static String DELEGATES = "delegates";
309 }
310
311 /**
312 * Defines some internal constants used on this class.
313 */
314 static class Constants {
315 final static String ROOT_ELEMENT_NAME = "roleMembership";
316 final static String TYPE_NAME = "RoleMembershipType";
317 }
318
319 public static class Cache {
320 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + RoleMembership.Constants.TYPE_NAME;
321 }
322 }