001/* 002 * The Kuali Financial System, a comprehensive financial management system for higher education. 003 * 004 * Copyright 2005-2014 The Kuali Foundation 005 * 006 * This program is free software: you can redistribute it and/or modify 007 * it under the terms of the GNU Affero General Public License as 008 * published by the Free Software Foundation, either version 3 of the 009 * License, or (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU Affero General Public License for more details. 015 * 016 * You should have received a copy of the GNU Affero General Public License 017 * along with this program. If not, see <http://www.gnu.org/licenses/>. 018 */ 019package org.kuali.rice.kim.api.common.delegate; 020 021import java.io.Serializable; 022import java.util.Collection; 023import java.util.Map; 024 025import javax.xml.bind.annotation.XmlAccessType; 026import javax.xml.bind.annotation.XmlAccessorType; 027import javax.xml.bind.annotation.XmlAnyElement; 028import javax.xml.bind.annotation.XmlElement; 029import javax.xml.bind.annotation.XmlRootElement; 030import javax.xml.bind.annotation.XmlType; 031import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 032 033import org.apache.commons.lang.StringUtils; 034import org.joda.time.DateTime; 035import org.kuali.rice.core.api.CoreConstants; 036import org.kuali.rice.core.api.membership.MemberType; 037import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 038import org.kuali.rice.core.api.mo.ModelBuilder; 039import org.kuali.rice.core.api.mo.common.active.InactivatableFromToUtils; 040import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter; 041import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter; 042import org.kuali.rice.kim.api.KimConstants; 043import org.w3c.dom.Element; 044 045@XmlRootElement(name = DelegateMember.Constants.ROOT_ELEMENT_NAME) 046@XmlAccessorType(XmlAccessType.NONE) 047@XmlType(name = DelegateMember.Constants.TYPE_NAME, propOrder = { 048 DelegateMember.Elements.DELEGATION_MEMBER_ID, 049 DelegateMember.Elements.DELEGATION_ID, 050 DelegateMember.Elements.MEMBER_ID, 051 DelegateMember.Elements.ROLE_MEMBER_ID, 052 DelegateMember.Elements.TYPE_CODE, 053 DelegateMember.Elements.ATTRIBUTES, 054 CoreConstants.CommonElements.ACTIVE_FROM_DATE, 055 CoreConstants.CommonElements.ACTIVE_TO_DATE, 056 CoreConstants.CommonElements.VERSION_NUMBER, 057 CoreConstants.CommonElements.FUTURE_ELEMENTS 058}) 059public final class DelegateMember extends AbstractDataTransferObject 060 implements DelegateMemberContract { 061 062 @XmlElement(name = Elements.DELEGATION_MEMBER_ID, required = false) 063 private final String delegationMemberId; 064 065 @XmlElement(name = Elements.DELEGATION_ID, required = false) 066 private final String delegationId; 067 068 @XmlElement(name = Elements.MEMBER_ID, required = false) 069 private final String memberId; 070 071 @XmlElement(name = Elements.ROLE_MEMBER_ID, required = false) 072 private final String roleMemberId; 073 074 @XmlElement(name = Elements.TYPE_CODE, required = false) 075 private final String typeCode; 076 077 @XmlElement(name = Elements.ATTRIBUTES, required = false) 078 @XmlJavaTypeAdapter(value = MapStringStringAdapter.class) 079 private final Map<String, String> attributes; 080 081 @XmlJavaTypeAdapter(DateTimeAdapter.class) 082 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_FROM_DATE) 083 private final DateTime activeFromDate; 084 085 @XmlJavaTypeAdapter(DateTimeAdapter.class) 086 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_TO_DATE) 087 private final DateTime activeToDate; 088 089 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER) 090 private final Long versionNumber; 091 092 @SuppressWarnings("unused") 093 @XmlAnyElement 094 private final Collection<Element> _futureElements = null; 095 096 /** 097 * Private constructor used only by JAXB. 098 */ 099 @SuppressWarnings("unused") 100 private DelegateMember() { 101 this.delegationMemberId = null; 102 this.delegationId = null; 103 this.memberId = null; 104 this.roleMemberId = null; 105 this.typeCode = null; 106 this.versionNumber = null; 107 this.activeFromDate = null; 108 this.activeToDate = null; 109 this.attributes = null; 110 } 111 112 private DelegateMember(Builder builder) { 113 this.delegationMemberId = builder.getDelegationMemberId(); 114 this.delegationId = builder.getDelegationId(); 115 this.memberId = builder.getMemberId(); 116 this.roleMemberId = builder.getRoleMemberId(); 117 if (builder.getType() == null) { 118 this.typeCode = null; 119 } else { 120 this.typeCode = builder.getType().getCode(); 121 } 122 this.versionNumber = builder.getVersionNumber(); 123 this.activeFromDate = builder.getActiveFromDate(); 124 this.activeToDate = builder.getActiveToDate(); 125 this.attributes = builder.getAttributes(); 126 } 127 128 129 @Override 130 public String getDelegationMemberId() { 131 return this.delegationMemberId; 132 } 133 134 @Override 135 public String getDelegationId() { 136 return this.delegationId; 137 } 138 139 @Override 140 public MemberType getType() { 141 return MemberType.fromCode(this.typeCode); 142 } 143 144 @Override 145 public String getRoleMemberId() { 146 return this.roleMemberId; 147 } 148 149 @Override 150 public String getMemberId() { 151 return this.memberId; 152 } 153 154 @Override 155 public Long getVersionNumber() { 156 return this.versionNumber; 157 } 158 159 @Override 160 public DateTime getActiveFromDate() { 161 return activeFromDate; 162 } 163 164 @Override 165 public DateTime getActiveToDate() { 166 return activeToDate; 167 } 168 169 /** 170 * @return the attributes 171 */ 172 @Override 173 public Map<String, String> getAttributes() { 174 return this.attributes; 175 } 176 177 @Override 178 public boolean isActive(DateTime activeAsOfDate) { 179 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOfDate); 180 } 181 182 @Override 183 public boolean isActive() { 184 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null); 185 } 186 187 /** 188 * A builder which can be used to construct {@link DelegateMember} instances. Enforces the constraints of the {@link DelegateMemberContract}. 189 */ 190 public static final class Builder implements Serializable, ModelBuilder, DelegateMemberContract { 191 192 private String delegationMemberId; 193 private String delegationId; 194 private String memberId; 195 private String roleMemberId; 196 private MemberType type; 197 private Map<String, String> attributes; 198 private DateTime activeFromDate; 199 private DateTime activeToDate; 200 private Long versionNumber; 201 202 private Builder() { 203 204 } 205 206 public static Builder create() { 207 return new Builder(); 208 } 209 210 public static Builder create(DelegateMemberContract contract) { 211 if (contract == null) { 212 throw new IllegalArgumentException("contract was null"); 213 } 214 Builder builder = create(); 215 builder.setDelegationMemberId(contract.getDelegationMemberId()); 216 builder.setDelegationId(contract.getDelegationId()); 217 builder.setMemberId(contract.getMemberId()); 218 builder.setRoleMemberId(contract.getRoleMemberId()); 219 builder.setAttributes(contract.getAttributes()); 220 builder.setType(contract.getType()); 221 builder.setActiveFromDate(contract.getActiveFromDate()); 222 builder.setActiveToDate(contract.getActiveToDate()); 223 builder.setVersionNumber(contract.getVersionNumber()); 224 return builder; 225 } 226 227 @Override 228 public DelegateMember build() { 229 return new DelegateMember(this); 230 } 231 232 @Override 233 public String getDelegationMemberId() { 234 return this.delegationMemberId; 235 } 236 237 public void setDelegationMemberId(String delegationMemberId) { 238 if (StringUtils.isWhitespace(delegationMemberId)) { 239 throw new IllegalArgumentException("delegationMemberId cannot be whitespace"); 240 } 241 this.delegationMemberId = delegationMemberId; 242 } 243 244 @Override 245 public String getDelegationId() { 246 return delegationId; 247 } 248 249 public void setDelegationId(String delegationId) { 250 this.delegationId = delegationId; 251 } 252 253 @Override 254 public String getMemberId() { 255 return memberId; 256 } 257 258 public void setMemberId(String memberId) { 259 this.memberId = memberId; 260 } 261 262 @Override 263 public String getRoleMemberId() { 264 return roleMemberId; 265 } 266 267 public void setRoleMemberId(String roleMemberId) { 268 this.roleMemberId = roleMemberId; 269 } 270 271 @Override 272 public MemberType getType() { 273 return type; 274 } 275 276 public void setType(MemberType type) { 277 this.type = type; 278 } 279 280 @Override 281 public Map<String, String> getAttributes() { 282 return this.attributes; 283 } 284 285 public void setAttributes(Map<String, String> attributes) { 286 this.attributes = attributes; 287 } 288 289 @Override 290 public Long getVersionNumber() { 291 return versionNumber; 292 } 293 294 public void setVersionNumber(Long versionNumber) { 295 this.versionNumber = versionNumber; 296 } 297 298 @Override 299 public DateTime getActiveFromDate() { 300 return activeFromDate; 301 } 302 303 public void setActiveFromDate(DateTime activeFromDate) { 304 this.activeFromDate = activeFromDate; 305 } 306 307 @Override 308 public DateTime getActiveToDate() { 309 return activeToDate; 310 } 311 312 public void setActiveToDate(DateTime activeToDate) { 313 this.activeToDate = activeToDate; 314 } 315 316 @Override 317 public boolean isActive(DateTime activeAsOfDate) { 318 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOfDate); 319 } 320 321 @Override 322 public boolean isActive() { 323 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null); 324 } 325 } 326 327 /** 328 * Defines some internal constants used on this class. 329 */ 330 static class Constants { 331 332 final static String ROOT_ELEMENT_NAME = "delegateMember"; 333 final static String TYPE_NAME = "DelegateMemberType"; 334 335 } 336 337 /** 338 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 339 */ 340 static class Elements { 341 final static String DELEGATION_MEMBER_ID = "delegationMemberId"; 342 final static String ROLE_ID = "roleId"; 343 final static String DELEGATION_ID = "delegationId"; 344 final static String MEMBER_ID = "memberId"; 345 final static String ATTRIBUTES = "attributes"; 346 final static String ROLE_MEMBER_ID = "roleMemberId"; 347 final static String TYPE_CODE = "typeCode"; 348 } 349 350 public static class Cache { 351 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + DelegateMember.Constants.TYPE_NAME; 352 } 353}