| package org.eclipse.openk.contactbasedata.service; |
| import lombok.extern.log4j.Log4j2; |
| import org.eclipse.openk.contactbasedata.model.TblInternalPerson; |
| import org.eclipse.openk.contactbasedata.repository.InternalPersonRepository; |
| import org.eclipse.openk.contactbasedata.service.util.LdapUserAttributesMapper; |
| import org.eclipse.openk.contactbasedata.viewmodel.LdapUser; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.ldap.core.LdapTemplate; |
| import org.springframework.stereotype.Service; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Objects; |
| import java.util.function.Function; |
| import java.util.stream.Collectors; |
| |
| import static org.springframework.ldap.query.LdapQueryBuilder.query; |
| |
| @Log4j2 |
| @Service |
| public class LdapUserService { |
| |
| @Autowired |
| LdapUserAttributesMapper ldapUserAttributesMapper; |
| |
| @Autowired |
| private InternalPersonRepository internalPersonRepository; |
| |
| @Autowired |
| private InternalPersonService internalPersonService; |
| |
| @Autowired |
| private LdapTemplate ldapTemplate; |
| |
| /** |
| * Retrieves all the persons in the ldap server, using {@link LdapUserAttributesMapper} |
| * @return list of persons |
| */ |
| public List<LdapUser> getAllLdapUsers() { |
| return ldapTemplate.search(query() |
| .where("objectclass").is("person"), ldapUserAttributesMapper); |
| } |
| |
| public void synchronize() { |
| List<TblInternalPerson> internalPersonList = internalPersonRepository.findByUidNotNull(); |
| |
| Map<String, TblInternalPerson> uidToInternalPersonMap = internalPersonList.stream().collect( |
| Collectors.toMap(TblInternalPerson::getUid, Function.identity())); |
| |
| List<LdapUser> allLdapUsers = getAllLdapUsers(); |
| |
| List<TblInternalPerson> internalPersonListSynchronized = new ArrayList<>(); |
| for (LdapUser ldapUser : allLdapUsers) { |
| TblInternalPerson tblInternalPerson = uidToInternalPersonMap.get(ldapUser.getUid()); |
| if (tblInternalPerson == null) continue; |
| boolean attributesChanged = mapLdapUserToInternaPerson(tblInternalPerson, ldapUser); |
| if (attributesChanged) { |
| internalPersonListSynchronized.add(tblInternalPerson); |
| } |
| } |
| |
| internalPersonRepository.saveAll(internalPersonListSynchronized); |
| } |
| |
| private boolean mapLdapUserToInternaPerson(TblInternalPerson tblInternalPerson, LdapUser ldapUser) { |
| boolean attributesChanged = false; |
| if (!Objects.equals(tblInternalPerson.getFirstName(), ldapUser.getFirstName()) |
| || !Objects.equals(tblInternalPerson.getLastName(), ldapUser.getLastName() ) |
| || !Objects.equals(tblInternalPerson.getTitle(), ldapUser.getTitle() ) |
| || !Objects.equals(tblInternalPerson.getDepartment(), ldapUser.getDepartment())) { |
| attributesChanged = true; |
| tblInternalPerson.setFirstName(ldapUser.getFirstName()); |
| tblInternalPerson.setLastName(ldapUser.getLastName()); |
| tblInternalPerson.setTitle(ldapUser.getTitle()); |
| tblInternalPerson.setDepartment(ldapUser.getDepartment()); |
| } |
| return attributesChanged; |
| } |
| |
| |
| } |