001    /**
002     * Copyright 2005-2012 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    }