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.kuali.rice.core.api.CoreConstants;
020    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
021    import org.kuali.rice.core.api.mo.ModelBuilder;
022    import org.kuali.rice.kim.api.KimConstants;
023    import org.kuali.rice.kim.api.identity.EntityUtils;
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.employment.EntityEmployment;
027    import org.kuali.rice.kim.api.identity.external.EntityExternalIdentifier;
028    import org.kuali.rice.kim.api.identity.external.EntityExternalIdentifierContract;
029    import org.kuali.rice.kim.api.identity.name.EntityName;
030    import org.kuali.rice.kim.api.identity.principal.Principal;
031    import org.kuali.rice.kim.api.identity.principal.PrincipalContract;
032    import org.kuali.rice.kim.api.identity.privacy.EntityPrivacyPreferences;
033    import org.kuali.rice.kim.api.identity.type.EntityTypeContactInfoContract;
034    import org.kuali.rice.kim.api.identity.type.EntityTypeContactInfoDefault;
035    import org.w3c.dom.Element;
036    
037    import javax.xml.bind.annotation.XmlAccessType;
038    import javax.xml.bind.annotation.XmlAccessorType;
039    import javax.xml.bind.annotation.XmlAnyElement;
040    import javax.xml.bind.annotation.XmlElement;
041    import javax.xml.bind.annotation.XmlElementWrapper;
042    import javax.xml.bind.annotation.XmlRootElement;
043    import javax.xml.bind.annotation.XmlType;
044    import java.io.Serializable;
045    import java.util.ArrayList;
046    import java.util.Collection;
047    import java.util.Collections;
048    import java.util.List;
049    
050    @XmlRootElement(name = EntityDefault.Constants.ROOT_ELEMENT_NAME)
051    @XmlAccessorType(XmlAccessType.NONE)
052    @XmlType(name = EntityDefault.Constants.TYPE_NAME, propOrder = {
053        EntityDefault.Elements.ENTITY_ID,
054        EntityDefault.Elements.NAME,
055        EntityDefault.Elements.PRINCIPALS,
056        EntityDefault.Elements.ENTITY_TYPE_CONTACT_INFOS,
057        EntityDefault.Elements.AFFILIATIONS,
058        EntityDefault.Elements.DEFAULT_AFFILIATION,
059        EntityDefault.Elements.EMPLOYMENT,
060        EntityDefault.Elements.EXTERNAL_IDENTIFIERS,
061        EntityDefault.Elements.PRIVACY_PREFERENCES,
062        EntityDefault.Elements.ACTIVE,
063        CoreConstants.CommonElements.FUTURE_ELEMENTS
064    })
065    public class EntityDefault extends AbstractDataTransferObject {
066        @XmlElement(name = Elements.ENTITY_ID, required = false)
067        private final String entityId;
068    
069        @XmlElement(name = Elements.NAME, required = false)
070        private final EntityName name;
071    
072        @XmlElementWrapper(name = Elements.PRINCIPALS, required = false)
073        @XmlElement(name = Elements.PRINCIPAL, required = false)
074        private final List<Principal> principals;
075    
076        @XmlElementWrapper(name = Elements.ENTITY_TYPE_CONTACT_INFOS, required = false)
077        @XmlElement(name = Elements.ENTITY_TYPE_CONTACT_INFO, required = false)
078        private final List<EntityTypeContactInfoDefault> entityTypeContactInfos;
079    
080        @XmlElementWrapper(name = Elements.AFFILIATIONS, required = false)
081        @XmlElement(name = Elements.AFFILIATION, required = false)
082        private final List<EntityAffiliation> affiliations;
083    
084        @XmlElement(name = Elements.DEFAULT_AFFILIATION, required = false)
085        private final EntityAffiliation defaultAffiliation;
086    
087        @XmlElement(name = Elements.EMPLOYMENT, required = false)
088        private final EntityEmployment employment;
089    
090        @XmlElementWrapper(name = Elements.EXTERNAL_IDENTIFIERS, required = false)
091        @XmlElement(name = Elements.EXTERNAL_IDENTIFIER, required = false)
092        private final List<EntityExternalIdentifier> externalIdentifiers;
093    
094        @XmlElement(name = Elements.PRIVACY_PREFERENCES, required = false)
095        private final EntityPrivacyPreferences privacyPreferences;
096    
097        @XmlElement(name = Elements.ACTIVE, required = false)
098        private final boolean active;
099    
100        @SuppressWarnings("unused")
101        @XmlAnyElement
102        private final Collection<Element> _futureElements = null;
103    
104        private EntityDefault() {
105            entityId = null;
106            name = null;
107            principals = null;
108            affiliations = null;
109            defaultAffiliation = null;
110            entityTypeContactInfos = null;
111            employment = null;
112            externalIdentifiers = null;
113            privacyPreferences = null;
114            active = false;
115        }
116    
117        public EntityDefault(String entityId, EntityName name, List<Principal> principals,
118                List<EntityTypeContactInfoDefault> entityTypes, List<EntityAffiliation> affiliations,
119                EntityAffiliation defaultAffiliation, EntityEmployment employment,
120                List<EntityExternalIdentifier> externalIdentifiers, EntityPrivacyPreferences privacyPreferences, boolean active) {
121            this.entityId = entityId;
122            this.name = name;
123            this.principals = principals;
124            this.entityTypeContactInfos = entityTypes;
125            this.affiliations = affiliations;
126            this.defaultAffiliation = defaultAffiliation;
127            this.employment = employment;
128            this.externalIdentifiers = externalIdentifiers;
129            this.privacyPreferences = privacyPreferences;
130            this.active = active;
131        }
132    
133        public EntityDefault(Builder builder) {
134            this.entityId = builder.entityId;
135            this.name = builder.getName() == null ? null : builder.getName().build();
136            this.principals = new ArrayList<Principal>();
137            if (CollectionUtils.isNotEmpty(builder.getPrincipals())) {
138                for (Principal.Builder principal : builder.getPrincipals()) {
139                    this.principals.add(principal.build());
140                }
141            }
142            this.entityTypeContactInfos = new ArrayList<EntityTypeContactInfoDefault>();
143            if (CollectionUtils.isNotEmpty(builder.getEntityTypeContactInfos())) {
144                for (EntityTypeContactInfoDefault.Builder entityType : builder.getEntityTypeContactInfos()) {
145                    this.entityTypeContactInfos.add(entityType.build());
146                }
147            }
148            this.affiliations = new ArrayList<EntityAffiliation>();
149            if (CollectionUtils.isNotEmpty(builder.getAffiliations())) {
150                for (EntityAffiliation.Builder affiliation : builder.getAffiliations()) {
151                    this.affiliations.add(affiliation.build());
152                }
153            }
154            if (builder.getDefaultAffiliation() == null
155                    && CollectionUtils.isNotEmpty(this.affiliations)) {
156                this.defaultAffiliation = EntityUtils.getDefaultItem(this.affiliations);
157            } else {
158                this.defaultAffiliation = builder.getDefaultAffiliation() == null ? null : builder.getDefaultAffiliation().build();
159            }
160            this.employment = builder.getEmployment() == null ? null : builder.getEmployment().build();
161            this.externalIdentifiers = new ArrayList<EntityExternalIdentifier>();
162            if (CollectionUtils.isNotEmpty(builder.getExternalIdentifiers())) {
163                for (EntityExternalIdentifier.Builder externalId : builder.getExternalIdentifiers()) {
164                    this.externalIdentifiers.add(externalId.build());
165                }
166            }
167            this.privacyPreferences = builder.getPrivacyPreferences() == null ? null : builder.getPrivacyPreferences().build();
168            this.active = builder.isActive();
169        }
170    
171        public String getEntityId() {
172            return entityId;
173        }
174    
175        public EntityName getName() {
176            return name;
177        }
178    
179        public List<Principal> getPrincipals() {
180            return Collections.unmodifiableList(principals);
181        }
182    
183        public List<EntityTypeContactInfoDefault> getEntityTypeContactInfos() {
184            return Collections.unmodifiableList(entityTypeContactInfos);
185        }
186    
187        public List<EntityAffiliation> getAffiliations() {
188            return Collections.unmodifiableList(affiliations);
189        }
190    
191        public EntityAffiliation getDefaultAffiliation() {
192            return defaultAffiliation;
193        }
194    
195        public EntityEmployment getEmployment() {
196            return employment;
197        }
198    
199        public List<EntityExternalIdentifier> getExternalIdentifiers() {
200            return Collections.unmodifiableList(externalIdentifiers);
201        }
202    
203        public EntityPrivacyPreferences getPrivacyPreferences() {
204            return privacyPreferences;
205        }
206    
207        public boolean isActive() {
208            return active;
209        }
210    
211        /**
212         * Gets this {@link EntityDefault}'s {@link EntityTypeContactInfoDefault} for the given type code.
213         * @return the {@link org.kuali.rice.kim.api.identity.type.EntityTypeContactInfoDefault} for the given type code for this {@link EntityTypeContactInfoDefault},
214         * or null if none has been assigned.
215         */
216        public EntityTypeContactInfoDefault getEntityType(String entityTypeCode) {
217            if (entityTypeContactInfos == null) {
218                return null;
219            }
220            for (EntityTypeContactInfoDefault entType : entityTypeContactInfos) {
221                if (entType.getEntityTypeCode().equals(entityTypeCode)) {
222                    return entType;
223                }
224            }
225            return null;
226        }
227    
228       
229        /**
230         * A builder which can be used to construct {@link EntityDefault} instances.
231         * 
232         */
233        public final static class Builder
234            implements Serializable, ModelBuilder
235        {
236            private String entityId;
237            private EntityName.Builder name;
238            private List<Principal.Builder> principals;
239            private List<EntityTypeContactInfoDefault.Builder> entityTypeContactInfos;
240            private List<EntityAffiliation.Builder> affiliations;
241            private EntityAffiliation.Builder defaultAffiliation;
242            private EntityEmployment.Builder employment;
243            private List<EntityExternalIdentifier.Builder> externalIdentifiers;
244            private EntityPrivacyPreferences.Builder privacyPreferences;
245            private boolean active;
246    
247            private Builder() { }
248    
249            public static Builder create() {
250                return new Builder();
251            }
252    
253            public static Builder create(String entityId) {
254                Builder builder = new Builder();
255                builder.setEntityId(entityId);
256                return builder;
257            }
258            
259            public static Builder create(EntityContract contract) {
260                if (contract == null) {
261                    throw new IllegalArgumentException("contract was null");
262                }
263                Builder builder = new Builder();
264                builder.setEntityId(contract.getId());
265                builder.setActive(contract.isActive());
266                List<Principal.Builder> principalBuilders = new ArrayList<Principal.Builder>();
267                for ( PrincipalContract p : contract.getPrincipals() ) {
268                  principalBuilders.add( Principal.Builder.create(p) );
269                }
270                builder.setPrincipals(principalBuilders);
271              
272                builder.setPrivacyPreferences(contract.getPrivacyPreferences() == null ?
273                        EntityPrivacyPreferences.Builder.create(contract.getId()) : EntityPrivacyPreferences.Builder.create(contract.getPrivacyPreferences()));
274    
275                builder.setName(contract.getDefaultName() == null ? null : EntityName.Builder.create(contract.getDefaultName()));
276                List<EntityTypeContactInfoDefault.Builder> typeBuilders = new ArrayList<EntityTypeContactInfoDefault.Builder>();
277                for ( EntityTypeContactInfoContract etContract : contract.getEntityTypeContactInfos() ) {
278                    typeBuilders.add(EntityTypeContactInfoDefault.Builder.create(etContract));
279                }
280                builder.setEntityTypeContactInfos(typeBuilders);
281              
282                List<EntityAffiliation.Builder> affiliationBuilders = new ArrayList<EntityAffiliation.Builder>( );
283                for ( EntityAffiliationContract aff : contract.getAffiliations() ) {
284                    if (aff.isActive()) {
285                        affiliationBuilders.add(EntityAffiliation.Builder.create(aff));
286                        if ( aff.isDefaultValue() ) {
287                          builder.setDefaultAffiliation( EntityAffiliation.Builder.create(aff) );
288                        }
289                    }
290                }
291                builder.setAffiliations(affiliationBuilders);
292              
293                builder.setEmployment(contract.getPrimaryEmployment() == null ? null : EntityEmployment.Builder.create(contract.getPrimaryEmployment()) );
294                List<EntityExternalIdentifier.Builder> externalIdBuilders = new ArrayList<EntityExternalIdentifier.Builder>();
295                for ( EntityExternalIdentifierContract id : contract.getExternalIdentifiers() ) {
296                    externalIdBuilders.add( EntityExternalIdentifier.Builder.create(id) );
297                }
298                builder.setExternalIdentifiers( externalIdBuilders );
299    
300                return builder;
301            }
302    
303            public EntityDefault build() {
304                return new EntityDefault(this);
305            }
306    
307            public String getEntityId() {
308                return entityId;
309            }
310    
311            public void setEntityId(String entityId) {
312                this.entityId = entityId;
313            }
314    
315            public EntityName.Builder getName() {
316                return name;
317            }
318    
319            public void setName(EntityName.Builder name) {
320                this.name = name;
321            }
322    
323            public List<Principal.Builder> getPrincipals() {
324                return principals;
325            }
326    
327            public void setPrincipals(List<Principal.Builder> principals) {
328                this.principals = principals;
329            }
330    
331            public List<EntityTypeContactInfoDefault.Builder> getEntityTypeContactInfos() {
332                return entityTypeContactInfos;
333            }
334    
335            public void setEntityTypeContactInfos(List<EntityTypeContactInfoDefault.Builder> entityTypeContactInfos) {
336                this.entityTypeContactInfos = entityTypeContactInfos;
337            }
338    
339            public List<EntityAffiliation.Builder> getAffiliations() {
340                return affiliations;
341            }
342    
343            public void setAffiliations(List<EntityAffiliation.Builder> affiliations) {
344                this.affiliations = affiliations;
345            }
346    
347            public EntityAffiliation.Builder getDefaultAffiliation() {
348                return defaultAffiliation;
349            }
350    
351            public void setDefaultAffiliation(EntityAffiliation.Builder defaultAffiliation) {
352                this.defaultAffiliation = defaultAffiliation;
353            }
354    
355            public EntityEmployment.Builder getEmployment() {
356                return employment;
357            }
358    
359            public void setEmployment(EntityEmployment.Builder employment) {
360                this.employment = employment;
361            }
362    
363            public List<EntityExternalIdentifier.Builder> getExternalIdentifiers() {
364                return externalIdentifiers;
365            }
366    
367            public void setExternalIdentifiers(List<EntityExternalIdentifier.Builder> externalIdentifiers) {
368                this.externalIdentifiers = externalIdentifiers;
369            }
370    
371            public EntityPrivacyPreferences.Builder getPrivacyPreferences() {
372                return privacyPreferences;
373            }
374    
375            public void setPrivacyPreferences(EntityPrivacyPreferences.Builder privacyPreferences) {
376                this.privacyPreferences = privacyPreferences;
377            }
378    
379            public boolean isActive() {
380                return this.active;
381            }
382    
383            public void setActive(boolean active) {
384                this.active = active;
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 = "entityDefault";
394            final static String TYPE_NAME = "EntityDefaultType";
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            final static String ENTITY_ID = "entityId";
404            final static String NAME = "name";
405            final static String PRINCIPALS = "principals";
406            final static String PRINCIPAL = "principal";
407            final static String ENTITY_TYPE_CONTACT_INFOS = "entityTypeContactInfos";
408            final static String ENTITY_TYPE_CONTACT_INFO = "entityTypeContactInfo";
409            final static String AFFILIATIONS = "affiliations";
410            final static String AFFILIATION = "affiliation";
411            final static String DEFAULT_AFFILIATION = "defaultAffiliation";
412            final static String EMPLOYMENT = "employment";
413            final static String EXTERNAL_IDENTIFIERS = "externalIdentifiers";
414            final static String EXTERNAL_IDENTIFIER = "externalIdentifier";
415            final static String PRIVACY_PREFERENCES = "privacyPreferences";
416            final static String ACTIVE = "active";
417    
418        }
419    
420        public static class Cache {
421            public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + EntityDefault.Constants.TYPE_NAME;
422        }
423    }