001    /**
002     * Copyright 2005-2013 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.identity.external;
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.mo.AbstractDataTransferObject;
022    import org.kuali.rice.core.api.mo.ModelBuilder;
023    import org.kuali.rice.core.api.mo.common.active.InactivatableFromToUtils;
024    import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
025    import org.w3c.dom.Element;
026    
027    import javax.xml.bind.annotation.XmlAccessType;
028    import javax.xml.bind.annotation.XmlAccessorType;
029    import javax.xml.bind.annotation.XmlAnyElement;
030    import javax.xml.bind.annotation.XmlElement;
031    import javax.xml.bind.annotation.XmlRootElement;
032    import javax.xml.bind.annotation.XmlType;
033    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
034    import java.io.Serializable;
035    import java.util.Collection;
036    
037    @XmlRootElement(name = EntityExternalIdentifierHistory.Constants.ROOT_ELEMENT_NAME)
038    @XmlAccessorType(XmlAccessType.NONE)
039    @XmlType(name = EntityExternalIdentifierHistory.Constants.TYPE_NAME, propOrder = {
040        EntityExternalIdentifierHistory.Elements.ID,
041        EntityExternalIdentifierHistory.Elements.ENTITY_ID,
042        EntityExternalIdentifierHistory.Elements.EXTERNAL_IDENTIFIER_TYPE_CODE,
043        EntityExternalIdentifierHistory.Elements.EXTERNAL_IDENTIFIER_TYPE,
044        EntityExternalIdentifierHistory.Elements.EXTERNAL_ID,
045        CoreConstants.CommonElements.HISTORY_ID,
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 final class EntityExternalIdentifierHistory extends AbstractDataTransferObject
053        implements EntityExternalIdentifierHistoryContract
054    {
055        @XmlElement(name = Elements.ENTITY_ID, required = false)
056        private final String entityId;
057        @XmlElement(name = Elements.EXTERNAL_IDENTIFIER_TYPE_CODE, required = false)
058        private final String externalIdentifierTypeCode;
059        @XmlElement(name = Elements.EXTERNAL_IDENTIFIER_TYPE, required = false)
060        private final EntityExternalIdentifierTypeHistory externalIdentifierType;
061        @XmlElement(name = Elements.EXTERNAL_ID, required = false)
062        private final String externalId;
063        @XmlElement(name = CoreConstants.CommonElements.HISTORY_ID, required = false)
064        private final Long historyId;
065        @XmlElement(name = CoreConstants.CommonElements.ACTIVE_FROM_DATE, required = false)
066        @XmlJavaTypeAdapter(DateTimeAdapter.class)
067        private final DateTime activeFromDate;
068        @XmlElement(name = CoreConstants.CommonElements.ACTIVE_TO_DATE, required = false)
069        @XmlJavaTypeAdapter(DateTimeAdapter.class)
070        private final DateTime activeToDate;
071        @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
072        private final Long versionNumber;
073        @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
074        private final String objectId;
075        @XmlElement(name = Elements.ID, required = false)
076        private final String id;
077        @SuppressWarnings("unused")
078        @XmlAnyElement
079        private final Collection<Element> _futureElements = null;
080    
081        /**
082         * Private constructor used only by JAXB.
083         *
084         */
085        private EntityExternalIdentifierHistory() {
086            this.entityId = null;
087            this.externalIdentifierTypeCode = null;
088            this.externalIdentifierType = null;
089            this.externalId = null;
090            this.versionNumber = null;
091            this.objectId = null;
092            this.id = null;
093            this.historyId = null;
094            this.activeFromDate = null;
095            this.activeToDate = null;
096        }
097    
098        private EntityExternalIdentifierHistory(Builder builder) {
099            this.entityId = builder.getEntityId();
100            this.externalIdentifierTypeCode = builder.getExternalIdentifierTypeCode();
101            this.externalIdentifierType = builder.getExternalIdentifierType() != null ? builder.getExternalIdentifierType().build() : null;
102            this.externalId = builder.getExternalId();
103            this.versionNumber = builder.getVersionNumber();
104            this.objectId = builder.getObjectId();
105            this.id = builder.getId();
106            this.historyId = builder.getHistoryId();
107            this.activeFromDate = builder.getActiveFromDate();
108            this.activeToDate = builder.getActiveToDate();
109        }
110    
111        @Override
112        public String getEntityId() {
113            return this.entityId;
114        }
115    
116        @Override
117        public String getExternalIdentifierTypeCode() {
118            return this.externalIdentifierTypeCode;
119        }
120    
121        @Override
122        public EntityExternalIdentifierTypeHistory getExternalIdentifierType() {
123            return this.externalIdentifierType;
124        }
125    
126        @Override
127        public String getExternalId() {
128            return this.externalId;
129        }
130    
131        @Override
132        public Long getVersionNumber() {
133            return this.versionNumber;
134        }
135    
136        @Override
137        public String getObjectId() {
138            return this.objectId;
139        }
140    
141        @Override
142        public String getId() {
143            return this.id;
144        }
145    
146        @Override
147        public Long getHistoryId() {
148            return this.historyId;
149        }
150    
151        @Override
152        public DateTime getActiveFromDate() {
153            return this.activeFromDate;
154        }
155    
156        @Override
157        public DateTime getActiveToDate() {
158            return this.activeToDate;
159        }
160    
161        @Override
162        public boolean isActiveNow() {
163            return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null);
164        }
165    
166        @Override
167        public boolean isActive(DateTime activeAsOf) {
168            return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOf);
169        }
170    
171        @Override
172        public boolean isActive() {
173            return isActiveNow();
174        }
175    
176        /**
177         * A builder which can be used to construct {@link org.kuali.rice.kim.api.identity.external.EntityExternalIdentifierHistory} instances.  Enforces the constraints of the {@link org.kuali.rice.kim.api.identity.external.EntityExternalIdentifierContract}.
178         * 
179         */
180        public final static class Builder
181            implements Serializable, ModelBuilder, EntityExternalIdentifierHistoryContract
182        {
183    
184            private String entityId;
185            private String externalIdentifierTypeCode;
186            private EntityExternalIdentifierTypeHistory.Builder externalIdentifierType;
187            private String externalId;
188            private Long versionNumber;
189            private String objectId;
190            private String id;
191            private Long historyId;
192            private DateTime activeFromDate;
193            private DateTime activeToDate;
194    
195            private Builder() { }
196    
197            public static Builder create() {
198                return new Builder();
199            }
200    
201            public static Builder create(EntityExternalIdentifierHistoryContract contract) {
202                if (contract == null) {
203                    throw new IllegalArgumentException("contract was null");
204                }
205                Builder builder = create();
206                builder.setEntityId(contract.getEntityId());
207                builder.setExternalIdentifierTypeCode(contract.getExternalIdentifierTypeCode());
208                if (contract.getExternalIdentifierType() != null) {
209                    builder.setExternalIdentifierType(
210                            EntityExternalIdentifierTypeHistory.Builder.create(contract.getExternalIdentifierType()));
211                }
212                builder.setExternalId(contract.getExternalId());
213                builder.setVersionNumber(contract.getVersionNumber());
214                builder.setObjectId(contract.getObjectId());
215                builder.setId(contract.getId());
216                builder.setHistoryId(contract.getHistoryId());
217                builder.setActiveFromDate(contract.getActiveFromDate());
218                builder.setActiveToDate(contract.getActiveToDate());
219                return builder;
220            }
221    
222            public EntityExternalIdentifierHistory build() {
223                return new EntityExternalIdentifierHistory(this);
224            }
225    
226            @Override
227            public String getEntityId() {
228                return this.entityId;
229            }
230    
231            @Override
232            public String getExternalIdentifierTypeCode() {
233                return this.externalIdentifierTypeCode;
234            }
235    
236            @Override
237            public EntityExternalIdentifierTypeHistory.Builder getExternalIdentifierType() {
238                return this.externalIdentifierType;
239            }
240    
241            @Override
242            public String getExternalId() {
243                return this.externalId;
244            }
245    
246            @Override
247            public Long getVersionNumber() {
248                return this.versionNumber;
249            }
250    
251            @Override
252            public String getObjectId() {
253                return this.objectId;
254            }
255    
256            @Override
257            public String getId() {
258                return this.id;
259            }
260    
261            @Override
262            public Long getHistoryId() {
263                return this.historyId;
264            }
265    
266            @Override
267            public boolean isActiveNow() {
268                return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, null);
269            }
270    
271            @Override
272            public boolean isActive(DateTime activeAsOf) {
273                return InactivatableFromToUtils.isActive(activeFromDate, activeToDate, activeAsOf);
274            }
275    
276            @Override
277            public DateTime getActiveFromDate() {
278                return this.activeFromDate;
279            }
280    
281            @Override
282            public boolean isActive() {
283                return isActiveNow();
284            }
285    
286            @Override
287            public DateTime getActiveToDate() {
288                return this.activeToDate;
289            }
290    
291            public void setHistoryId(Long historyId) {
292                this.historyId = historyId;
293            }
294    
295            public void setActiveFromDate(DateTime activeFromDate) {
296                this.activeFromDate = activeFromDate;
297            }
298    
299            public void setActiveToDate(DateTime activeToDate) {
300                this.activeToDate = activeToDate;
301            }
302    
303            public void setEntityId(String entityId) {
304                this.entityId = entityId;
305            }
306    
307            public void setExternalIdentifierTypeCode(String externalIdentifierTypeCode) {
308                this.externalIdentifierTypeCode = externalIdentifierTypeCode;
309            }
310    
311            public void setExternalIdentifierType(EntityExternalIdentifierTypeHistory.Builder externalIdentifierType) {
312                this.externalIdentifierType = externalIdentifierType;
313            }
314    
315            public void setExternalId(String externalId) {
316                this.externalId = externalId;
317            }
318    
319            public void setVersionNumber(Long versionNumber) {
320                this.versionNumber = versionNumber;
321            }
322    
323            public void setObjectId(String objectId) {
324                this.objectId = objectId;
325            }
326    
327            public void setId(String id) {
328                if (StringUtils.isWhitespace(id)) {
329                    throw new IllegalArgumentException("id is blank");
330                }
331                this.id = id;
332            }
333    
334        }
335    
336    
337        /**
338         * Defines some internal constants used on this class.
339         * 
340         */
341        static class Constants {
342    
343            final static String ROOT_ELEMENT_NAME = "entityExternalIdentifier";
344            final static String TYPE_NAME = "EntityExternalIdentifierType";
345        }
346    
347    
348        /**
349         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
350         * 
351         */
352        static class Elements {
353    
354            final static String ENTITY_ID = "entityId";
355            final static String EXTERNAL_IDENTIFIER_TYPE = "externalIdentifierType";
356            final static String EXTERNAL_IDENTIFIER_TYPE_CODE = "externalIdentifierTypeCode";
357            final static String EXTERNAL_ID = "externalId";
358            final static String ID = "id";
359    
360        }
361    
362    }