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.ROLE_MEMBER_ID, 051 RoleMember.Elements.ROLE_ID, 052 RoleMember.Elements.ATTRIBUTES, 053 RoleMember.Elements.ROLE_RESPONSIBILITY_ACTIONS, 054 RoleMember.Elements.MEMBER_ID, 055 RoleMember.Elements.MEMBER_TYPE_CODE, 056 CoreConstants.CommonElements.ACTIVE_FROM_DATE, 057 CoreConstants.CommonElements.ACTIVE_TO_DATE, 058 CoreConstants.CommonElements.FUTURE_ELEMENTS 059 }) 060 public class RoleMember extends AbstractDataTransferObject implements RoleMemberContract { 061 062 private static final long serialVersionUID = 1L; 063 064 @XmlElement(name = Elements.ROLE_MEMBER_ID) 065 private final String roleMemberId; 066 067 @XmlElement(name = Elements.ROLE_ID) 068 private final String roleId; 069 070 @XmlElement(name = Elements.ATTRIBUTES, required = false) 071 @XmlJavaTypeAdapter(value = MapStringStringAdapter.class) 072 private final Map<String, String> attributes; 073 074 @XmlElement(name = Elements.ROLE_RESPONSIBILITY_ACTIONS) 075 private final List<RoleResponsibilityAction> roleResponsibilityActions; 076 077 @XmlElement(name = Elements.MEMBER_ID) 078 private final String memberId; 079 080 @XmlElement(name = Elements.MEMBER_TYPE_CODE) 081 private final String memberTypeCode; 082 083 @XmlJavaTypeAdapter(DateTimeAdapter.class) 084 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_FROM_DATE) 085 private final DateTime activeFromDate; 086 087 @XmlJavaTypeAdapter(DateTimeAdapter.class) 088 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_TO_DATE) 089 private final DateTime activeToDate; 090 091 @SuppressWarnings("unused") 092 @XmlAnyElement 093 private final Collection<Element> _futureElements = null; 094 095 /** 096 * Private constructor for JAXB 097 */ 098 @SuppressWarnings("unused") 099 private RoleMember() { 100 roleMemberId = null; 101 roleId = null; 102 attributes = null; 103 roleResponsibilityActions = null; 104 memberId = null; 105 memberTypeCode = null; 106 activeFromDate = null; 107 activeToDate = null; 108 } 109 110 private RoleMember(Builder b) { 111 roleMemberId = b.getRoleMemberId(); 112 roleId = b.getRoleId(); 113 attributes = b.getAttributes(); 114 115 List<RoleResponsibilityAction> roleResponsibilityActions = new ArrayList<RoleResponsibilityAction>(); 116 if (!CollectionUtils.isEmpty(b.getRoleRspActions())) { 117 for (RoleResponsibilityAction.Builder rraBuilder : b.getRoleRspActions()) { 118 roleResponsibilityActions.add(rraBuilder.build()); 119 } 120 } 121 this.roleResponsibilityActions = roleResponsibilityActions; 122 123 memberId = b.getMemberId(); 124 memberTypeCode = b.getMemberType().getCode(); 125 activeFromDate = b.getActiveFromDate(); 126 activeToDate = b.getActiveToDate(); 127 } 128 129 130 public String getMemberId() { 131 return this.memberId; 132 } 133 134 public MemberType getMemberType() { 135 return MemberType.fromCode(this.memberTypeCode); 136 } 137 138 139 public String getRoleMemberId() { 140 return this.roleMemberId; 141 } 142 143 public String getRoleId() { 144 return this.roleId; 145 } 146 147 /** 148 * @return the attributes 149 */ 150 public Map<String, String> getAttributes() { 151 return this.attributes; 152 } 153 154 /** 155 * @return the roleResponsibilityActions 156 */ 157 public List<RoleResponsibilityAction> getRoleRspActions() { 158 return this.roleResponsibilityActions; 159 } 160 161 public DateTime getActiveFromDate() { 162 return activeFromDate; 163 } 164 165 public DateTime getActiveToDate() { 166 return activeToDate; 167 } 168 169 @Override 170 public boolean isActive(DateTime activeAsOfDate) { 171 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOfDate); 172 } 173 174 public static final class Builder implements ModelBuilder, RoleMemberContract, ModelObjectComplete { 175 176 private String roleMemberId; 177 private String roleId; 178 private Map<String, String> attributes; 179 private List<RoleResponsibilityAction.Builder> roleRspActions; 180 private String memberId; 181 private MemberType memberType; 182 private DateTime activeFromDate; 183 private DateTime activeToDate; 184 185 public static Builder create(String roleId, String roleMemberId, String memberId, 186 MemberType memberType, DateTime activeFromDate, DateTime activeToDate, Map<String, String> attributes) { 187 Builder b = new Builder(); 188 b.setRoleId(roleId); 189 b.setRoleMemberId(roleMemberId); 190 b.setMemberId(memberId); 191 b.setMemberType(memberType); 192 b.setActiveFromDate(activeFromDate); 193 b.setActiveToDate(activeToDate); 194 b.setAttributes(attributes); 195 return b; 196 } 197 198 public static Builder create(RoleMemberContract contract) { 199 Builder b = new Builder(); 200 b.setRoleMemberId(contract.getRoleMemberId()); 201 b.setRoleId(contract.getRoleId()); 202 b.setAttributes(contract.getAttributes()); 203 204 List<RoleResponsibilityAction.Builder> rraBuilders = new ArrayList<RoleResponsibilityAction.Builder>(); 205 if (!CollectionUtils.isEmpty(contract.getRoleRspActions())) { 206 for (RoleResponsibilityActionContract rrac : contract.getRoleRspActions()) { 207 rraBuilders.add(RoleResponsibilityAction.Builder.create(rrac)); 208 } 209 } 210 b.setRoleRspActions(rraBuilders); 211 212 b.setMemberId(contract.getMemberId()); 213 b.setMemberType(contract.getMemberType()); 214 b.setActiveFromDate(contract.getActiveFromDate()); 215 b.setActiveToDate(contract.getActiveToDate()); 216 return b; 217 } 218 219 public RoleMember build() { 220 return new RoleMember(this); 221 } 222 223 public String getRoleMemberId() { 224 return roleMemberId; 225 } 226 227 public void setRoleMemberId(String roleMemberId) { 228 this.roleMemberId = roleMemberId; 229 } 230 231 public String getRoleId() { 232 return roleId; 233 } 234 235 public void setRoleId(String roleId) { 236 this.roleId = roleId; 237 } 238 239 public Map<String, String> getAttributes() { 240 return attributes; 241 } 242 243 public void setAttributes(Map<String, String> attributes) { 244 this.attributes = attributes; 245 } 246 247 public List<RoleResponsibilityAction.Builder> getRoleRspActions() { 248 return roleRspActions; 249 } 250 251 public void setRoleRspActions(List<RoleResponsibilityAction.Builder> roleRspActions) { 252 this.roleRspActions = roleRspActions; 253 } 254 255 public String getMemberId() { 256 return memberId; 257 } 258 259 public void setMemberId(String memberId) { 260 if (StringUtils.isBlank(memberId)) { 261 throw new IllegalArgumentException("memberId may not be null"); 262 } 263 this.memberId = memberId; 264 } 265 266 public MemberType getMemberType() { 267 return memberType; 268 } 269 270 public void setMemberType(MemberType memberType) { 271 if (memberType == null) { 272 throw new IllegalArgumentException("memberType may not be null"); 273 } 274 this.memberType = memberType; 275 } 276 277 public DateTime getActiveFromDate() { 278 return activeFromDate; 279 } 280 281 public void setActiveFromDate(DateTime activeFromDate) { 282 this.activeFromDate = activeFromDate; 283 } 284 285 public DateTime getActiveToDate() { 286 return activeToDate; 287 } 288 289 public void setActiveToDate(DateTime activeToDate) { 290 this.activeToDate = activeToDate; 291 } 292 293 @Override 294 public boolean isActive(DateTime activeAsOfDate) { 295 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOfDate); 296 } 297 298 @Override 299 public int hashCode() { 300 return HashCodeBuilder.reflectionHashCode(this); 301 } 302 303 @Override 304 public boolean equals(Object obj) { 305 return EqualsBuilder.reflectionEquals(obj, this); 306 } 307 308 @Override 309 public String toString() { 310 return ToStringBuilder.reflectionToString(this); 311 } 312 } 313 314 /** 315 * A private class which exposes constants which define the XML element names to use 316 * when this object is marshalled to XML. 317 */ 318 static class Elements { 319 final static String ROLE_MEMBER_ID = "roleMemberId"; 320 final static String ROLE_ID = "roleId"; 321 final static String ATTRIBUTES = "attributes"; 322 final static String ROLE_RESPONSIBILITY_ACTIONS = "roleResponsibilityActions"; 323 final static String MEMBER_ID = "memberId"; 324 final static String MEMBER_TYPE_CODE = "memberTypeCode"; 325 } 326 327 /** 328 * Defines some internal constants used on this class. 329 */ 330 static class Constants { 331 final static String ROOT_ELEMENT_NAME = "roleMember"; 332 final static String TYPE_NAME = "RoleMemberType"; 333 } 334 335 public static class Cache { 336 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + RoleMember.Constants.TYPE_NAME; 337 } 338 }