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}