001/** 002 * Copyright 2005-2015 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 */ 016package org.kuali.rice.kim.api.role; 017 018import org.apache.commons.collections.CollectionUtils; 019import org.apache.commons.lang.StringUtils; 020import org.apache.commons.lang.builder.EqualsBuilder; 021import org.apache.commons.lang.builder.HashCodeBuilder; 022import org.apache.commons.lang.builder.ToStringBuilder; 023import org.joda.time.DateTime; 024import org.kuali.rice.core.api.CoreConstants; 025import org.kuali.rice.core.api.membership.MemberType; 026import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 027import org.kuali.rice.core.api.mo.ModelBuilder; 028import org.kuali.rice.core.api.mo.ModelObjectComplete; 029import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter; 030import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter; 031import org.kuali.rice.kim.api.KimConstants; 032import org.kuali.rice.kim.api.common.delegate.DelegateType; 033import org.kuali.rice.kim.api.common.delegate.DelegateTypeContract; 034import org.w3c.dom.Element; 035 036import javax.xml.bind.annotation.XmlAccessType; 037import javax.xml.bind.annotation.XmlAccessorType; 038import javax.xml.bind.annotation.XmlAnyElement; 039import javax.xml.bind.annotation.XmlElement; 040import javax.xml.bind.annotation.XmlElementWrapper; 041import javax.xml.bind.annotation.XmlRootElement; 042import javax.xml.bind.annotation.XmlType; 043import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 044import java.util.ArrayList; 045import java.util.Collection; 046import java.util.Collections; 047import java.util.List; 048import java.util.Map; 049 050@XmlRootElement(name = RoleMembership.Constants.ROOT_ELEMENT_NAME) 051@XmlAccessorType(XmlAccessType.NONE) 052@XmlType(name = RoleMembership.Constants.TYPE_NAME, propOrder = { 053 RoleMembership.Elements.ROLE_ID, 054 RoleMembership.Elements.ID, 055 RoleMembership.Elements.EMBEDDED_ROLE_ID, 056 RoleMembership.Elements.MEMBER_ID, 057 RoleMembership.Elements.TYPE_CODE, 058 RoleMembership.Elements.ROLE_SORTING_CODE, 059 RoleMembership.Elements.QUALIFIER, 060 RoleMembership.Elements.DELEGATES, 061 CoreConstants.CommonElements.ACTIVE_FROM_DATE, 062 CoreConstants.CommonElements.ACTIVE_TO_DATE, 063 CoreConstants.CommonElements.FUTURE_ELEMENTS 064}) 065public class RoleMembership extends AbstractDataTransferObject implements RoleMembershipContract { 066 private static final long serialVersionUID = 1L; 067 068 @XmlElement(name=Elements.ROLE_ID, required = true) 069 private final String roleId; 070 071 @XmlElement(name=Elements.ID, required = false) 072 private final String id; 073 074 @XmlElement(name=Elements.EMBEDDED_ROLE_ID, required = false) 075 private final String embeddedRoleId; 076 077 @XmlElement(name=Elements.MEMBER_ID, required = true) 078 private final String memberId; 079 080 @XmlElement(name=Elements.TYPE_CODE, required = true) 081 private final String typeCode; 082 083 @XmlElement(name=Elements.ROLE_SORTING_CODE, required = false) 084 private final String roleSortingCode; 085 086 @XmlElement(name=Elements.QUALIFIER, required = false) 087 @XmlJavaTypeAdapter(value = MapStringStringAdapter.class) 088 private final Map<String, String> qualifier; 089 090 @XmlElementWrapper(name = Elements.DELEGATES, required = false) 091 @XmlElement(name=Elements.DELEGATE, required = false) 092 private final List<DelegateType> delegates; 093 094 @XmlJavaTypeAdapter(DateTimeAdapter.class) 095 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_FROM_DATE, required = false) 096 private final DateTime activeFromDate; 097 098 @XmlJavaTypeAdapter(DateTimeAdapter.class) 099 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_TO_DATE, required = false) 100 private final DateTime activeToDate; 101 102 @SuppressWarnings("unused") 103 @XmlAnyElement 104 private final Collection<Element> _futureElements = null; 105 106 /** 107 * Private constructor for JAXB only 108 */ 109 @SuppressWarnings("unused") 110 private RoleMembership() { 111 roleId = null; 112 id = null; 113 embeddedRoleId = null; 114 memberId = null; 115 typeCode = null; 116 roleSortingCode = null; 117 qualifier = null; 118 delegates = null; 119 /* Added the active from and to dates to this object 120 */ 121 activeFromDate = null; 122 activeToDate = null; 123 } 124 125 private RoleMembership(Builder b) { 126 roleId = b.getRoleId(); 127 id = b.getId(); 128 embeddedRoleId = b.getEmbeddedRoleId(); 129 memberId = b.getMemberId(); 130 typeCode = b.getType().getCode(); 131 roleSortingCode = b.getRoleSortingCode(); 132 qualifier = b.getQualifier(); 133 134 delegates = new ArrayList<DelegateType>(); 135 if (!CollectionUtils.isEmpty(b.getDelegates())) { 136 for (DelegateType.Builder delegateBuilder : b.getDelegates()) { 137 delegates.add(delegateBuilder.build()); 138 } 139 } 140 activeFromDate = b.getActiveFromDate(); 141 activeToDate = b.getActiveToDate(); 142 143 } 144 145 @Override 146 public String getRoleId() { 147 return roleId; 148 } 149 150 @Override 151 public String getId() { 152 return id; 153 } 154 155 @Override 156 public String getEmbeddedRoleId() { 157 return embeddedRoleId; 158 } 159 160 @Override 161 public String getMemberId() { 162 return memberId; 163 } 164 165 @Override 166 public MemberType getType() { 167 return MemberType.fromCode(typeCode); 168 } 169 170 @Override 171 public String getRoleSortingCode() { 172 return roleSortingCode; 173 } 174 175 @Override 176 public Map<String, String> getQualifier() { 177 return qualifier; 178 } 179 180 @Override 181 public List<DelegateType> getDelegates() { 182 return Collections.unmodifiableList(delegates); 183 } 184 185 public DateTime getActiveFromDate() { 186 return activeFromDate; 187 } 188 189 public DateTime getActiveToDate() { 190 return activeToDate; 191 } 192 193 194 public static final class Builder implements ModelBuilder, RoleMembershipContract, ModelObjectComplete { 195 private String roleId; 196 private String id; 197 private String embeddedRoleId; 198 private String memberId; 199 private MemberType type; 200 private String roleSortingCode; 201 private Map<String, String> qualifier; 202 private List<DelegateType.Builder> delegates; 203 private DateTime activeFromDate; 204 private DateTime activeToDate; 205 206 private Builder(String roleId, String memberId, MemberType type) { 207 setRoleId(roleId); 208 setMemberId(memberId); 209 setType(type); 210 } 211 212 public static Builder create(String roleId, String id, String memberId, MemberType memberType, 213 Map<String, String> qualifier) { 214 215 Builder b = new Builder(roleId, memberId, memberType); 216 b.setId(id); 217 b.setQualifier(qualifier); 218 return b; 219 } 220 221 public static Builder create(String roleId, String id, String memberId, MemberType memberType, 222 Map<String, String> qualifier, DateTime activeFromDate, 223 DateTime activeToDate) { 224 Builder b = new Builder(roleId, memberId, memberType); 225 b.setId(id); 226 b.setQualifier(qualifier); 227 b.setActiveFromDate(activeFromDate); 228 b.setActiveToDate(activeToDate); 229 return b; 230 } 231 232 public static Builder create(RoleMembershipContract contract) { 233 Builder b = new Builder(contract.getRoleId(), contract.getMemberId(), contract.getType()); 234 b.setId(contract.getId()); 235 b.setEmbeddedRoleId(contract.getEmbeddedRoleId()); 236 b.setRoleSortingCode(contract.getRoleSortingCode()); 237 b.setQualifier(contract.getQualifier()); 238 239 List<DelegateType.Builder> delegateBuilders = new ArrayList<DelegateType.Builder>(); 240 if (!CollectionUtils.isEmpty(contract.getDelegates())) { 241 for (DelegateTypeContract delegateContract : contract.getDelegates()) { 242 delegateBuilders.add(DelegateType.Builder.create(delegateContract)); 243 } 244 } 245 b.setDelegates(delegateBuilders); 246 247 return b; 248 } 249 250 @Override 251 public RoleMembership build() { 252 return new RoleMembership(this); 253 } 254 255 @Override 256 public String getRoleId() { 257 return this.roleId; 258 } 259 260 public void setRoleId(String roleId) { 261 this.roleId = roleId; 262 } 263 264 @Override 265 public Map<String, String> getQualifier() { 266 return this.qualifier; 267 } 268 269 public void setQualifier(Map<String, String> qualifier) { 270 this.qualifier = qualifier; 271 } 272 273 @Override 274 public List<DelegateType.Builder> getDelegates() { 275 return this.delegates; 276 } 277 278 public void setDelegates(List<DelegateType.Builder> delegates) { 279 this.delegates = delegates; 280 } 281 282 public DateTime getActiveFromDate() { 283 return activeFromDate; 284 } 285 286 public void setActiveFromDate(DateTime activeFromDate) { 287 this.activeFromDate = activeFromDate; 288 } 289 290 public DateTime getActiveToDate() { 291 return activeToDate; 292 } 293 294 public void setActiveToDate(DateTime activeToDate) { 295 this.activeToDate = activeToDate; 296 } 297 298 @Override 299 public String getId() { 300 return this.id; 301 } 302 303 public void setId(String id) { 304 this.id = id; 305 } 306 307 @Override 308 public String getMemberId() { 309 return this.memberId; 310 } 311 312 public void setMemberId(String memberId) { 313 if (StringUtils.isEmpty(memberId)) { 314 throw new IllegalArgumentException("memberId cannot be empty or null"); 315 } 316 this.memberId = memberId; 317 } 318 319 @Override 320 public MemberType getType() { 321 return this.type; 322 } 323 324 public void setType(MemberType type) { 325 if (type == null) { 326 throw new IllegalArgumentException("type cannot be null"); 327 } 328 this.type = type; 329 } 330 331 @Override 332 public String getEmbeddedRoleId() { 333 return this.embeddedRoleId; 334 } 335 336 public void setEmbeddedRoleId(String embeddedRoleId) { 337 this.embeddedRoleId = embeddedRoleId; 338 } 339 340 @Override 341 public String getRoleSortingCode() { 342 return this.roleSortingCode; 343 } 344 345 public void setRoleSortingCode(String roleSortingCode) { 346 this.roleSortingCode = roleSortingCode; 347 } 348 349 @Override 350 public int hashCode() { 351 return HashCodeBuilder.reflectionHashCode(this); 352 } 353 354 @Override 355 public boolean equals(Object obj) { 356 return EqualsBuilder.reflectionEquals(obj, this); 357 } 358 359 @Override 360 public String toString() { 361 return ToStringBuilder.reflectionToString(this); 362 } 363 364 365 } 366 367 /** 368 * A private class which exposes constants which define the XML element names to use 369 * when this object is marshalled to XML. 370 */ 371 static class Elements { 372 final static String ROLE_ID = "roleId"; 373 final static String ID = "id"; 374 final static String EMBEDDED_ROLE_ID = "embeddedRoleId"; 375 final static String MEMBER_ID = "memberId"; 376 final static String TYPE_CODE = "typeCode"; 377 final static String ROLE_SORTING_CODE = "roleSortingCode"; 378 final static String QUALIFIER = "qualifier"; 379 final static String DELEGATES = "delegates"; 380 final static String DELEGATE = "delegate"; 381 } 382 383 /** 384 * Defines some internal constants used on this class. 385 */ 386 static class Constants { 387 final static String ROOT_ELEMENT_NAME = "roleMembership"; 388 final static String TYPE_NAME = "RoleMembershipType"; 389 } 390 391 public static class Cache { 392 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + RoleMembership.Constants.TYPE_NAME; 393 } 394}