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.identity.entity;
017    
018    import org.apache.commons.collections.CollectionUtils;
019    import org.apache.commons.lang.StringUtils;
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.kim.api.KimConstants;
024    import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliation;
025    import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliationContract;
026    import org.kuali.rice.kim.api.identity.citizenship.EntityCitizenship;
027    import org.kuali.rice.kim.api.identity.citizenship.EntityCitizenshipContract;
028    import org.kuali.rice.kim.api.identity.employment.EntityEmployment;
029    import org.kuali.rice.kim.api.identity.employment.EntityEmploymentContract;
030    import org.kuali.rice.kim.api.identity.external.EntityExternalIdentifier;
031    import org.kuali.rice.kim.api.identity.external.EntityExternalIdentifierContract;
032    import org.kuali.rice.kim.api.identity.name.EntityName;
033    import org.kuali.rice.kim.api.identity.name.EntityNameContract;
034    import org.kuali.rice.kim.api.identity.personal.EntityBioDemographics;
035    import org.kuali.rice.kim.api.identity.personal.EntityEthnicity;
036    import org.kuali.rice.kim.api.identity.personal.EntityEthnicityContract;
037    import org.kuali.rice.kim.api.identity.principal.Principal;
038    import org.kuali.rice.kim.api.identity.principal.PrincipalContract;
039    import org.kuali.rice.kim.api.identity.privacy.EntityPrivacyPreferences;
040    import org.kuali.rice.kim.api.identity.residency.EntityResidency;
041    import org.kuali.rice.kim.api.identity.residency.EntityResidencyContract;
042    import org.kuali.rice.kim.api.identity.type.EntityTypeContactInfo;
043    import org.kuali.rice.kim.api.identity.type.EntityTypeContactInfoContract;
044    import org.kuali.rice.kim.api.identity.visa.EntityVisa;
045    import org.kuali.rice.kim.api.identity.visa.EntityVisaContract;
046    import org.w3c.dom.Element;
047    
048    import javax.xml.bind.annotation.XmlAccessType;
049    import javax.xml.bind.annotation.XmlAccessorType;
050    import javax.xml.bind.annotation.XmlAnyElement;
051    import javax.xml.bind.annotation.XmlElement;
052    import javax.xml.bind.annotation.XmlElementWrapper;
053    import javax.xml.bind.annotation.XmlRootElement;
054    import javax.xml.bind.annotation.XmlType;
055    import java.io.Serializable;
056    import java.util.ArrayList;
057    import java.util.Collection;
058    import java.util.List;
059    
060    @XmlRootElement(name = Entity.Constants.ROOT_ELEMENT_NAME)
061    @XmlAccessorType(XmlAccessType.NONE)
062    @XmlType(name = Entity.Constants.TYPE_NAME, propOrder = {
063        Entity.Elements.ID,
064        Entity.Elements.PRINCIPALS,
065        Entity.Elements.ENTITY_TYPE_CONTACT_INFOS,
066        Entity.Elements.EXTERNAL_IDENTIFIERS,
067        Entity.Elements.AFFILIATIONS,
068        Entity.Elements.NAMES,
069        Entity.Elements.EMPLOYMENT_INFORMATION,
070        Entity.Elements.PRIVACY_PREFERENCES,
071        Entity.Elements.BIO_DEMOGRAPHICS,
072        Entity.Elements.CITIZENSHIPS,
073        Entity.Elements.PRIMARY_EMPLOYMENT,
074        Entity.Elements.DEFAULT_AFFILIATION,
075        Entity.Elements.DEFAULT_NAME,
076        Entity.Elements.ETHNICITIES,
077        Entity.Elements.RESIDENCIES,
078        Entity.Elements.VISAS,
079        CoreConstants.CommonElements.VERSION_NUMBER,
080        CoreConstants.CommonElements.OBJECT_ID,
081        Entity.Elements.ACTIVE,
082        CoreConstants.CommonElements.FUTURE_ELEMENTS
083    })
084    public final class Entity extends AbstractDataTransferObject
085        implements EntityContract
086    {
087        @XmlElement(name = Elements.ID, required = false)
088        private final String id;
089    
090        @XmlElementWrapper(name = Elements.PRINCIPALS, required = false)
091        @XmlElement(name = Elements.PRINCIPAL, required = false)
092        private final List<Principal> principals;
093    
094        @XmlElementWrapper(name = Elements.ENTITY_TYPE_CONTACT_INFOS, required = false)
095        @XmlElement(name = Elements.ENTITY_TYPE_CONTACT_INFO, required = false)
096        private final List<EntityTypeContactInfo> entityTypeContactInfos;
097    
098        @XmlElementWrapper(name = Elements.EXTERNAL_IDENTIFIERS, required = false)
099        @XmlElement(name = Elements.EXTERNAL_IDENTIFIER, required = false)
100        private final List<EntityExternalIdentifier> externalIdentifiers;
101    
102        @XmlElementWrapper(name = Elements.AFFILIATIONS, required = false)
103        @XmlElement(name = Elements.AFFILIATION, required = false)
104        private final List<EntityAffiliation> affiliations;
105    
106        @XmlElementWrapper(name = Elements.NAMES, required = false)
107        @XmlElement(name = Elements.NAME, required = false)
108        private final List<EntityName> names;
109    
110        @XmlElementWrapper(name = Elements.EMPLOYMENT_INFORMATION, required = false)
111        @XmlElement(name = Elements.EMPLOYMENT, required = false)
112        private final List<EntityEmployment> employmentInformation;
113    
114        @XmlElement(name = Elements.PRIVACY_PREFERENCES, required = false)
115        private final EntityPrivacyPreferences privacyPreferences;
116    
117        @XmlElement(name = Elements.BIO_DEMOGRAPHICS, required = false)
118        private final EntityBioDemographics bioDemographics;
119    
120        @XmlElementWrapper(name = Elements.CITIZENSHIPS, required = false)
121        @XmlElement(name = Elements.CITIZENSHIP, required = false)
122        private final List<EntityCitizenship> citizenships;
123    
124        @XmlElement(name = Elements.PRIMARY_EMPLOYMENT, required = false)
125        private final EntityEmployment primaryEmployment;
126    
127        @XmlElement(name = Elements.DEFAULT_AFFILIATION, required = false)
128        private final EntityAffiliation defaultAffiliation;
129    
130        @XmlElement(name = Elements.DEFAULT_NAME, required = false)
131        private final EntityName defaultName;
132    
133        @XmlElementWrapper(name = Elements.ETHNICITIES, required = false)
134        @XmlElement(name = Elements.ETHNICITY, required = false)
135        private final List<EntityEthnicity> ethnicities;
136    
137        @XmlElementWrapper(name = Elements.RESIDENCIES, required = false)
138        @XmlElement(name = Elements.RESIDENCY, required = false)
139        private final List<EntityResidency> residencies;
140    
141        @XmlElementWrapper(name = Elements.VISAS, required = false)
142        @XmlElement(name = Elements.VISA, required = false)
143        private final List<EntityVisa> visas;
144    
145        @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
146        private final Long versionNumber;
147    
148        @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
149        private final String objectId;
150    
151        @XmlElement(name = Elements.ACTIVE, required = false)
152        private final boolean active;
153    
154        @SuppressWarnings("unused")
155        @XmlAnyElement
156        private final Collection<Element> _futureElements = null;
157    
158        /**
159         * Private constructor used only by JAXB.
160         * 
161         */
162        private Entity() {
163            this.principals = null;
164            this.entityTypeContactInfos = null;
165            this.externalIdentifiers = null;
166            this.affiliations = null;
167            this.names = null;
168            this.employmentInformation = null;
169            this.privacyPreferences = null;
170            this.bioDemographics = null;
171            this.citizenships = null;
172            this.primaryEmployment = null;
173            this.defaultAffiliation = null;
174            this.defaultName = null;
175            this.ethnicities = null;
176            this.residencies = null;
177            this.visas = null;
178            this.versionNumber = null;
179            this.objectId = null;
180            this.active = false;
181            this.id = null;
182        }
183    
184        private Entity(Builder builder) {
185            this.principals = new ArrayList<Principal>();
186            if (CollectionUtils.isNotEmpty(builder.getPrincipals())) {
187                for (Principal.Builder principal : builder.getPrincipals()) {
188                    this.principals.add(principal.build());
189                }
190            }
191            this.entityTypeContactInfos = new ArrayList<EntityTypeContactInfo>();
192            if (CollectionUtils.isNotEmpty(builder.getEntityTypeContactInfos())) {
193                for (EntityTypeContactInfo.Builder entityTypeData : builder.getEntityTypeContactInfos()) {
194                    this.entityTypeContactInfos.add(entityTypeData.build());
195                }
196            }
197            this.externalIdentifiers = new ArrayList<EntityExternalIdentifier>();
198            if (CollectionUtils.isNotEmpty(builder.getExternalIdentifiers())) {
199                for (EntityExternalIdentifier.Builder externalId : builder.getExternalIdentifiers()) {
200                    this.externalIdentifiers.add(externalId.build());
201                }
202            }
203            this.affiliations = new ArrayList<EntityAffiliation>();
204            if (CollectionUtils.isNotEmpty(builder.getAffiliations())) {
205                for (EntityAffiliation.Builder affiliation : builder.getAffiliations()) {
206                    this.affiliations.add(affiliation.build());
207                }
208            }
209            this.names = new ArrayList<EntityName>();
210            if (CollectionUtils.isNotEmpty(builder.getNames())) {
211                for (EntityName.Builder name : builder.getNames()) {
212                    this.names.add(name.build());
213                }
214            }
215            this.employmentInformation = new ArrayList<EntityEmployment>();
216            if (CollectionUtils.isNotEmpty(builder.getEmploymentInformation())) {
217                for (EntityEmployment.Builder employment : builder.getEmploymentInformation()) {
218                    this.employmentInformation.add(employment.build());
219                }
220            }
221            this.privacyPreferences = builder.getPrivacyPreferences() == null ? null : builder.getPrivacyPreferences().build();
222            this.bioDemographics = builder.getBioDemographics() == null ? null : builder.getBioDemographics().build();
223            this.citizenships = new ArrayList<EntityCitizenship>();
224            if (CollectionUtils.isNotEmpty(builder.getCitizenships())) {
225                for (EntityCitizenship.Builder citizenship : builder.getCitizenships()) {
226                    this.citizenships.add(citizenship.build());
227                }
228            }
229            this.primaryEmployment = builder.getPrimaryEmployment() == null ? null : builder.getPrimaryEmployment().build();
230            this.defaultAffiliation = builder.getDefaultAffiliation() == null ? null : builder.getDefaultAffiliation().build();
231            this.defaultName = builder.getDefaultName() == null ? null : builder.getDefaultName().build();
232            this.ethnicities = new ArrayList<EntityEthnicity>();
233            if (CollectionUtils.isNotEmpty(builder.getEthnicities())) {
234                for (EntityEthnicity.Builder ethnicity : builder.getEthnicities()) {
235                    this.ethnicities.add(ethnicity.build());
236                }
237            }
238            this.residencies = new ArrayList<EntityResidency>();
239            if (CollectionUtils.isNotEmpty(builder.getResidencies())) {
240                for (EntityResidency.Builder residency : builder.getResidencies()) {
241                    this.residencies.add(residency.build());
242                }
243            }
244            this.visas = new ArrayList<EntityVisa>();
245            if (CollectionUtils.isNotEmpty(builder.getVisas())) {
246                for (EntityVisa.Builder visa : builder.getVisas()) {
247                    this.visas.add(visa.build());
248                }
249            }
250            this.versionNumber = builder.getVersionNumber();
251            this.objectId = builder.getObjectId();
252            this.active = builder.isActive();
253            this.id = builder.getId();
254        }
255    
256        @Override
257        public List<Principal> getPrincipals() {
258            return this.principals;
259        }
260    
261        @Override
262        public List<EntityTypeContactInfo> getEntityTypeContactInfos() {
263            return this.entityTypeContactInfos;
264        }
265    
266        @Override
267        public List<EntityExternalIdentifier> getExternalIdentifiers() {
268            return this.externalIdentifiers;
269        }
270    
271        @Override
272        public List<EntityAffiliation> getAffiliations() {
273            return this.affiliations;
274        }
275    
276        @Override
277        public List<EntityName> getNames() {
278            return this.names;
279        }
280    
281        @Override
282        public List<EntityEmployment> getEmploymentInformation() {
283            return this.employmentInformation;
284        }
285    
286        @Override
287        public EntityPrivacyPreferences getPrivacyPreferences() {
288            return this.privacyPreferences;
289        }
290    
291        @Override
292        public EntityBioDemographics getBioDemographics() {
293            return this.bioDemographics;
294        }
295    
296        @Override
297        public List<EntityCitizenship> getCitizenships() {
298            return this.citizenships;
299        }
300    
301        @Override
302        public EntityEmployment getPrimaryEmployment() {
303            return this.primaryEmployment;
304        }
305    
306        @Override
307        public EntityAffiliation getDefaultAffiliation() {
308            return this.defaultAffiliation;
309        }
310    
311        @Override
312        public EntityExternalIdentifier getEntityExternalIdentifier(String externalIdentifierTypeCode) {
313            if (externalIdentifiers == null) {
314                return null;
315            }
316            for (EntityExternalIdentifier externalId : externalIdentifiers) {
317                if (externalId.getExternalIdentifierTypeCode().equals(externalIdentifierTypeCode)) {
318                    return externalId;
319                }
320            }
321            return null;
322        }
323    
324        @Override
325        public EntityNameContract getDefaultName() {
326            return this.defaultName;
327        }
328    
329        @Override
330        public List<EntityEthnicity> getEthnicities() {
331            return this.ethnicities;
332        }
333    
334        @Override
335        public List<EntityResidency> getResidencies() {
336            return this.residencies;
337        }
338    
339        @Override
340        public List<EntityVisa> getVisas() {
341            return this.visas;
342        }
343    
344        @Override
345        public Long getVersionNumber() {
346            return this.versionNumber;
347        }
348    
349        @Override
350        public String getObjectId() {
351            return this.objectId;
352        }
353    
354        @Override
355        public boolean isActive() {
356            return this.active;
357        }
358    
359        @Override
360        public String getId() {
361            return this.id;
362        }
363    
364        public EntityTypeContactInfo getEntityTypeContactInfoByTypeCode(String entityTypeCode) {
365            if (entityTypeContactInfos == null) {
366                return null;
367            }
368            for (EntityTypeContactInfo entType : entityTypeContactInfos) {
369                if (entType.getEntityTypeCode().equals(entityTypeCode)) {
370                    return entType;
371                }
372            }
373            return null;
374        }
375    
376        /**
377         * A builder which can be used to construct {@link Entity} instances.  Enforces the constraints of the {@link EntityContract}.
378         * 
379         */
380        public final static class Builder
381            implements Serializable, ModelBuilder, EntityContract
382        {
383    
384            private List<Principal.Builder> principals;
385            private List<EntityTypeContactInfo.Builder> entityTypeContactInfos;
386            private List<EntityExternalIdentifier.Builder> externalIdentifiers;
387            private List<EntityAffiliation.Builder> affiliations;
388            private List<EntityName.Builder> names;
389            private List<EntityEmployment.Builder> employmentInformation;
390            private EntityPrivacyPreferences.Builder privacyPreferences;
391            private EntityBioDemographics.Builder bioDemographics;
392            private List<EntityCitizenship.Builder> citizenships;
393            private List<EntityEthnicity.Builder> ethnicities;
394            private List<EntityResidency.Builder> residencies;
395            private List<EntityVisa.Builder> visas;
396            private Long versionNumber;
397            private String objectId;
398            private boolean active;
399            private String id;
400    
401            private Builder() { }
402    
403            public static Builder create() {
404                return new Builder();
405            }
406    
407            public static Builder create(EntityContract contract) {
408                if (contract == null) {
409                    throw new IllegalArgumentException("contract was null");
410                }
411                Builder builder = create();
412                if (contract.getPrincipals() != null) {
413                    List<Principal.Builder> tempPrincipals = new ArrayList<Principal.Builder>();
414                    for (PrincipalContract principal : contract.getPrincipals()) {
415                        tempPrincipals.add(Principal.Builder.create(principal));
416                    }
417                    builder.setPrincipals(tempPrincipals);
418                }
419                if (contract.getEntityTypeContactInfos() != null) {
420                    List<EntityTypeContactInfo.Builder> tempTypeData = new ArrayList<EntityTypeContactInfo.Builder>();
421                    for (EntityTypeContactInfoContract typeData : contract.getEntityTypeContactInfos()) {
422                        tempTypeData.add(EntityTypeContactInfo.Builder.create(typeData));
423                    }
424                    builder.setEntityTypes(tempTypeData);
425                }
426                if (contract.getExternalIdentifiers() != null) {
427                    List<EntityExternalIdentifier.Builder> externalIds = new ArrayList<EntityExternalIdentifier.Builder>();
428                    for (EntityExternalIdentifierContract externalId : contract.getExternalIdentifiers()) {
429                        externalIds.add(EntityExternalIdentifier.Builder.create(externalId));
430                    }
431                    builder.setExternalIdentifiers(externalIds);
432                }
433                if (contract.getAffiliations() != null) {
434                    List<EntityAffiliation.Builder> affils = new ArrayList<EntityAffiliation.Builder>();
435                    for (EntityAffiliationContract affil : contract.getAffiliations()) {
436                        affils.add(EntityAffiliation.Builder.create(affil));
437                    }
438                    builder.setAffiliations(affils);
439                }
440                if (contract.getNames() != null) {
441                    List<EntityName.Builder> nms = new ArrayList<EntityName.Builder>();
442                    for (EntityNameContract nm : contract.getNames()) {
443                        nms.add(EntityName.Builder.create(nm));
444                    }
445                    builder.setNames(nms);
446                }
447                if (contract.getEmploymentInformation() != null) {
448                    List<EntityEmployment.Builder> emps = new ArrayList<EntityEmployment.Builder>();
449                    for (EntityEmploymentContract emp : contract.getEmploymentInformation()) {
450                        emps.add(EntityEmployment.Builder.create(emp));
451                    }
452                    builder.setEmploymentInformation(emps);
453                }
454                builder.setPrivacyPreferences(contract.getPrivacyPreferences() == null ? null : EntityPrivacyPreferences.Builder.create(contract.getPrivacyPreferences()));
455                builder.setBioDemographics(contract.getBioDemographics() == null ? null : EntityBioDemographics.Builder.create(contract.getBioDemographics()));
456                if (contract.getCitizenships() != null) {
457                    List<EntityCitizenship.Builder> cits = new ArrayList<EntityCitizenship.Builder>();
458                    for (EntityCitizenshipContract cit : contract.getCitizenships()) {
459                        cits.add(EntityCitizenship.Builder.create(cit));
460                    }
461                    builder.setCitizenships(cits);
462                }
463                if (contract.getEthnicities() != null) {
464                    List<EntityEthnicity.Builder> ethnctys = new ArrayList<EntityEthnicity.Builder>();
465                    for (EntityEthnicityContract ethncty : contract.getEthnicities()) {
466                        ethnctys.add(EntityEthnicity.Builder.create(ethncty));
467                    }
468                    builder.setEthnicities(ethnctys);
469                }
470                if (contract.getResidencies() != null) {
471                    List<EntityResidency.Builder> residencyBuilders = new ArrayList<EntityResidency.Builder>();
472                    for (EntityResidencyContract residency : contract.getResidencies()) {
473                        residencyBuilders.add(EntityResidency.Builder.create(residency));
474                    }
475                    builder.setResidencies(residencyBuilders);
476                }
477                if (contract.getVisas() != null) {
478                    List<EntityVisa.Builder> visaBuilders = new ArrayList<EntityVisa.Builder>();
479                    for (EntityVisaContract visa : contract.getVisas()) {
480                        visaBuilders.add(EntityVisa.Builder.create(visa));
481                    }
482                    builder.setVisas(visaBuilders);
483                }
484                builder.setVersionNumber(contract.getVersionNumber());
485                builder.setObjectId(contract.getObjectId());
486                builder.setActive(contract.isActive());
487                builder.setId(contract.getId());
488                return builder;
489            }
490    
491            public Entity build() {
492                return new Entity(this);
493            }
494    
495            @Override
496            public List<Principal.Builder> getPrincipals() {
497                return this.principals;
498            }
499    
500            @Override
501            public List<EntityTypeContactInfo.Builder> getEntityTypeContactInfos() {
502                return this.entityTypeContactInfos;
503            }
504    
505            @Override
506            public List<EntityExternalIdentifier.Builder> getExternalIdentifiers() {
507                return this.externalIdentifiers;
508            }
509    
510            @Override
511            public List<EntityAffiliation.Builder> getAffiliations() {
512                return this.affiliations;
513            }
514    
515            @Override
516            public List<EntityName.Builder> getNames() {
517                return this.names;
518            }
519    
520            @Override
521            public List<EntityEmployment.Builder> getEmploymentInformation() {
522                return this.employmentInformation;
523            }
524    
525            @Override
526            public EntityPrivacyPreferences.Builder getPrivacyPreferences() {
527                return this.privacyPreferences;
528            }
529    
530            @Override
531            public EntityBioDemographics.Builder getBioDemographics() {
532                return this.bioDemographics;
533            }
534    
535            @Override
536            public List<EntityCitizenship.Builder> getCitizenships() {
537                return this.citizenships;
538            }
539    
540            @Override
541            public EntityTypeContactInfo.Builder getEntityTypeContactInfoByTypeCode(String entityTypeCode) {
542                if (CollectionUtils.isEmpty(this.entityTypeContactInfos)) {
543                    return null;
544                }
545                for (EntityTypeContactInfo.Builder builder : this.entityTypeContactInfos) {
546                    if (builder.getEntityTypeCode().equals(entityTypeCode) && builder.isActive()) {
547                        return builder;
548                    }
549                }
550                return null;
551            }
552    
553            @Override
554            public EntityEmployment.Builder getPrimaryEmployment() {
555                if (CollectionUtils.isEmpty(this.employmentInformation)) {
556                    return null;
557                }
558                for (EntityEmployment.Builder builder : this.employmentInformation) {
559                    if (builder.isPrimary()
560                            && builder.isActive()) {
561                        return builder;
562                    }
563                }
564                return null;
565            }
566    
567            @Override
568            public EntityAffiliation.Builder getDefaultAffiliation() {
569                if (CollectionUtils.isEmpty(this.affiliations)) {
570                    return null;
571                }
572                for (EntityAffiliation.Builder builder : this.affiliations) {
573                    if (builder.isDefaultValue()
574                            && builder.isActive()) {
575                        return builder;
576                    }
577                }
578                return null;
579            }
580    
581            @Override
582            public EntityExternalIdentifier.Builder getEntityExternalIdentifier(String externalIdentifierTypeCode) {
583                if (CollectionUtils.isEmpty(this.externalIdentifiers)) {
584                    return null;
585                }
586                for (EntityExternalIdentifier.Builder builder : this.externalIdentifiers) {
587                    if (builder.getExternalIdentifierTypeCode().equals(externalIdentifierTypeCode)) {
588                        return builder;
589                    }
590                }
591                return null;
592            }
593    
594            @Override
595            public EntityName.Builder getDefaultName() {
596                if (CollectionUtils.isEmpty(this.names)) {
597                    return null;
598                }
599                for (EntityName.Builder builder : this.names) {
600                    if (builder.isDefaultValue()
601                            && builder.isActive()) {
602                        return builder;
603                    }
604                }
605                return null;
606            }
607    
608            @Override
609            public List<EntityEthnicity.Builder> getEthnicities() {
610                return this.ethnicities;
611            }
612    
613            @Override
614            public List<EntityResidency.Builder> getResidencies() {
615                return this.residencies;
616            }
617    
618            @Override
619            public List<EntityVisa.Builder> getVisas() {
620                return this.visas;
621            }
622    
623            @Override
624            public Long getVersionNumber() {
625                return this.versionNumber;
626            }
627    
628            @Override
629            public String getObjectId() {
630                return this.objectId;
631            }
632    
633            @Override
634            public boolean isActive() {
635                return this.active;
636            }
637    
638            @Override
639            public String getId() {
640                return this.id;
641            }
642    
643            public void setPrincipals(List<Principal.Builder> principals) {
644                this.principals = principals;
645            }
646    
647            public void setEntityTypes(List<EntityTypeContactInfo.Builder> entityTypeContactInfos) {
648                this.entityTypeContactInfos = entityTypeContactInfos;
649            }
650    
651            public void setExternalIdentifiers(List<EntityExternalIdentifier.Builder> externalIdentifiers) {
652                this.externalIdentifiers = externalIdentifiers;
653            }
654    
655            public void setAffiliations(List<EntityAffiliation.Builder> affiliations) {
656                this.affiliations = affiliations;
657            }
658    
659            public void setNames(List<EntityName.Builder> names) {
660                this.names = names;
661            }
662    
663            public void setEmploymentInformation(List<EntityEmployment.Builder> employmentInformation) {
664                this.employmentInformation = employmentInformation;
665            }
666    
667            public void setPrivacyPreferences(EntityPrivacyPreferences.Builder privacyPreferences) {
668                this.privacyPreferences = privacyPreferences;
669            }
670    
671            public void setBioDemographics(EntityBioDemographics.Builder bioDemographics) {
672                this.bioDemographics = bioDemographics;
673            }
674    
675            public void setCitizenships(List<EntityCitizenship.Builder> citizenships) {
676                this.citizenships = citizenships;
677            }
678    
679            public void setEthnicities(List<EntityEthnicity.Builder> ethnicities) {
680                this.ethnicities = ethnicities;
681            }
682    
683            public void setResidencies(List<EntityResidency.Builder> residencies) {
684                this.residencies = residencies;
685            }
686    
687            public void setVisas(List<EntityVisa.Builder> visas) {
688                this.visas = visas;
689            }
690    
691            public void setVersionNumber(Long versionNumber) {
692                this.versionNumber = versionNumber;
693            }
694    
695            public void setObjectId(String objectId) {
696                this.objectId = objectId;
697            }
698    
699            public void setActive(boolean active) {
700                this.active = active;
701            }
702    
703            public void setId(String id) {
704                if (StringUtils.isWhitespace(id)) {
705                    throw new IllegalArgumentException("id is blank");
706                }
707                this.id = id;
708            }
709    
710        }
711    
712    
713        /**
714         * Defines some internal constants used on this class.
715         * 
716         */
717        static class Constants {
718    
719            final static String ROOT_ELEMENT_NAME = "entity";
720            final static String TYPE_NAME = "EntityType";
721            final static String[] HASH_CODE_EQUALS_EXCLUDE = new String[] {CoreConstants.CommonElements.FUTURE_ELEMENTS };
722    
723        }
724    
725    
726        /**
727         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
728         * 
729         */
730        static class Elements {
731    
732            final static String PRINCIPALS = "principals";
733            final static String PRINCIPAL = "principal";
734            final static String ENTITY_TYPE_CONTACT_INFOS = "entityTypeContactInfos";
735            final static String ENTITY_TYPE_CONTACT_INFO = "entityTypeContactInfo";
736            final static String EXTERNAL_IDENTIFIERS = "externalIdentifiers";
737            final static String EXTERNAL_IDENTIFIER = "externalIdentifier";
738            final static String AFFILIATIONS = "affiliations";
739            final static String AFFILIATION = "affiliation";
740            final static String NAMES = "names";
741            final static String NAME = "name";
742            final static String EMPLOYMENT_INFORMATION = "employmentInformation";
743            final static String EMPLOYMENT = "employment";
744            final static String PRIVACY_PREFERENCES = "privacyPreferences";
745            final static String BIO_DEMOGRAPHICS = "bioDemographics";
746            final static String CITIZENSHIPS = "citizenships";
747            final static String CITIZENSHIP = "citizenship";
748            final static String PRIMARY_EMPLOYMENT = "primaryEmployment";
749            final static String DEFAULT_AFFILIATION = "defaultAffiliation";
750            final static String DEFAULT_NAME = "defaultName";
751            final static String ETHNICITIES = "ethnicities";
752            final static String ETHNICITY = "ethnicity";
753            final static String RESIDENCIES = "residencies";
754            final static String RESIDENCY = "residency";
755            final static String VISAS = "visas";
756            final static String VISA = "visa";
757            final static String ACTIVE = "active";
758            final static String ID = "id";
759    
760        }
761    
762        public static class Cache {
763            public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + Entity.Constants.TYPE_NAME;
764        }
765    }