001/**
002 * Copyright 2005-2018 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 */
016package org.kuali.rice.kim.api.identity.type;
017
018import org.apache.commons.collections.CollectionUtils;
019import org.apache.commons.lang.StringUtils;
020import org.kuali.rice.core.api.CoreConstants;
021import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
022import org.kuali.rice.core.api.mo.ModelBuilder;
023import org.kuali.rice.kim.api.identity.EntityUtils;
024import org.kuali.rice.kim.api.identity.CodedAttribute;
025import org.kuali.rice.kim.api.identity.CodedAttributeContract;
026import org.kuali.rice.kim.api.identity.address.EntityAddress;
027import org.kuali.rice.kim.api.identity.address.EntityAddressContract;
028import org.kuali.rice.kim.api.identity.email.EntityEmail;
029import org.kuali.rice.kim.api.identity.email.EntityEmailContract;
030import org.kuali.rice.kim.api.identity.phone.EntityPhone;
031import org.kuali.rice.kim.api.identity.phone.EntityPhoneContract;
032import org.w3c.dom.Element;
033
034import javax.xml.bind.annotation.XmlAccessType;
035import javax.xml.bind.annotation.XmlAccessorType;
036import javax.xml.bind.annotation.XmlAnyElement;
037import javax.xml.bind.annotation.XmlElement;
038import javax.xml.bind.annotation.XmlElementWrapper;
039import javax.xml.bind.annotation.XmlRootElement;
040import javax.xml.bind.annotation.XmlType;
041import java.io.Serializable;
042import java.util.ArrayList;
043import java.util.Collection;
044import java.util.List;
045
046@XmlRootElement(name = EntityTypeContactInfo.Constants.ROOT_ELEMENT_NAME)
047@XmlAccessorType(XmlAccessType.NONE)
048@XmlType(name = EntityTypeContactInfo.Constants.TYPE_NAME, propOrder = {
049    EntityTypeContactInfo.Elements.ENTITY_ID,
050    EntityTypeContactInfo.Elements.ENTITY_TYPE_CODE,
051    EntityTypeContactInfo.Elements.ENTITY_TYPE,
052    EntityTypeContactInfo.Elements.ADDRESSES,
053    EntityTypeContactInfo.Elements.EMAIL_ADDRESSES,
054    EntityTypeContactInfo.Elements.PHONE_NUMBERS,
055    EntityTypeContactInfo.Elements.DEFAULT_ADDRESS,
056    EntityTypeContactInfo.Elements.DEFAULT_EMAIL_ADDRESS,
057    EntityTypeContactInfo.Elements.DEFAULT_PHONE_NUMBER,
058    CoreConstants.CommonElements.VERSION_NUMBER,
059    CoreConstants.CommonElements.OBJECT_ID,
060    EntityTypeContactInfo.Elements.ACTIVE,
061    CoreConstants.CommonElements.FUTURE_ELEMENTS
062})
063public final class EntityTypeContactInfo extends AbstractDataTransferObject
064    implements EntityTypeContactInfoContract
065{
066
067    @XmlElement(name = Elements.ENTITY_ID, required = true)
068    private final String entityId;
069
070    @XmlElement(name = Elements.ENTITY_TYPE_CODE, required = true)
071    private final String entityTypeCode;
072
073    @XmlElement(name = Elements.ENTITY_TYPE, required = false)
074    private final CodedAttribute entityType;
075
076    @XmlElementWrapper(name = Elements.ADDRESSES, required = false)
077    @XmlElement(name = Elements.ADDRESS, required = false)
078    private final List<EntityAddress> addresses;
079
080    @XmlElementWrapper(name = Elements.EMAIL_ADDRESSES, required = false)
081    @XmlElement(name = Elements.EMAIL_ADDRESS, required = false)
082    private final List<EntityEmail> emailAddresses;
083
084    @XmlElementWrapper(name = Elements.PHONE_NUMBERS, required = false)
085    @XmlElement(name = Elements.PHONE_NUMBER, required = false)
086    private final List<EntityPhone> phoneNumbers;
087
088    @XmlElement(name = Elements.DEFAULT_ADDRESS, required = false)
089    private final EntityAddress defaultAddress;
090
091    @XmlElement(name = Elements.DEFAULT_EMAIL_ADDRESS, required = false)
092    private final EntityEmail defaultEmailAddress;
093
094    @XmlElement(name = Elements.DEFAULT_PHONE_NUMBER, required = false)
095    private final EntityPhone defaultPhoneNumber;
096
097    @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
098    private final Long versionNumber;
099
100    @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
101    private final String objectId;
102
103    @XmlElement(name = Elements.ACTIVE, required = false)
104    private final boolean active;
105
106    @SuppressWarnings("unused")
107    @XmlAnyElement
108    private final Collection<Element> _futureElements = null;
109
110    /**
111     * Private constructor used only by JAXB.
112     */
113    private EntityTypeContactInfo() {
114        this.entityId = null;
115        this.entityTypeCode = null;
116        this.entityType = null;
117        this.addresses = null;
118        this.emailAddresses = null;
119        this.phoneNumbers = null;
120        this.defaultAddress = null;
121        this.defaultEmailAddress = null;
122        this.defaultPhoneNumber = null;
123        this.versionNumber = null;
124        this.objectId = null;
125        this.active = false;
126    }
127
128    private EntityTypeContactInfo(Builder builder) {
129        this.entityId = builder.getEntityId();
130        this.entityTypeCode = builder.getEntityTypeCode();
131        this.entityType = (builder.getEntityType() != null) ? builder.getEntityType().build() : null;
132        this.addresses = new ArrayList<EntityAddress>();
133        if (!CollectionUtils.isEmpty(builder.getAddresses())) {
134            for (EntityAddress.Builder address : builder.getAddresses()) {
135                this.addresses.add(address.build());
136            }
137        }
138
139        this.emailAddresses = new ArrayList<EntityEmail>();
140        if (!CollectionUtils.isEmpty(builder.getEmailAddresses())) {
141            for (EntityEmail.Builder email : builder.getEmailAddresses()) {
142                this.emailAddresses.add(email.build());
143            }
144        }
145        this.phoneNumbers = new ArrayList<EntityPhone>();
146        if (!CollectionUtils.isEmpty(builder.getPhoneNumbers())) {
147            for (EntityPhone.Builder phoneNumber : builder.getPhoneNumbers()) {
148                this.phoneNumbers.add(phoneNumber.build());
149            }
150        }
151        this.defaultAddress = builder.getDefaultAddress() != null ? builder.getDefaultAddress().build() : null;
152        this.defaultEmailAddress = builder.getDefaultEmailAddress() != null ? builder.getDefaultEmailAddress().build() : null;
153        this.defaultPhoneNumber = builder.getDefaultPhoneNumber() != null ? builder.getDefaultPhoneNumber().build() : null;
154        this.versionNumber = builder.getVersionNumber();
155        this.objectId = builder.getObjectId();
156        this.active = builder.isActive();
157    }
158
159    @Override
160    public String getEntityId() {
161        return this.entityId;
162    }
163
164    @Override
165    public String getEntityTypeCode() {
166        return this.entityTypeCode;
167    }
168
169    @Override
170    public CodedAttributeContract getEntityType() {
171        return this.entityType;
172    }
173
174    @Override
175    public List<EntityAddress> getAddresses() {
176        return this.addresses;
177    }
178
179    @Override
180    public List<EntityEmail> getEmailAddresses() {
181        return this.emailAddresses;
182    }
183
184    @Override
185    public List<EntityPhone> getPhoneNumbers() {
186        return this.phoneNumbers;
187    }
188
189    @Override
190    public EntityAddressContract getDefaultAddress() {
191        return this.defaultAddress;
192    }
193
194    @Override
195    public EntityEmail getDefaultEmailAddress() {
196        return this.defaultEmailAddress;
197    }
198
199    @Override
200    public EntityPhoneContract getDefaultPhoneNumber() {
201        return this.defaultPhoneNumber;
202    }
203
204    @Override
205    public Long getVersionNumber() {
206        return this.versionNumber;
207    }
208
209    @Override
210    public String getObjectId() {
211        return this.objectId;
212    }
213
214    @Override
215    public boolean isActive() {
216        return this.active;
217    }
218
219
220    /**
221     * A builder which can be used to construct {@link EntityTypeContactInfo} instances.  Enforces the constraints of the {@link EntityTypeContactInfoContract}.
222     *
223     */
224    public final static class Builder
225        implements Serializable, ModelBuilder, EntityTypeContactInfoContract
226    {
227        private String entityId;
228        private String entityTypeCode;
229        private CodedAttribute.Builder entityType;
230        private List<EntityAddress.Builder> addresses;
231        private List<EntityEmail.Builder> emailAddresses;
232        private List<EntityPhone.Builder> phoneNumbers;
233        private Long versionNumber;
234        private String objectId;
235        private boolean active;
236
237        private Builder(String entityId, String entityTypeCode) {
238            setEntityId(entityId);
239            setEntityTypeCode(entityTypeCode);
240            setEntityType(CodedAttribute.Builder.create(entityTypeCode));
241        }
242
243        public static Builder create(String entityId, String entityTypeCode) {
244            return new Builder(entityId, entityTypeCode);
245        }
246
247        public static Builder create(EntityTypeContactInfoContract contract) {
248            if (contract == null) {
249                throw new IllegalArgumentException("contract was null");
250            }
251            Builder builder = create(contract.getEntityId(), contract.getEntityTypeCode());
252            if (contract.getEntityType() != null) {
253                builder.setEntityType(CodedAttribute.Builder.create(contract.getEntityType()));
254            }
255            builder.addresses = new ArrayList<EntityAddress.Builder>();
256            if (!CollectionUtils.isEmpty(contract.getAddresses())) {
257                for (EntityAddressContract addressContract : contract.getAddresses()) {
258                    builder.addresses.add(EntityAddress.Builder.create(addressContract));
259                }
260            }
261            builder.emailAddresses = new ArrayList<EntityEmail.Builder>();
262            if (!CollectionUtils.isEmpty(contract.getEmailAddresses())) {
263                for (EntityEmailContract emailContract : contract.getEmailAddresses()) {
264                    builder.emailAddresses.add(EntityEmail.Builder.create(emailContract));
265                }
266            }
267            builder.phoneNumbers = new ArrayList<EntityPhone.Builder>();
268            if (!CollectionUtils.isEmpty(contract.getPhoneNumbers())) {
269                for (EntityPhoneContract phoneContract : contract.getPhoneNumbers()) {
270                    builder.phoneNumbers.add(EntityPhone.Builder.create(phoneContract));
271                }
272            }
273            builder.setVersionNumber(contract.getVersionNumber());
274            builder.setObjectId(contract.getObjectId());
275            builder.setActive(contract.isActive());
276            return builder;
277        }
278
279        public EntityTypeContactInfo build() {
280            return new EntityTypeContactInfo(this);
281        }
282
283        @Override
284        public String getEntityId() {
285            return this.entityId;
286        }
287
288        @Override
289        public String getEntityTypeCode() {
290            return this.entityTypeCode;
291        }
292
293        @Override
294        public CodedAttribute.Builder getEntityType() {
295            return this.entityType;
296        }
297
298        @Override
299        public List<EntityAddress.Builder> getAddresses() {
300            return this.addresses;
301        }
302
303        @Override
304        public List<EntityEmail.Builder> getEmailAddresses() {
305            return this.emailAddresses;
306        }
307
308        @Override
309        public List<EntityPhone.Builder> getPhoneNumbers() {
310            return this.phoneNumbers;
311        }
312
313        @Override
314        public EntityAddress.Builder getDefaultAddress() {
315            return EntityUtils.getDefaultItem(this.addresses);
316        }
317
318        @Override
319        public EntityEmail.Builder getDefaultEmailAddress() {
320            return EntityUtils.getDefaultItem(this.emailAddresses);
321        }
322
323        @Override
324        public EntityPhone.Builder getDefaultPhoneNumber() {
325            return EntityUtils.getDefaultItem(this.phoneNumbers);
326        }
327
328        @Override
329        public Long getVersionNumber() {
330            return this.versionNumber;
331        }
332
333        @Override
334        public String getObjectId() {
335            return this.objectId;
336        }
337
338        @Override
339        public boolean isActive() {
340            return this.active;
341        }
342
343        public void setEntityId(String entityId) {
344            if (StringUtils.isEmpty(entityId)) {
345                throw new IllegalArgumentException("entityId is empty");
346            }
347            this.entityId = entityId;
348        }
349
350        public void setEntityTypeCode(String entityTypeCode) {
351            if (StringUtils.isEmpty(entityTypeCode)) {
352                throw new IllegalArgumentException("entityTypeCode is empty");
353            }
354            this.entityTypeCode = entityTypeCode;
355        }
356
357        public void setEntityType(CodedAttribute.Builder entityType) {
358            this.entityType = entityType;
359        }
360
361        public void setAddresses(List addresses) {
362            this.addresses = addresses;
363        }
364
365        public void setEmailAddresses(List emailAddresses) {
366            this.emailAddresses = emailAddresses;
367        }
368
369        public void setPhoneNumbers(List phoneNumbers) {
370            this.phoneNumbers = phoneNumbers;
371        }
372
373        public void setVersionNumber(Long versionNumber) {
374            this.versionNumber = versionNumber;
375        }
376
377        public void setObjectId(String objectId) {
378            this.objectId = objectId;
379        }
380
381        public void setActive(boolean active) {
382            this.active = active;
383        }
384    }
385
386
387    /**
388     * Defines some internal constants used on this class.
389     *
390     */
391    static class Constants {
392
393        final static String ROOT_ELEMENT_NAME = "entityTypeContactInfo";
394        final static String TYPE_NAME = "EntityTypeContactInfoType";
395    }
396
397
398    /**
399     * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
400     *
401     */
402    static class Elements {
403
404        final static String ENTITY_ID = "entityId";
405        final static String ENTITY_TYPE_CODE = "entityTypeCode";
406        final static String ENTITY_TYPE = "entityType";
407        final static String ADDRESSES = "addresses";
408        final static String ADDRESS = "address";
409        final static String EMAIL_ADDRESSES = "emailAddresses";
410        final static String EMAIL_ADDRESS = "emailAddress";
411        final static String PHONE_NUMBERS = "phoneNumbers";
412        final static String PHONE_NUMBER = "phoneNumber";
413        final static String DEFAULT_ADDRESS = "defaultAddress";
414        final static String DEFAULT_EMAIL_ADDRESS = "defaultEmailAddress";
415        final static String DEFAULT_PHONE_NUMBER = "defaultPhoneNumber";
416        final static String ACTIVE = "active";
417
418    }
419
420}