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 }