001/**
002 * Copyright 2005-2016 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.impl.identity;
017
018import org.apache.commons.collections.CollectionUtils;
019import org.apache.commons.lang.StringUtils;
020import org.kuali.rice.core.api.criteria.QueryByCriteria;
021import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
022import org.kuali.rice.kim.api.identity.CodedAttribute;
023import org.kuali.rice.kim.api.identity.IdentityService;
024import org.kuali.rice.kim.api.identity.address.EntityAddress;
025import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliation;
026import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliationType;
027import org.kuali.rice.kim.api.identity.citizenship.EntityCitizenship;
028import org.kuali.rice.kim.api.identity.email.EntityEmail;
029import org.kuali.rice.kim.api.identity.employment.EntityEmployment;
030import org.kuali.rice.kim.api.identity.entity.Entity;
031import org.kuali.rice.kim.api.identity.entity.EntityDefault;
032import org.kuali.rice.kim.api.identity.entity.EntityDefaultQueryResults;
033import org.kuali.rice.kim.api.identity.entity.EntityQueryResults;
034import org.kuali.rice.kim.api.identity.external.EntityExternalIdentifier;
035import org.kuali.rice.kim.api.identity.external.EntityExternalIdentifierType;
036import org.kuali.rice.kim.api.identity.name.EntityName;
037import org.kuali.rice.kim.api.identity.personal.EntityBioDemographics;
038import org.kuali.rice.kim.api.identity.personal.EntityEthnicity;
039import org.kuali.rice.kim.api.identity.phone.EntityPhone;
040import org.kuali.rice.kim.api.identity.principal.EntityNamePrincipalName;
041import org.kuali.rice.kim.api.identity.principal.Principal;
042import org.kuali.rice.kim.api.identity.principal.PrincipalQueryResults;
043import org.kuali.rice.kim.api.identity.privacy.EntityPrivacyPreferences;
044import org.kuali.rice.kim.api.identity.residency.EntityResidency;
045import org.kuali.rice.kim.api.identity.type.EntityTypeContactInfo;
046import org.kuali.rice.kim.api.identity.visa.EntityVisa;
047
048import javax.jws.WebParam;
049import java.util.ArrayList;
050import java.util.Collection;
051import java.util.List;
052import java.util.Map;
053
054/**
055 * This IdentityService implementation is largely just a knee-jerk delegator, except for
056 * getters returning {@link EntityDefault} in which case the IdentityArchiveService
057 * will be invoked if the inner IndentityService impl returns null.
058 *
059 * @author Kuali Rice Team (rice.collab@kuali.org)
060 */
061public class IdentityCurrentAndArchivedServiceImpl implements IdentityService {
062        private final IdentityArchiveService identityArchiveService;
063        private final IdentityService innerIdentityService;
064
065        /**
066         * This constructs a IdentityCurrentAndArchivedServiceImpl, injecting the
067         * needed services.
068         */
069        public IdentityCurrentAndArchivedServiceImpl(IdentityService innerIdentityService,
070                        IdentityArchiveService identityArchiveService) {
071                this.innerIdentityService = innerIdentityService;
072                this.identityArchiveService = identityArchiveService;
073        }
074
075        /**
076         * @see org.kuali.rice.kim.api.identity.IdentityService#getAddressType(java.lang.String)
077         */
078    @Override
079        public CodedAttribute getAddressType(String code) {
080                return getInnerIdentityService().getAddressType(code);
081        }
082
083    @Override
084    public List<CodedAttribute> findAllAddressTypes() {
085        return getInnerIdentityService().findAllAddressTypes();
086    }
087
088    @Override
089        public EntityAffiliationType getAffiliationType(String code) {
090                return getInnerIdentityService().getAffiliationType(code);
091        }
092
093    @Override
094    public List<EntityAffiliationType> findAllAffiliationTypes() {
095        return getInnerIdentityService().findAllAffiliationTypes();
096    }
097
098    /**
099         * @see org.kuali.rice.kim.api.identity.IdentityService#getCitizenshipStatus(java.lang.String)
100         */
101    @Override
102        public CodedAttribute getCitizenshipStatus(String code) {
103                return CodedAttribute.Builder.create(getInnerIdentityService().getCitizenshipStatus(code)).build();
104        }
105
106    @Override
107    public List<CodedAttribute> findAllCitizenshipStatuses() {
108        return getInnerIdentityService().findAllCitizenshipStatuses();
109    }
110
111    @Override
112        public EntityNamePrincipalName getDefaultNamesForPrincipalId(String principalId) {
113        EntityNamePrincipalName name = getInnerIdentityService().getDefaultNamesForPrincipalId(principalId);
114        if(name == null || name.getDefaultName() == null || StringUtils.isBlank(name.getPrincipalName()) || StringUtils.isBlank(name.getDefaultName().getCompositeName())) {
115                EntityDefault defaultEntity = this.getEntityDefaultByPrincipalId(principalId);
116            if (defaultEntity != null) {
117                EntityNamePrincipalName.Builder nameBuilder = EntityNamePrincipalName.Builder.create();
118                for(Principal principal : defaultEntity.getPrincipals()) {
119                    nameBuilder.setPrincipalName(principal.getPrincipalName());
120                }
121                nameBuilder.setDefaultName(EntityName.Builder.create(defaultEntity.getName()));
122                if (StringUtils.isBlank(defaultEntity.getName().getCompositeName())) {
123                    //KULRICE-12360: The code below will account for null, an empty string, or spaces in the database for first and last name.
124                    String lastNameTemp = "";
125                    String firstNameTemp= "";
126
127                    if (StringUtils.isNotBlank(defaultEntity.getName().getLastName())) {
128                        lastNameTemp = defaultEntity.getName().getLastName();
129                    }
130                    if (StringUtils.isNotBlank(defaultEntity.getName().getFirstName())) {
131                        firstNameTemp = defaultEntity.getName().getFirstName();
132                    }
133                    if (StringUtils.isNotBlank(lastNameTemp) && StringUtils.isNotBlank(firstNameTemp)) {
134                        lastNameTemp = lastNameTemp + ", ";
135                    }
136
137                    String formattedName = (lastNameTemp + firstNameTemp + (defaultEntity.getName().getMiddleName()==null?"":" " + defaultEntity.getName().getMiddleName())).trim();
138                    nameBuilder.getDefaultName().setCompositeName(formattedName);
139                }
140                return nameBuilder.build();
141            }
142        }
143                return name;
144        }
145
146    @Override
147    public Map<String, EntityNamePrincipalName> getDefaultNamesForPrincipalIds(List<String> principalIds) {
148        // First fetch all of the names we can from the identity service
149        Map<String, EntityNamePrincipalName> defaultNames = getInnerIdentityService().getDefaultNamesForPrincipalIds(principalIds);
150        if(defaultNames != null && defaultNames.size() != principalIds.size()) {
151            // Next calculate the principal IDs we're missing a name for
152            Collection<String> missingPrincipalIds = CollectionUtils.subtract(principalIds, defaultNames.keySet());
153            // Then use the getDefaultNamesForPrincipalId for each of them to fetch their name from the archive
154            for(String principalId : missingPrincipalIds) {
155                defaultNames.put(principalId, getDefaultNamesForPrincipalId(principalId));
156            }
157        }
158        return defaultNames;
159    }
160
161    /**
162     * {@inheritDoc}
163     */
164    @Override
165    public EntityPrivacyPreferences getPrivacyPreferencesForPrincipalId(String principalId) {
166        return getInnerIdentityService().getPrivacyPreferencesForPrincipalId(principalId);
167    }
168
169    @Override
170    public EntityName addNameToEntity(EntityName name) {
171        return getInnerIdentityService().addNameToEntity(name);
172    }
173
174    @Override
175    public EntityName updateName(EntityName name) {
176        return getInnerIdentityService().updateName(name);
177    }
178
179    @Override
180    public EntityName inactivateName(String id) {
181        return getInnerIdentityService().inactivateName(id);
182    }
183
184    @Override
185    public EntityEmployment addEmploymentToEntity(EntityEmployment employment) {
186        return getInnerIdentityService().addEmploymentToEntity(employment);
187    }
188
189    @Override
190    public EntityEmployment updateEmployment(EntityEmployment employment) {
191        return getInnerIdentityService().updateEmployment(employment);
192    }
193
194    @Override
195    public EntityEmployment inactivateEmployment(String id) {
196        return getInnerIdentityService().inactivateEmployment(id);
197    }
198
199    @Override
200    public EntityBioDemographics addBioDemographicsToEntity(EntityBioDemographics bioDemographics) {
201        return getInnerIdentityService().addBioDemographicsToEntity(bioDemographics);
202    }
203
204    @Override
205    public EntityBioDemographics updateBioDemographics(EntityBioDemographics bioDemographics) {
206        return getInnerIdentityService().updateBioDemographics(bioDemographics);
207    }
208
209        /**
210         * @see org.kuali.rice.kim.api.identity.IdentityService#getEmailType(java.lang.String)
211         */
212    @Override
213        public CodedAttribute getEmailType(String code) {
214                return getInnerIdentityService().getEmailType(code);
215        }
216
217    @Override
218    public List<CodedAttribute> findAllEmailTypes() {
219        return getInnerIdentityService().findAllEmailTypes();
220    }
221
222    @Override
223    public PrincipalQueryResults findPrincipals(QueryByCriteria query) throws RiceIllegalArgumentException {
224        return getInnerIdentityService().findPrincipals(query);
225    }
226
227    /**
228         * @see org.kuali.rice.kim.api.identity.IdentityService#getEmploymentStatus(java.lang.String)
229         */
230    @Override
231        public CodedAttribute getEmploymentStatus(String code) {
232                return getInnerIdentityService().getEmploymentStatus(code);
233        }
234
235    @Override
236    public List<CodedAttribute> findAllEmploymentStatuses() {
237        return getInnerIdentityService().findAllEmploymentStatuses();
238    }
239
240    /**
241         * @see org.kuali.rice.kim.api.identity.IdentityService#getEmploymentType(java.lang.String)
242         */
243    @Override
244        public CodedAttribute getEmploymentType(String code) {
245                return getInnerIdentityService().getEmploymentType(code);
246        }
247
248    @Override
249    public List<CodedAttribute> findAllEmploymentTypes() {
250        return getInnerIdentityService().findAllEmploymentTypes();
251    }
252
253    /**
254         * This method first tries the inner IdentityService impl, and resorts to
255         * the IdentityArchiveService if need be.
256         */
257    @Override
258        public EntityDefault getEntityDefault(String entityId) {
259                EntityDefault entity = getInnerIdentityService().getEntityDefault(entityId);
260        if ( entity == null ) {
261                entity = getIdentityArchiveService().getEntityDefaultFromArchive(entityId);
262        } else {
263                        getIdentityArchiveService().saveEntityDefaultToArchive(entity);
264        }
265                return entity;
266        }
267
268        /**
269         * This method first tries the inner IdentityService impl, and resorts to
270         * the IdentityArchiveService if need be.
271         */
272    @Override
273        public EntityDefault getEntityDefaultByPrincipalId(String principalId) {
274                EntityDefault entity = getInnerIdentityService().getEntityDefaultByPrincipalId(principalId);
275        if ( entity == null ) {
276                entity = getIdentityArchiveService().getEntityDefaultFromArchiveByPrincipalId(principalId);
277        } else {
278                        getIdentityArchiveService().saveEntityDefaultToArchive(entity);
279        }
280        return entity;
281        }
282
283        /**
284         * This method first tries the inner IdentityService impl, and resorts to
285         * the IdentityArchiveService if need be.
286         */
287    @Override
288        public EntityDefault getEntityDefaultByPrincipalName(String principalName) {
289                EntityDefault entity = getInnerIdentityService().getEntityDefaultByPrincipalName(principalName);
290        if ( entity == null ) {
291                entity = getIdentityArchiveService().getEntityDefaultFromArchiveByPrincipalName(principalName);
292        } else {
293                        getIdentityArchiveService().saveEntityDefaultToArchive(entity);
294        }
295        return entity;
296        }
297
298    /**
299     * This method first tries the inner IdentityService impl, and resorts to
300     * the IdentityArchiveService if need be.
301     */
302    @Override
303    public EntityDefault getEntityDefaultByEmployeeId(String employeeId) {
304        EntityDefault entity = getInnerIdentityService().getEntityDefaultByEmployeeId(employeeId);
305        if ( entity == null ) {
306            entity = getIdentityArchiveService().getEntityDefaultFromArchiveByEmployeeId( employeeId );
307        } else {
308            getIdentityArchiveService().saveEntityDefaultToArchive(entity);
309        }
310        return entity;
311    }
312
313    @Override
314    public EntityDefaultQueryResults findEntityDefaults( QueryByCriteria queryByCriteria) {
315        return getInnerIdentityService().findEntityDefaults(queryByCriteria);
316    }
317
318    @Override
319    public EntityQueryResults findEntities(QueryByCriteria queryByCriteria) {
320        return getInnerIdentityService().findEntities(queryByCriteria);
321    }
322
323    @Override
324        public Entity getEntity(String entityId) {
325                return getInnerIdentityService().getEntity(entityId);
326        }
327
328    @Override
329        public Entity getEntityByPrincipalId(String principalId) {
330                return getInnerIdentityService().getEntityByPrincipalId(principalId);
331        }
332
333    @Override
334        public Entity getEntityByPrincipalName(String principalName) {
335                return getInnerIdentityService().getEntityByPrincipalName(principalName);
336        }
337
338    @Override
339        public Entity getEntityByEmployeeId(String employeeId) {
340                return getInnerIdentityService().getEntityByEmployeeId(employeeId);
341        }
342
343    @Override
344    public Entity createEntity(Entity entity) {
345        return getInnerIdentityService().createEntity(entity);
346    }
347
348    @Override
349    public Entity updateEntity(Entity entity) {
350        return getInnerIdentityService().updateEntity(entity);
351    }
352
353    @Override
354    public Entity inactivateEntity(String entityId) {
355        return getInnerIdentityService().inactivateEntity(entityId);
356    }
357
358    /**
359         * @see org.kuali.rice.kim.api.identity.IdentityService#getNameType(java.lang.String)
360         */
361    @Override
362        public CodedAttribute getNameType(String code) {
363                return getInnerIdentityService().getNameType(code);
364        }
365
366    @Override
367    public List<CodedAttribute> findAllNameTypes() {
368        return getInnerIdentityService().findAllNameTypes();
369    }
370
371    @Override
372        public EntityPrivacyPreferences getEntityPrivacyPreferences(
373                        String entityId) {
374                return getInnerIdentityService().getEntityPrivacyPreferences(entityId);
375        }
376
377    @Override
378    public EntityPrivacyPreferences addPrivacyPreferencesToEntity(EntityPrivacyPreferences privacyPreferences) {
379        return getInnerIdentityService().addPrivacyPreferencesToEntity(privacyPreferences);
380    }
381
382    @Override
383    public EntityPrivacyPreferences updatePrivacyPreferences(EntityPrivacyPreferences privacyPreferences) {
384        return getInnerIdentityService().updatePrivacyPreferences(privacyPreferences);
385    }
386
387    @Override
388    public EntityCitizenship addCitizenshipToEntity(EntityCitizenship citizenship) {
389        return getInnerIdentityService().addCitizenshipToEntity(citizenship);
390    }
391
392    @Override
393    public EntityCitizenship updateCitizenship(EntityCitizenship citizenship) {
394        return getInnerIdentityService().updateCitizenship(citizenship);
395    }
396
397    @Override
398    public EntityCitizenship inactivateCitizenship(String id) {
399        return getInnerIdentityService().inactivateCitizenship(id);
400    }
401
402    @Override
403    public EntityEthnicity addEthnicityToEntity(EntityEthnicity ethnicity) {
404        return getInnerIdentityService().addEthnicityToEntity(ethnicity);
405    }
406
407    @Override
408    public EntityEthnicity updateEthnicity(EntityEthnicity ethnicity) {
409        return getInnerIdentityService().updateEthnicity(ethnicity);
410    }
411
412    @Override
413    public EntityResidency addResidencyToEntity(EntityResidency residency) {
414        return getInnerIdentityService().addResidencyToEntity(residency);
415    }
416
417    @Override
418    public EntityResidency updateResidency(EntityResidency residency) {
419        return getInnerIdentityService().updateResidency(residency);
420    }
421
422    @Override
423    public EntityVisa addVisaToEntity(EntityVisa visa) {
424        return getInnerIdentityService().addVisaToEntity(visa);
425    }
426
427    @Override
428    public EntityVisa updateVisa(EntityVisa visa) {
429        return getInnerIdentityService().updateVisa(visa);
430    }
431
432    /**
433         * @see org.kuali.rice.kim.api.identity.IdentityService#getEntityType(java.lang.String)
434         */
435    @Override
436        public CodedAttribute getEntityType(String code) {
437                return getInnerIdentityService().getEntityType(code);
438        }
439
440    @Override
441    public List<CodedAttribute> findAllEntityTypes() {
442        return getInnerIdentityService().findAllEntityTypes();
443    }
444
445    @Override
446        public EntityExternalIdentifierType getExternalIdentifierType(String code) {
447                return getInnerIdentityService().getExternalIdentifierType(code);
448        }
449
450    @Override
451    public List<EntityExternalIdentifierType> findAllExternalIdendtifierTypes() {
452        return getInnerIdentityService().findAllExternalIdendtifierTypes();
453    }
454
455    /**
456         * @see org.kuali.rice.kim.api.identity.IdentityService#getPhoneType(java.lang.String)
457         */
458    @Override
459        public CodedAttribute getPhoneType(String code) {
460                return getInnerIdentityService().getPhoneType(code);
461        }
462
463    @Override
464    public List<CodedAttribute> findAllPhoneTypes() {
465        return getInnerIdentityService().findAllPhoneTypes();
466    }
467
468    @Override
469        public Principal getPrincipal(String principalId) {
470        Principal principal = getInnerIdentityService().getPrincipal(principalId);
471        if ( principal == null ) {
472            EntityDefault entity = getEntityDefaultByPrincipalId(principalId);
473            if ( entity != null ) {
474                List<Principal> principals = entity.getPrincipals();
475                if ( principals != null && !principals.isEmpty() ) {
476                    principal = principals.get(0);
477                }
478            }
479        }
480        return principal;
481    }
482
483    /**
484     * Gets a list of {@link org.kuali.rice.kim.api.identity.principal.Principal} from a string list of principalId.
485     *
486     * <p>
487     * This method will only return principals that exist.  It will return null if the none of the principals exist.
488     * </p>
489     *
490     * @param principalIds the unique id to retrieve the principal by. cannot be null.
491     * @return a list of {@link org.kuali.rice.kim.api.identity.principal.Principal} or null
492     * @throws org.kuali.rice.core.api.exception.RiceIllegalArgumentException if the principalId is blank
493     */
494    @Override
495    public List<Principal> getPrincipals(@WebParam(name = "principalIds") List<String> principalIds) {
496        List<Principal> ret = new ArrayList<Principal>();
497        for(String p: principalIds) {
498            Principal principalInfo = getPrincipal(p);
499
500            if (principalInfo != null) {
501                ret.add(principalInfo) ;
502            }
503        }
504        if (!ret.isEmpty()) {
505            return ret;
506        } else {
507            return null;
508        }
509    }
510
511    @Override
512        public Principal getPrincipalByPrincipalName(String principalName) {
513        Principal principal = getInnerIdentityService().getPrincipalByPrincipalName(principalName);
514        if ( principal == null ) {
515            EntityDefault entity = getEntityDefaultByPrincipalName(principalName);
516            if ( entity != null ) {
517                List<Principal> principals = entity.getPrincipals();
518                if ( principals != null && !principals.isEmpty() ) {
519                    principal = principals.get(0);
520                }
521            }
522        }
523        return principal;
524        }
525
526    @Override
527    public List<Principal> getPrincipalsByEntityId(String entityId) {
528        List<Principal> principals = getInnerIdentityService().getPrincipalsByEntityId(entityId);
529        if ( principals == null ) {
530            EntityDefault entity = getIdentityArchiveService().getEntityDefaultFromArchive(entityId);
531            if (entity != null && entity.getPrincipals() != null && !entity.getPrincipals().isEmpty() ) {
532                principals = entity.getPrincipals();
533            }
534        }
535        return principals;
536    }
537
538    @Override
539    public List<Principal> getPrincipalsByEmployeeId(String employeeId) {
540        List<Principal> principals = getInnerIdentityService().getPrincipalsByEmployeeId(employeeId);
541        if ( principals == null ) {
542            EntityDefault entity = getIdentityArchiveService().getEntityDefaultFromArchive(employeeId);
543            if (entity != null && entity.getPrincipals() != null && !entity.getPrincipals().isEmpty() ) {
544                principals = entity.getPrincipals();
545            }
546        }
547        return principals;
548    }
549
550    @Override
551        public Principal getPrincipalByPrincipalNameAndPassword(
552                        String principalName, String password) {
553                return getInnerIdentityService().getPrincipalByPrincipalNameAndPassword(
554                                principalName, password);
555        }
556
557    @Override
558    public Principal addPrincipalToEntity(Principal principal) {
559        return getInnerIdentityService().addPrincipalToEntity(principal);
560    }
561
562    @Override
563    public Principal updatePrincipal(Principal principal) {
564        return getInnerIdentityService().updatePrincipal(principal);
565    }
566
567    @Override
568    public Principal inactivatePrincipal(String principalId) {
569        return getInnerIdentityService().inactivatePrincipal(principalId);
570    }
571
572    @Override
573    public Principal inactivatePrincipalByName(String principalName) {
574        return getInnerIdentityService().inactivatePrincipalByName(principalName);
575    }
576
577    @Override
578    public EntityTypeContactInfo addEntityTypeContactInfoToEntity(EntityTypeContactInfo entityTypeContactInfo) {
579        return getInnerIdentityService().addEntityTypeContactInfoToEntity(entityTypeContactInfo);
580    }
581
582    @Override
583    public EntityTypeContactInfo updateEntityTypeContactInfo(EntityTypeContactInfo entityTypeContactInfo) {
584        return getInnerIdentityService().updateEntityTypeContactInfo(entityTypeContactInfo);
585    }
586
587    @Override
588    public EntityTypeContactInfo inactivateEntityTypeContactInfo(String entityId, String entityTypeCode) {
589        return getInnerIdentityService().inactivateEntityTypeContactInfo(entityId, entityTypeCode);
590    }
591
592    @Override
593    public EntityAddress addAddressToEntity(EntityAddress address) {
594        return getInnerIdentityService().addAddressToEntity(address);
595    }
596
597    @Override
598    public EntityAddress updateAddress(EntityAddress address) {
599        return getInnerIdentityService().updateAddress(address);
600    }
601
602    @Override
603    public EntityAddress inactivateAddress(String addressId) {
604        return getInnerIdentityService().inactivateAddress(addressId);
605    }
606
607    @Override
608    public EntityEmail addEmailToEntity(EntityEmail email) {
609        return getInnerIdentityService().addEmailToEntity(email);
610    }
611
612    @Override
613    public EntityEmail updateEmail(EntityEmail email) {
614        return getInnerIdentityService().updateEmail(email);
615    }
616
617    @Override
618    public EntityEmail inactivateEmail(String emailId) {
619        return getInnerIdentityService().inactivateEmail(emailId);
620    }
621
622    @Override
623    public EntityPhone addPhoneToEntity(EntityPhone phone) {
624        return getInnerIdentityService().addPhoneToEntity(phone);
625    }
626
627    @Override
628    public EntityPhone updatePhone(EntityPhone phone) {
629        return getInnerIdentityService().updatePhone(phone);
630    }
631
632    @Override
633    public EntityPhone inactivatePhone(String phoneId) {
634        return getInnerIdentityService().inactivatePhone(phoneId);
635    }
636
637    @Override
638    public EntityExternalIdentifier addExternalIdentifierToEntity(EntityExternalIdentifier externalId) {
639        return getInnerIdentityService().addExternalIdentifierToEntity(externalId);
640    }
641
642    @Override
643    public EntityExternalIdentifier updateExternalIdentifier(EntityExternalIdentifier externalId) {
644        return getInnerIdentityService().updateExternalIdentifier(externalId);
645    }
646
647    @Override
648    public EntityAffiliation addAffiliationToEntity(EntityAffiliation affiliation) {
649        return getInnerIdentityService().addAffiliationToEntity(affiliation);
650    }
651
652    @Override
653    public EntityAffiliation updateAffiliation(EntityAffiliation affiliation) {
654        return getInnerIdentityService().updateAffiliation(affiliation);
655    }
656
657    @Override
658    public EntityAffiliation inactivateAffiliation(String id) {
659        return getInnerIdentityService().inactivateAffiliation(id);
660    }
661
662
663        private IdentityService getInnerIdentityService() {
664                return innerIdentityService;
665        }
666
667        private IdentityArchiveService getIdentityArchiveService() {
668                return identityArchiveService;
669        }
670}