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.joda.time.DateTime;
024 import org.kuali.rice.core.api.CoreConstants;
025 import org.kuali.rice.core.api.membership.MemberType;
026 import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
027 import org.kuali.rice.core.api.mo.ModelBuilder;
028 import org.kuali.rice.core.api.mo.ModelObjectComplete;
029 import org.kuali.rice.core.api.mo.common.active.InactivatableFromToUtils;
030 import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
031 import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter;
032 import org.kuali.rice.kim.api.KimConstants;
033 import org.w3c.dom.Element;
034
035 import javax.xml.bind.annotation.XmlAccessType;
036 import javax.xml.bind.annotation.XmlAccessorType;
037 import javax.xml.bind.annotation.XmlAnyElement;
038 import javax.xml.bind.annotation.XmlElement;
039 import javax.xml.bind.annotation.XmlRootElement;
040 import javax.xml.bind.annotation.XmlType;
041 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
042 import java.util.ArrayList;
043 import java.util.Collection;
044 import java.util.List;
045 import java.util.Map;
046
047 @XmlRootElement(name = RoleMember.Constants.ROOT_ELEMENT_NAME)
048 @XmlAccessorType(XmlAccessType.NONE)
049 @XmlType(name = RoleMember.Constants.TYPE_NAME, propOrder = {
050 RoleMember.Elements.ID,
051 RoleMember.Elements.ROLE_ID,
052 RoleMember.Elements.ATTRIBUTES,
053 RoleMember.Elements.ROLE_RESPONSIBILITY_ACTIONS,
054 RoleMember.Elements.MEMBER_ID,
055 RoleMember.Elements.TYPE_CODE,
056 RoleMember.Elements.MEMBER_NAME,
057 RoleMember.Elements.MEMBER_NAMESPACE_CODE,
058 CoreConstants.CommonElements.ACTIVE_FROM_DATE,
059 CoreConstants.CommonElements.ACTIVE_TO_DATE,
060 CoreConstants.CommonElements.VERSION_NUMBER,
061 CoreConstants.CommonElements.OBJECT_ID,
062 CoreConstants.CommonElements.FUTURE_ELEMENTS
063 })
064 public class RoleMember extends AbstractDataTransferObject implements RoleMemberContract {
065
066 private static final long serialVersionUID = 1L;
067
068 @XmlElement(name = Elements.ID, required = false)
069 private final String id;
070
071 @XmlElement(name = Elements.ROLE_ID, required = true)
072 private final String roleId;
073
074 @XmlElement(name = Elements.ATTRIBUTES, required = false)
075 @XmlJavaTypeAdapter(value = MapStringStringAdapter.class)
076 private final Map<String, String> attributes;
077
078 @XmlElement(name = Elements.ROLE_RESPONSIBILITY_ACTIONS, required = false)
079 private final List<RoleResponsibilityAction> roleResponsibilityActions;
080
081 @XmlElement(name = Elements.MEMBER_ID, required = true)
082 private final String memberId;
083
084 @XmlElement(name = Elements.TYPE_CODE, required = true)
085 private final String typeCode;
086
087 @XmlElement(name = Elements.MEMBER_NAME, required = true)
088 private final String memberName;
089
090 @XmlElement(name = Elements.MEMBER_NAMESPACE_CODE, required = true)
091 private final String memberNamespaceCode;
092
093 @XmlJavaTypeAdapter(DateTimeAdapter.class)
094 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_FROM_DATE, required = false)
095 private final DateTime activeFromDate;
096
097 @XmlJavaTypeAdapter(DateTimeAdapter.class)
098 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_TO_DATE, required = false)
099 private final DateTime activeToDate;
100
101 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
102 private final Long versionNumber;
103
104 @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
105 private final String objectId;
106
107 @SuppressWarnings("unused")
108 @XmlAnyElement
109 private final Collection<Element> _futureElements = null;
110
111 /**
112 * Private constructor for JAXB
113 */
114 @SuppressWarnings("unused")
115 private RoleMember() {
116 id = null;
117 roleId = null;
118 attributes = null;
119 roleResponsibilityActions = null;
120 memberId = null;
121 typeCode = null;
122 memberName = null;
123 memberNamespaceCode = null;
124 activeFromDate = null;
125 activeToDate = null;
126 this.versionNumber = null;
127 this.objectId = null;
128 }
129
130 private RoleMember(Builder b) {
131 id = b.getId();
132 roleId = b.getRoleId();
133 attributes = b.getAttributes();
134
135 List<RoleResponsibilityAction> roleResponsibilityActions = new ArrayList<RoleResponsibilityAction>();
136 if (!CollectionUtils.isEmpty(b.getRoleRspActions())) {
137 for (RoleResponsibilityAction.Builder rraBuilder : b.getRoleRspActions()) {
138 roleResponsibilityActions.add(rraBuilder.build());
139 }
140 }
141 this.roleResponsibilityActions = roleResponsibilityActions;
142
143 memberId = b.getMemberId();
144 typeCode = b.getType().getCode();
145 memberName = b.getMemberName();
146 memberNamespaceCode = b.getMemberNamespaceCode();
147 activeFromDate = b.getActiveFromDate();
148 activeToDate = b.getActiveToDate();
149 versionNumber = b.getVersionNumber();
150 objectId = b.getObjectId();
151 }
152
153 @Override
154 public String getMemberId() {
155 return this.memberId;
156 }
157
158 @Override
159 public MemberType getType() {
160 return MemberType.fromCode(this.typeCode);
161 }
162
163 @Override
164 public String getId() {
165 return this.id;
166 }
167
168 @Override
169 public String getRoleId() {
170 return this.roleId;
171 }
172
173 /**
174 * @return the attributes
175 */
176 @Override
177 public Map<String, String> getAttributes() {
178 return this.attributes;
179 }
180
181 /**
182 * @return the roleResponsibilityActions
183 */
184 @Override
185 public List<RoleResponsibilityAction> getRoleRspActions() {
186 return this.roleResponsibilityActions;
187 }
188
189 @Override
190 public DateTime getActiveFromDate() {
191 return activeFromDate;
192 }
193
194 @Override
195 public DateTime getActiveToDate() {
196 return activeToDate;
197 }
198
199 @Override
200 public boolean isActive(DateTime activeAsOfDate) {
201 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOfDate);
202 }
203
204 @Override
205 public boolean isActive() {
206 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null);
207 }
208
209 @Override
210 public Long getVersionNumber() {
211 return versionNumber;
212 }
213
214 @Override
215 public String getObjectId() {
216 return objectId;
217 }
218
219 @Override
220 public String getMemberName() {
221 return memberName;
222 }
223
224 @Override
225 public String getMemberNamespaceCode() {
226 return memberNamespaceCode;
227 }
228
229
230 public static final class Builder implements ModelBuilder, RoleMemberContract, ModelObjectComplete {
231
232 private String id;
233 private String roleId;
234 private Map<String, String> attributes;
235 private List<RoleResponsibilityAction.Builder> roleRspActions;
236 private String memberId;
237 private MemberType type;
238 private DateTime activeFromDate;
239 private DateTime activeToDate;
240 private Long versionNumber;
241 private String objectId;
242 private String memberName;
243 private String memberNamespaceCode;
244
245 private Builder(String roleId, String memberId, MemberType type) {
246 setRoleId(roleId);
247 setMemberId(memberId);
248 setType(type);
249 }
250
251 public static Builder create(String roleId, String id, String memberId,
252 MemberType memberType, DateTime activeFromDate, DateTime activeToDate, Map<String, String> attributes,String memberName,String memberNamespaceCode) {
253 Builder b = new Builder(roleId, memberId, memberType);
254 b.setId(id);
255 b.setActiveFromDate(activeFromDate);
256 b.setActiveToDate(activeToDate);
257 b.setAttributes(attributes);
258 b.setMemberName(memberName);
259 b.setMemberNamespaceCode(memberNamespaceCode);
260 return b;
261 }
262
263 public static Builder create(RoleMemberContract contract) {
264 Builder b = new Builder(contract.getRoleId(), contract.getMemberId(), contract.getType());
265 b.setId(contract.getId());
266 b.setAttributes(contract.getAttributes());
267
268 List<RoleResponsibilityAction.Builder> rraBuilders = new ArrayList<RoleResponsibilityAction.Builder>();
269 if (!CollectionUtils.isEmpty(contract.getRoleRspActions())) {
270 for (RoleResponsibilityActionContract rrac : contract.getRoleRspActions()) {
271 rraBuilders.add(RoleResponsibilityAction.Builder.create(rrac));
272 }
273 }
274 b.setRoleRspActions(rraBuilders);
275
276 b.setActiveFromDate(contract.getActiveFromDate());
277 b.setActiveToDate(contract.getActiveToDate());
278 b.setMemberName(contract.getMemberName());
279 b.setMemberNamespaceCode(contract.getMemberNamespaceCode());
280 b.setVersionNumber(contract.getVersionNumber());
281 b.setObjectId(contract.getObjectId());
282 return b;
283 }
284
285 @Override
286 public RoleMember build() {
287 return new RoleMember(this);
288 }
289
290 @Override
291 public String getId() {
292 return id;
293 }
294
295 public void setId(String id) {
296 this.id = id;
297 }
298
299 @Override
300 public String getRoleId() {
301 return roleId;
302 }
303
304 public void setRoleId(String roleId) {
305 if (StringUtils.isEmpty(roleId)) {
306 throw new IllegalArgumentException("roleId is empty");
307 }
308 this.roleId = roleId;
309 }
310
311 @Override
312 public Map<String, String> getAttributes() {
313 return attributes;
314 }
315
316 public void setAttributes(Map<String, String> attributes) {
317 this.attributes = attributes;
318 }
319
320 @Override
321 public List<RoleResponsibilityAction.Builder> getRoleRspActions() {
322 return roleRspActions;
323 }
324
325 public void setRoleRspActions(List<RoleResponsibilityAction.Builder> roleRspActions) {
326 this.roleRspActions = roleRspActions;
327 }
328
329 @Override
330 public String getMemberId() {
331 return memberId;
332 }
333
334 public void setMemberId(String memberId) {
335 if (StringUtils.isBlank(memberId)) {
336 throw new IllegalArgumentException("memberId may not be null");
337 }
338 this.memberId = memberId;
339 }
340
341 @Override
342 public MemberType getType() {
343 return type;
344 }
345
346 @Override
347 public String getMemberName() {
348 return memberName;
349 }
350
351 public void setMemberName(String memberName){
352 this.memberName = memberName;
353 }
354 @Override
355 public String getMemberNamespaceCode() {
356 return memberNamespaceCode;
357 }
358
359 public void setMemberNamespaceCode(String memberNamespaceCode){
360 this.memberNamespaceCode = memberNamespaceCode;
361 }
362 public void setType(final MemberType type) {
363 if (type == null) {
364 throw new IllegalArgumentException("type is null");
365 }
366 this.type = type;
367 }
368
369 @Override
370 public DateTime getActiveFromDate() {
371 return activeFromDate;
372 }
373
374 public void setActiveFromDate(DateTime activeFromDate) {
375 this.activeFromDate = activeFromDate;
376 }
377
378 @Override
379 public DateTime getActiveToDate() {
380 return activeToDate;
381 }
382
383 public void setActiveToDate(DateTime activeToDate) {
384 this.activeToDate = activeToDate;
385 }
386
387 @Override
388 public boolean isActive(DateTime activeAsOfDate) {
389 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOfDate);
390 }
391
392 @Override
393 public boolean isActive() {
394 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null);
395 }
396
397 @Override
398 public Long getVersionNumber() {
399 return versionNumber;
400 }
401
402 public void setVersionNumber(final Long versionNumber) {
403 this.versionNumber = versionNumber;
404 }
405
406 @Override
407 public String getObjectId() {
408 return objectId;
409 }
410
411 public void setObjectId(final String objectId) {
412 this.objectId = objectId;
413 }
414
415 @Override
416 public int hashCode() {
417 return HashCodeBuilder.reflectionHashCode(this);
418 }
419
420 @Override
421 public boolean equals(Object obj) {
422 return EqualsBuilder.reflectionEquals(obj, this);
423 }
424
425 @Override
426 public String toString() {
427 return ToStringBuilder.reflectionToString(this);
428 }
429 }
430
431 /**
432 * A private class which exposes constants which define the XML element names to use
433 * when this object is marshalled to XML.
434 */
435 static class Elements {
436 final static String ID = "id";
437 final static String ROLE_ID = "roleId";
438 final static String ATTRIBUTES = "attributes";
439 final static String ROLE_RESPONSIBILITY_ACTIONS = "roleResponsibilityActions";
440 final static String MEMBER_ID = "memberId";
441 final static String TYPE_CODE = "typeCode";
442 final static String MEMBER_NAME = "memberName";
443 final static String MEMBER_NAMESPACE_CODE = "memberNamespaceCode";
444 }
445
446 /**
447 * Defines some internal constants used on this class.
448 */
449 static class Constants {
450 final static String ROOT_ELEMENT_NAME = "roleMember";
451 final static String TYPE_NAME = "RoleMemberType";
452 }
453
454 public static class Cache {
455 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + RoleMember.Constants.TYPE_NAME;
456 }
457 }