001 /**
002 * Copyright 2005-2014 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 @Override
108 public String getId() {
109 return id;
110 }
111
112 @Override
113 public String getGroupId() {
114 return groupId;
115 }
116
117 @Override
118 public String getMemberId() {
119 return memberId;
120 }
121
122 @Override
123 public MemberType getType() {
124 return MemberType.fromCode(typeCode);
125 }
126
127 @Override
128 public DateTime getActiveFromDate() {
129 return activeFromDate;
130 }
131
132 @Override
133 public DateTime getActiveToDate() {
134 return activeToDate;
135 }
136
137 @Override
138 public Long getVersionNumber() {
139 return versionNumber;
140 }
141
142 @Override
143 public String getObjectId() {
144 return objectId;
145 }
146
147 @Override
148 public boolean isActive(DateTime activeAsOf) {
149 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOf);
150 }
151
152 @Override
153 public boolean isActive() {
154 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null);
155 }
156
157 public static class Builder implements GroupMemberContract, ModelBuilder, Serializable {
158 private String id;
159 private String groupId;
160 private String memberId;
161 private MemberType type;
162 private DateTime activeFromDate;
163 private DateTime activeToDate;
164 private Long versionNumber;
165 private String objectId;
166
167 private Builder(String groupId, String memberId, MemberType type) {
168 setGroupId(groupId);
169 setMemberId(memberId);
170 setType(type);
171 }
172
173 /**
174 * creates a Parameter with the required fields.
175 */
176 public static Builder create(String groupId, String memberId, MemberType type) {
177 return new Builder(groupId, memberId, type);
178 }
179
180 /**
181 * creates a GroupMember from an existing {@link org.kuali.rice.kim.api.group.GroupMemberContract}.
182 */
183 public static Builder create(GroupMemberContract contract) {
184 if (contract == null) {
185 throw new IllegalArgumentException("contract was null");
186 }
187 Builder builder = new Builder(contract.getGroupId(), contract.getMemberId(), contract.getType());
188 builder.setId(contract.getId());
189 builder.setActiveFromDate(contract.getActiveFromDate());
190 builder.setActiveToDate(contract.getActiveToDate());
191 builder.setVersionNumber(contract.getVersionNumber());
192 builder.setObjectId(contract.getObjectId());
193 return builder;
194 }
195
196 @Override
197 public String getId() {
198 return id;
199 }
200
201 public void setId(final String id) {
202 if (StringUtils.isWhitespace(id)) {
203 throw new IllegalArgumentException("id is blank");
204 }
205 this.id = id;
206 }
207
208 @Override
209 public String getGroupId() {
210 return groupId;
211 }
212
213 public void setGroupId(final String groupId) {
214 if (StringUtils.isEmpty(groupId)) {
215 throw new IllegalArgumentException("groupId is empty");
216 }
217 this.groupId = groupId;
218 }
219
220 @Override
221 public String getMemberId() {
222 return memberId;
223 }
224
225 public void setMemberId(final String memberId) {
226 if (StringUtils.isEmpty(memberId)) {
227 throw new IllegalArgumentException("memberId is empty");
228 }
229 this.memberId = memberId;
230 }
231
232 @Override
233 public MemberType getType() {
234 return type;
235 }
236
237 public void setType(final MemberType type) {
238 if (type == null) {
239 throw new IllegalArgumentException("type is null");
240 }
241 this.type = type;
242 }
243
244 @Override
245 public DateTime getActiveFromDate() {
246 return activeFromDate;
247 }
248
249 public void setActiveFromDate(final DateTime activeFromDate) {
250 this.activeFromDate = activeFromDate;
251 }
252
253 @Override
254 public DateTime getActiveToDate() {
255 return activeToDate;
256 }
257
258 public void setActiveToDate(final DateTime activeToDate) {
259 this.activeToDate = activeToDate;
260 }
261
262 @Override
263 public Long getVersionNumber() {
264 return versionNumber;
265 }
266
267 public void setVersionNumber(final Long versionNumber) {
268 this.versionNumber = versionNumber;
269 }
270
271 @Override
272 public String getObjectId() {
273 return objectId;
274 }
275
276 public void setObjectId(final String objectId) {
277 this.objectId = objectId;
278 }
279
280 @Override
281 public boolean isActive(DateTime activeAsOf) {
282 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOf);
283 }
284
285 @Override
286 public boolean isActive() {
287 return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null);
288 }
289
290 @Override
291 public GroupMember build() {
292 return new GroupMember(this);
293 }
294 }
295
296 /**
297 * Defines some internal constants used on this class.
298 */
299 static class Constants {
300 final static String ROOT_ELEMENT_NAME = "groupMember";
301 final static String TYPE_NAME = "GroupMemberType";
302 }
303
304 /**
305 * A private class which exposes constants which define the XML element names to use
306 * when this object is marshalled to XML.
307 */
308 static class Elements {
309 final static String ID = "id";
310 final static String GROUP_ID = "groupId";
311 final static String MEMBER_ID = "memberId";
312 final static String TYPE_CODE = "typeCode";
313 }
314
315 public static class Cache {
316 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + GroupMember.Constants.TYPE_NAME;
317 }
318 }