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