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}