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 */
016package org.kuali.rice.kim.ldap;
017
018import static org.apache.commons.lang.StringUtils.contains;
019import static org.apache.commons.lang.StringUtils.equalsIgnoreCase;
020import static org.kuali.rice.core.util.BufferedLogger.debug;
021
022import java.util.ArrayList;
023import java.util.List;
024
025import org.apache.commons.lang.StringUtils;
026import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliation;
027import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliationType;
028import org.springframework.ldap.core.DirContextOperations;
029
030/**
031 * Maps LDAP Information to KIM Entity Affiliation
032 *
033 * @author Kuali Rice Team (rice.collab@kuali.org)
034 */
035public class EntityAffiliationMapper extends BaseMapper<List<EntityAffiliation>> {
036
037        @Override
038    List<EntityAffiliation> mapDtoFromContext(DirContextOperations context) {
039        List<EntityAffiliation.Builder> builders = mapBuilderFromContext(context);
040        List<EntityAffiliation> affiliations = new ArrayList<EntityAffiliation>();
041        if (builders != null) {
042                for (EntityAffiliation.Builder builder : builders) {
043                        affiliations.add(builder.build());
044                }
045        }
046        return affiliations;
047    }
048    
049    List<EntityAffiliation.Builder> mapBuilderFromContext(DirContextOperations context) {
050        List<EntityAffiliation.Builder> retval = new ArrayList<EntityAffiliation.Builder>();
051        final String primaryAffiliationProperty = getConstants().getPrimaryAffiliationLdapProperty();
052        final String affiliationProperty = getConstants().getAffiliationLdapProperty();
053        debug("Got affiliation ", context.getStringAttribute(primaryAffiliationProperty));
054        debug("Got affiliation ", context.getStringAttribute(affiliationProperty));
055        
056        String primaryAffiliation = context.getStringAttribute(primaryAffiliationProperty);
057        
058        int affiliationId = 1;
059        String affiliationCode = getAffiliationTypeCodeForName(primaryAffiliation);
060
061        final EntityAffiliation.Builder aff1 = EntityAffiliation.Builder.create();
062        aff1.setAffiliationType(EntityAffiliationType.Builder.create(affiliationCode == null ? "AFLT" : affiliationCode));
063        aff1.setCampusCode(getConstants().getDefaultCampusCode());
064        aff1.setId("" + affiliationId++);
065        aff1.setDefaultValue(true);
066        aff1.setActive(true);
067        retval.add(aff1);
068        
069        String[] affiliations = context.getStringAttributes(affiliationProperty);
070        // Create an empty array to prevent NPE
071        if (affiliations == null) {
072            affiliations = new String[] {};
073        }
074
075        for (String affiliation : affiliations) {
076            if (!StringUtils.equals(affiliation, primaryAffiliation)) {
077                affiliationCode = getAffiliationTypeCodeForName(affiliation);
078                if (affiliationCode != null && !hasAffiliation(retval, affiliationCode)) {
079                    final EntityAffiliation.Builder aff = EntityAffiliation.Builder.create();
080                    aff.setAffiliationType(EntityAffiliationType.Builder.create(affiliationCode));
081                    aff.setCampusCode(getConstants().getDefaultCampusCode());
082                    aff.setId("" + affiliationId++);
083                    aff.setDefaultValue(false);
084                    aff.setActive(true);
085                    retval.add(aff);
086                }
087            }
088        }
089        
090        return retval;
091    }
092    
093    /**
094     *
095     * Returns the affiliation type code for the given affiliation name. Returns null if the affiliation is not found
096     * @param affiliationName
097     * @return null if no matching affiliation is found
098     */
099    protected String getAffiliationTypeCodeForName(String affiliationName) {
100        String[] mappings = getConstants().getAffiliationMappings().split(",");
101        for (String affilMap : mappings) {
102            if (contains(affilMap, affiliationName)) {
103                return affilMap.split("=")[1];
104            }
105        }
106        return null;
107    }
108
109    protected boolean hasAffiliation(List<EntityAffiliation.Builder> affiliations, String affiliationCode) {
110        for (EntityAffiliation.Builder affiliation : affiliations) {
111            if (equalsIgnoreCase(affiliation.getAffiliationType().getCode(), affiliationCode)) {
112                return true;
113            }
114        }
115        return false;
116    }
117
118}