/* * Copyright (c) 2010 Lockheed Martin Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.eurekastreams.server.persistence.mappers.db; import java.util.HashMap; import org.eurekastreams.server.domain.Person; import org.eurekastreams.server.persistence.mappers.BaseArgDomainMapper; import org.eurekastreams.server.persistence.mappers.requests.UpdatePersonResponse; /** * Mapper to update the person in the DB with any additional properties found from ldap or updated last name. */ public class UpdatePersonMapper extends BaseArgDomainMapper<Person, UpdatePersonResponse> { /** * Update the person in the DB. * * @param ldapPerson * {@link Person}. * @return {@link UpdatePersonResponse}. */ @Override public UpdatePersonResponse execute(final Person ldapPerson) { Person dbPerson = (Person) getEntityManager().createQuery("FROM Person where accountId = :accountId") .setParameter("accountId", ldapPerson.getAccountId()).getSingleResult(); HashMap<String, String> ldapAdditionalProperties = ldapPerson.getAdditionalProperties(); HashMap<String, String> dbAdditionalProperties = dbPerson.getAdditionalProperties(); boolean wasPersonUpdated = false; // Checks to see if last name in ldap matches what the db has, updating db if they don't match. if (!dbPerson.getLastName().equals(ldapPerson.getLastName())) { dbPerson.setLastName(ldapPerson.getLastName()); wasPersonUpdated = true; } // Checks to see if company in ldap matches what the db has, updating db if they don't match. if (dbPerson.getCompanyName() == null && ldapPerson.getCompanyName() != null || (dbPerson.getCompanyName() != null && !dbPerson.getCompanyName().equals(ldapPerson.getCompanyName()))) { dbPerson.setCompanyName(ldapPerson.getCompanyName()); wasPersonUpdated = true; } // Looks for any additional properties defined for the person retrieved from ldap call. if (ldapAdditionalProperties != null && !ldapAdditionalProperties.isEmpty()) { boolean changed = false; if (dbAdditionalProperties == null) { changed = true; } else { // determine if properties are different // first check for new or changed values for (String key : ldapAdditionalProperties.keySet()) { String value = ldapAdditionalProperties.get(key); if (!value.equalsIgnoreCase(dbAdditionalProperties.get(key))) { changed = true; break; } } // then check for deleted values if (!changed) { for (String key : dbAdditionalProperties.keySet()) { if (!ldapAdditionalProperties.containsKey(key)) { changed = true; break; } } } } // Updates the db user, if necessary. if (changed) { dbPerson.setAdditionalProperties(ldapAdditionalProperties); wasPersonUpdated = true; } } // Finds if any previously set db properties are no longer necessary due to not being defined on ldap person. else if (dbAdditionalProperties != null) { dbPerson.setAdditionalProperties(null); wasPersonUpdated = true; } if (wasPersonUpdated) { getEntityManager().flush(); } return new UpdatePersonResponse(dbPerson.getId(), wasPersonUpdated); } }