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.group; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.joda.time.DateTime; 020 import org.kuali.rice.core.api.CoreConstants; 021 import org.kuali.rice.core.api.membership.MemberType; 022 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 023 import org.kuali.rice.core.api.mo.ModelBuilder; 024 import org.kuali.rice.core.api.mo.common.active.InactivatableFromToUtils; 025 import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter; 026 import org.kuali.rice.kim.api.KimConstants; 027 import org.w3c.dom.Element; 028 029 import javax.xml.bind.annotation.XmlAccessType; 030 import javax.xml.bind.annotation.XmlAccessorType; 031 import javax.xml.bind.annotation.XmlAnyElement; 032 import javax.xml.bind.annotation.XmlElement; 033 import javax.xml.bind.annotation.XmlRootElement; 034 import javax.xml.bind.annotation.XmlType; 035 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 036 import java.io.Serializable; 037 import java.util.Collection; 038 039 @XmlRootElement(name = GroupMember.Constants.ROOT_ELEMENT_NAME) 040 @XmlAccessorType(XmlAccessType.NONE) 041 @XmlType(name = GroupMember.Constants.TYPE_NAME, propOrder = { 042 GroupMember.Elements.ID, 043 GroupMember.Elements.GROUP_ID, 044 GroupMember.Elements.MEMBER_ID, 045 GroupMember.Elements.TYPE_CODE, 046 CoreConstants.CommonElements.ACTIVE_FROM_DATE, 047 CoreConstants.CommonElements.ACTIVE_TO_DATE, 048 CoreConstants.CommonElements.VERSION_NUMBER, 049 CoreConstants.CommonElements.OBJECT_ID, 050 CoreConstants.CommonElements.FUTURE_ELEMENTS 051 }) 052 public class GroupMember extends AbstractDataTransferObject implements GroupMemberContract { 053 054 @XmlElement(name = Elements.ID, required = false) 055 private final String id; 056 057 @XmlElement(name = Elements.GROUP_ID, required = true) 058 private final String groupId; 059 060 @XmlElement(name = Elements.MEMBER_ID, required = true) 061 private final String memberId; 062 063 @XmlElement(name = Elements.TYPE_CODE, required = true) 064 private final String typeCode; 065 066 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_FROM_DATE, required = false) 067 @XmlJavaTypeAdapter(DateTimeAdapter.class) 068 private final DateTime activeFromDate; 069 070 @XmlElement(name = CoreConstants.CommonElements.ACTIVE_TO_DATE, required = false) 071 @XmlJavaTypeAdapter(DateTimeAdapter.class) 072 private final DateTime activeToDate; 073 074 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false) 075 private final Long versionNumber; 076 077 @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false) 078 private final String objectId; 079 080 @SuppressWarnings("unused") 081 @XmlAnyElement 082 private final Collection<Element> _futureElements = null; 083 084 private GroupMember() { 085 this.id = null; 086 this.groupId = null; 087 this.memberId = null; 088 this.typeCode = null; 089 this.versionNumber = null; 090 this.objectId = null; 091 this.activeFromDate = null; 092 this.activeToDate = null; 093 } 094 095 096 public GroupMember(Builder builder) { 097 this.id = builder.getId(); 098 this.groupId = builder.getGroupId(); 099 this.memberId = builder.getMemberId(); 100 this.typeCode = builder.getType().getCode(); 101 this.versionNumber = builder.getVersionNumber(); 102 this.objectId = builder.getObjectId(); 103 this.activeFromDate = builder.getActiveFromDate(); 104 this.activeToDate = builder.getActiveToDate(); 105 } 106 107 public String getId() { 108 return id; 109 } 110 111 public String getGroupId() { 112 return groupId; 113 } 114 115 public String getMemberId() { 116 return memberId; 117 } 118 119 public MemberType getType() { 120 return MemberType.fromCode(typeCode); 121 } 122 123 public DateTime getActiveFromDate() { 124 return activeFromDate; 125 } 126 127 public DateTime getActiveToDate() { 128 return activeToDate; 129 } 130 131 public Long getVersionNumber() { 132 return versionNumber; 133 } 134 135 public String getObjectId() { 136 return objectId; 137 } 138 139 @Override 140 public boolean isActive(DateTime activeAsOf) { 141 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOf); 142 } 143 144 public static class Builder implements GroupMemberContract, ModelBuilder, Serializable { 145 private String id; 146 private String groupId; 147 private String memberId; 148 private MemberType type; 149 private DateTime activeFromDate; 150 private DateTime activeToDate; 151 private Long versionNumber; 152 private String objectId; 153 154 private Builder(String groupId, String memberId, MemberType type) { 155 setGroupId(groupId); 156 setMemberId(memberId); 157 setType(type); 158 } 159 160 /** 161 * creates a Parameter with the required fields. 162 */ 163 public static Builder create(String groupId, String memberId, MemberType type) { 164 return new Builder(groupId, memberId, type); 165 } 166 167 /** 168 * creates a GroupMember from an existing {@link org.kuali.rice.kim.api.group.GroupMemberContract}. 169 */ 170 public static Builder create(GroupMemberContract contract) { 171 if (contract == null) { 172 throw new IllegalArgumentException("contract was null"); 173 } 174 Builder builder = new Builder(contract.getGroupId(), contract.getMemberId(), contract.getType()); 175 builder.setId(contract.getId()); 176 builder.setActiveFromDate(contract.getActiveFromDate()); 177 builder.setActiveToDate(contract.getActiveToDate()); 178 builder.setVersionNumber(contract.getVersionNumber()); 179 builder.setObjectId(contract.getObjectId()); 180 return builder; 181 } 182 183 @Override 184 public String getId() { 185 return id; 186 } 187 188 public void setId(final String id) { 189 if (StringUtils.isWhitespace(id)) { 190 throw new IllegalArgumentException("id is blank"); 191 } 192 this.id = id; 193 } 194 195 @Override 196 public String getGroupId() { 197 return groupId; 198 } 199 200 public void setGroupId(final String groupId) { 201 if (StringUtils.isEmpty(groupId)) { 202 throw new IllegalArgumentException("groupId is empty"); 203 } 204 this.groupId = groupId; 205 } 206 207 @Override 208 public String getMemberId() { 209 return memberId; 210 } 211 212 public void setMemberId(final String memberId) { 213 if (StringUtils.isEmpty(memberId)) { 214 throw new IllegalArgumentException("memberId is empty"); 215 } 216 this.memberId = memberId; 217 } 218 219 @Override 220 public MemberType getType() { 221 return type; 222 } 223 224 public void setType(final MemberType type) { 225 if (type == null) { 226 throw new IllegalArgumentException("type is null"); 227 } 228 this.type = type; 229 } 230 231 @Override 232 public DateTime getActiveFromDate() { 233 return activeFromDate; 234 } 235 236 public void setActiveFromDate(final DateTime activeFromDate) { 237 this.activeFromDate = activeFromDate; 238 } 239 240 @Override 241 public DateTime getActiveToDate() { 242 return activeToDate; 243 } 244 245 public void setActiveToDate(final DateTime activeToDate) { 246 this.activeToDate = activeToDate; 247 } 248 249 @Override 250 public Long getVersionNumber() { 251 return versionNumber; 252 } 253 254 public void setVersionNumber(final Long versionNumber) { 255 this.versionNumber = versionNumber; 256 } 257 258 @Override 259 public String getObjectId() { 260 return objectId; 261 } 262 263 public void setObjectId(final String objectId) { 264 this.objectId = objectId; 265 } 266 267 @Override 268 public boolean isActive(DateTime activeAsOf) { 269 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOf); 270 } 271 272 @Override 273 public GroupMember build() { 274 return new GroupMember(this); 275 } 276 } 277 278 /** 279 * Defines some internal constants used on this class. 280 */ 281 static class Constants { 282 final static String ROOT_ELEMENT_NAME = "groupMember"; 283 final static String TYPE_NAME = "GroupMemberType"; 284 } 285 286 /** 287 * A private class which exposes constants which define the XML element names to use 288 * when this object is marshalled to XML. 289 */ 290 static class Elements { 291 final static String ID = "id"; 292 final static String GROUP_ID = "groupId"; 293 final static String MEMBER_ID = "memberId"; 294 final static String TYPE_CODE = "typeCode"; 295 } 296 297 public static class Cache { 298 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + GroupMember.Constants.TYPE_NAME; 299 } 300 }