001 /**
002 * Copyright 2005-2012 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.ldap;
017
018 import static org.apache.commons.lang.StringUtils.contains;
019 import static org.apache.commons.lang.StringUtils.equalsIgnoreCase;
020 import static org.kuali.rice.core.util.BufferedLogger.debug;
021
022 import java.util.ArrayList;
023 import java.util.List;
024
025 import org.apache.commons.lang.StringUtils;
026 import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliation;
027 import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliationType;
028 import 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 */
035 public 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 }