KON-43 Synchronisation Interne Personen mit LDAP
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/config/CorsConfig.java b/src/main/java/org/eclipse/openk/contactbasedata/config/CorsConfig.java
index 7988c90..486dd73 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/config/CorsConfig.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/config/CorsConfig.java
@@ -11,9 +11,6 @@
 @Configuration
 public class CorsConfig {
 
-    @Value("${cors.allowedOrigins}")
-    private String allowedOrigins;
-
     @Value("${cors.corsEnabled}")
     private boolean corsEnabled;
 
@@ -24,10 +21,8 @@
             public void addCorsMappings(CorsRegistry registry) {
                 if (corsEnabled) {
                     log.info("Cors enabled");
-                    log.info("AllowedOrigins: " + allowedOrigins);
                     registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
                             .allowedHeaders("*");
-                            //.allowedOrigins(allowedOrigins).maxAge(1800);
                 } else {
                     log.info("Cors disabled");
                 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/config/SchedulingConfig.java b/src/main/java/org/eclipse/openk/contactbasedata/config/SchedulingConfig.java
new file mode 100644
index 0000000..170f780
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/config/SchedulingConfig.java
@@ -0,0 +1,24 @@
+package org.eclipse.openk.contactbasedata.config;
+
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@Log4j2
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(prefix = "ldap.scheduling", name="enabled", havingValue="true", matchIfMissing = false)
+public class SchedulingConfig {
+
+    @Value("${ldap.scheduling.cron-expression}")
+    private String cronExpression;
+
+    @Bean
+    public void logConfig(){
+        log.info("Scheduler is enabled with cron expression: " + cronExpression);
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/LdapController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/LdapController.java
index a0f91e2..e5746aa 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/LdapController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/LdapController.java
@@ -22,12 +22,12 @@
 import org.eclipse.openk.contactbasedata.viewmodel.LdapUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 
 @Log4j2
@@ -46,13 +46,13 @@
         return ldapUserService.getAllLdapUsers();
     }
 
-    @ApiOperation(value = "Ermitteln der UserModules vom Auth'n'Auth-Service")
+    @ApiOperation(value = "Synchronisierung der User anhand des LDAPs")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
     @ResponseStatus(HttpStatus.OK)
     @GetMapping( "/sync")
-    public String syncLdapUser() {
-        ldapUserService.synchronize();
-        return  "";
+    public ResponseEntity<Object> syncLdapUser() {
+        ldapUserService.synchronizeLDAP();
+        return ResponseEntity.ok().build();
     }
 
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/UserController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/UserController.java
index 0ba1a58..cb581ce 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/UserController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/UserController.java
@@ -43,7 +43,7 @@
         return userService.getUserModules();
     }
 
-    @ApiOperation(value = "Ermitteln der der KeycloakUsers vom Auth'n'Auth-Service")
+    @ApiOperation(value = "Ermitteln der KeycloakUsers vom Auth'n'Auth-Service")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
     @GetMapping("/keycloak-users")
     public List<KeyCloakUser> getKeycloakUsers() {
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/KeyCloakUser.java b/src/main/java/org/eclipse/openk/contactbasedata/model/KeyCloakUser.java
index d1277c1..ad5a48e 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/KeyCloakUser.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/KeyCloakUser.java
@@ -15,83 +15,35 @@
 import java.util.Map;
 
 public class KeyCloakUser {
-    private String id;
-    private long createdTimestamp;
+
     private String username;
-    private boolean enabled;
-    private boolean totp;
-    private boolean emailVerified;
     private String firstName;
     private String lastName;
-    private String name;
-    private List<String> realmRoles;
-    private Map<String, List<String>> clientRoles;
 
-    private List<String> disableableCredentialTypes;
-    private List<String> requiredActions;
-
-    public String getId() { return id; }
-    public void setId(String id) { this.id = id; }
-
-    public long getCreatedTimestamp() { return createdTimestamp; }
-    public void setCreatedTimestamp(long createdTimestamp) { this.createdTimestamp = createdTimestamp; }
-
-    public String getUsername() { return username; }
-    public void setUsername(String username) { this.username = username; }
-
-    public void setTotp(boolean totp) { this.totp = totp; }
-
-    public void setEmailVerified(boolean emailVerified) { this.emailVerified = emailVerified; }
-
-    public String getFirstName() { return firstName; }
-    public void setFirstName(String firstName) { this.firstName = firstName; }
-
-    public String getLastName() { return lastName; }
-    public void setLastName(String lastName) { this.lastName = lastName; }
-
-    public List<String> getDisableableCredentialTypes() {
-        return disableableCredentialTypes;
-    }
-    public void setDisableableCredentialTypes(List<String> disableableCredentialTypes) { this.disableableCredentialTypes = disableableCredentialTypes; }
-
-    public List<String> getRequiredActions() {
-        return requiredActions;
-    }
-    public void setRequiredActions(List<String> requiredActions) { this.requiredActions = requiredActions; }
-
-    public boolean isEnabled() {
-        return enabled;
+    public KeyCloakUser() {
     }
 
-    public boolean isTotp() {
-        return totp;
+    public String getUsername() {
+        return username;
     }
 
-    public boolean isEmailVerified() {
-        return emailVerified;
+    public void setUsername(String username) {
+        this.username = username;
     }
 
-    public List<String> getRealmRoles() {
-        return realmRoles;
+    public String getFirstName() {
+        return firstName;
     }
 
-    public void setRealmRoles(List<String> realmRoles) {
-        this.realmRoles = realmRoles;
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
     }
 
-    public Map<String, List<String>> getClientRoles() {
-        return clientRoles;
+    public String getLastName() {
+        return lastName;
     }
 
-    public void setClientRoles(Map<String, List<String>> clientRoles) {
-        this.clientRoles = clientRoles;
-    }
-
-    public void setName() {
-        if (lastName!= null && !lastName.isEmpty()){
-            this.name = firstName+ " " + lastName;
-        } else {
-            this.name = firstName;
-        }
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
     }
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/InitPropertyLogger.java b/src/main/java/org/eclipse/openk/contactbasedata/service/InitPropertyLogger.java
new file mode 100644
index 0000000..92552b2
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/InitPropertyLogger.java
@@ -0,0 +1,37 @@
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.env.OriginTrackedMapPropertySource;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.env.AbstractEnvironment;
+import org.springframework.core.env.EnumerablePropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.core.env.MutablePropertySources;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.stream.StreamSupport;
+
+@Log4j2
+@Component
+public class InitPropertyLogger  {
+
+    @EventListener
+    public void handleContextRefresh(ContextRefreshedEvent event) {
+        final Environment environment = event.getApplicationContext().getEnvironment();
+        log.info("\n");
+        log.info("============== Configuration ==============");
+        log.info("Active profile: {}", Arrays.toString(environment.getActiveProfiles()));
+        final MutablePropertySources sources = ((AbstractEnvironment) environment).getPropertySources();
+        StreamSupport.stream(sources.spliterator(), false)
+                .filter(ps -> ps instanceof OriginTrackedMapPropertySource)
+                .map(ps -> ((OriginTrackedMapPropertySource) ps).getPropertyNames())
+                .flatMap(Arrays::stream)
+                .distinct()
+                .forEach(prop -> log.info("{}: {}", prop, environment.getProperty(prop)));
+        log.info("===========================================\n");
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/LdapUserService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/LdapUserService.java
index 424c28a..d661238 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/LdapUserService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/LdapUserService.java
@@ -1,17 +1,22 @@
 package org.eclipse.openk.contactbasedata.service;
 import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.model.RefCommunicationType;
+import org.eclipse.openk.contactbasedata.model.TblCommunication;
 import org.eclipse.openk.contactbasedata.model.TblInternalPerson;
+import org.eclipse.openk.contactbasedata.repository.CommunicationRepository;
+import org.eclipse.openk.contactbasedata.repository.CommunicationTypeRepository;
 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.beans.factory.annotation.Value;
 import org.springframework.ldap.core.LdapTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -21,6 +26,15 @@
 @Service
 public class LdapUserService {
 
+    @Value("${ldap.attribute-mapping.uid}")
+    private String uid;
+
+    @Value("${ldap.db-id-mapping.telephone-number-id}")
+    private Long telephoneNumberId;
+
+    @Value("${ldap.db-id-mapping.mail-id}")
+    private Long mailId;
+
     @Autowired
     LdapUserAttributesMapper ldapUserAttributesMapper;
 
@@ -28,46 +42,113 @@
     private InternalPersonRepository internalPersonRepository;
 
     @Autowired
-    private InternalPersonService internalPersonService;
-
-    @Autowired
     private LdapTemplate ldapTemplate;
 
+    @Autowired
+    private CommunicationTypeRepository communicationTypeRepository;
+
+    @Autowired
+    CommunicationRepository communicationRepository;
+
     /**
-     * Retrieves all the persons in the ldap server, using {@link LdapUserAttributesMapper}
-     * @return list of persons
+     * Retrieves all the LdapUsers in the ldap server, using {@link LdapUserAttributesMapper}
+     * @return list of LdapUsers
      */
     public List<LdapUser> getAllLdapUsers() {
         return ldapTemplate.search(query()
                 .where("objectclass").is("person"), ldapUserAttributesMapper);
     }
 
-    public void synchronize() {
+    /**
+     * Retrieves the distinct the LdapUsers from the ldap server, using {@link LdapUserAttributesMapper}
+     * @return ldapUsers
+     */
+    public List<LdapUser> getLdapUserByUID(String uid) {
+        return ldapTemplate.search(query()
+                .where("objectclass").is("person").and(this.uid).is(uid), ldapUserAttributesMapper);
+    }
+
+    @Transactional
+    public void synchronizeLDAP() {
         List<TblInternalPerson> internalPersonList = internalPersonRepository.findByUidNotNull();
 
         Map<String, TblInternalPerson> uidToInternalPersonMap = internalPersonList.stream().collect(
                 Collectors.toMap(TblInternalPerson::getUid, Function.identity()));
 
-        List<LdapUser> allLdapUsers = getAllLdapUsers();
+        List<LdapUser> allFoundLdapUsers = new ArrayList<>();
+        List<TblInternalPerson> allNotExistingLdapUsers = new ArrayList<>();
+        findExistingAndNotExistingLdapUsers(internalPersonList, allFoundLdapUsers, allNotExistingLdapUsers);
 
         List<TblInternalPerson> internalPersonListSynchronized = new ArrayList<>();
-        for (LdapUser ldapUser : allLdapUsers) {
+
+        RefCommunicationType refCommunicationTypeMail = getRefCommunicationType(mailId);
+        RefCommunicationType refCommunicationTypePhone = getRefCommunicationType(telephoneNumberId);
+
+        for (LdapUser ldapUser : allFoundLdapUsers) {
             TblInternalPerson tblInternalPerson = uidToInternalPersonMap.get(ldapUser.getUid());
             if (tblInternalPerson == null) continue;
-            boolean attributesChanged = mapLdapUserToInternaPerson(tblInternalPerson, ldapUser);
+            boolean attributesChanged = mapLdapUserToInternaPerson(tblInternalPerson, ldapUser, refCommunicationTypeMail, refCommunicationTypePhone);
             if (attributesChanged) {
                 internalPersonListSynchronized.add(tblInternalPerson);
             }
         }
 
+        //Update all not found users notes with the sync error message
+        internalPersonRepository.saveAll(allNotExistingLdapUsers);
+
+        //Update all found Users with the synchronized LDAP data
         internalPersonRepository.saveAll(internalPersonListSynchronized);
     }
 
-    private boolean mapLdapUserToInternaPerson(TblInternalPerson tblInternalPerson, LdapUser ldapUser) {
+    private RefCommunicationType getRefCommunicationType(Long refCommunicationTypeId) {
+        return communicationTypeRepository.findAll().stream()
+                .filter(x -> x.getId().equals(refCommunicationTypeId))
+                .findFirst()
+                .orElseThrow(NotFoundException::new);
+    }
+
+    private void findExistingAndNotExistingLdapUsers(List<TblInternalPerson> internalPersonList, List<LdapUser> allFoundLdapUsers, List<TblInternalPerson> allNotExistingLdapUsers) {
+        for (TblInternalPerson tblInternalPerson : internalPersonList) {
+            String uidTblInternalPerson = tblInternalPerson.getUid();
+            List<LdapUser> ldapUserByUIDResult = getLdapUserByUID(uidTblInternalPerson);
+
+            if(ldapUserByUIDResult.size() == 0){
+                String errorMsg = String.format("[LDAP Sync Error] User with Uid: [ %s ] can not be found in LDAP", uidTblInternalPerson);
+                setNoteAndLogSyncError(allNotExistingLdapUsers, tblInternalPerson, errorMsg);
+                continue;
+            }
+
+            if(ldapUserByUIDResult.size() > 1){
+                String errorMsg = String.format("[LDAP Sync Error] More than one result for UID: [ %s ] in LDAP", uidTblInternalPerson);
+                setNoteAndLogSyncError(allNotExistingLdapUsers, tblInternalPerson, errorMsg);
+                continue;
+            }
+
+            LdapUser ldapUser = ldapUserByUIDResult.get(0);
+            allFoundLdapUsers.add(ldapUser);
+        }
+    }
+
+    private void setNoteAndLogSyncError(List<TblInternalPerson> allNotExistingLdapUsers, TblInternalPerson tblInternalPerson, String errorMsg) {
+        log.error(errorMsg);
+        String note = tblInternalPerson.getContact().getNote();
+        if (note == null) note = "";
+        if (!note.contains(errorMsg)) {
+            note = note + System.lineSeparator() + errorMsg;
+            tblInternalPerson.getContact().setNote(note);
+            allNotExistingLdapUsers.add(tblInternalPerson);
+        }
+    }
+
+    private boolean mapLdapUserToInternaPerson(TblInternalPerson tblInternalPerson, LdapUser ldapUser, RefCommunicationType refCommunicationTypeMail, RefCommunicationType refCommunicationTypePhone) {
         boolean attributesChanged = false;
+
+        attributesChanged = isCommunicationDataChangedAndSync(tblInternalPerson, ldapUser.getMail(), refCommunicationTypeMail, attributesChanged, mailId);
+        attributesChanged = isCommunicationDataChangedAndSync(tblInternalPerson, ldapUser.getTelephoneNumber(), refCommunicationTypePhone, attributesChanged, telephoneNumberId);
+
         if (!Objects.equals(tblInternalPerson.getFirstName(), ldapUser.getFirstName())
-                || !Objects.equals(tblInternalPerson.getLastName(), ldapUser.getLastName() )
-                || !Objects.equals(tblInternalPerson.getTitle(), ldapUser.getTitle() )
+                || !Objects.equals(tblInternalPerson.getLastName(), ldapUser.getLastName())
+                || !Objects.equals(tblInternalPerson.getTitle(), ldapUser.getTitle())
                 || !Objects.equals(tblInternalPerson.getDepartment(), ldapUser.getDepartment())) {
             attributesChanged = true;
             tblInternalPerson.setFirstName(ldapUser.getFirstName());
@@ -78,5 +159,35 @@
         return attributesChanged;
     }
 
+    private boolean isCommunicationDataChangedAndSync(TblInternalPerson tblInternalPerson, String communicationdata, RefCommunicationType refCommunicationType, boolean attributesChanged, Long communicationTypeId) {
+        List<TblCommunication> tblCommunicationList = tblInternalPerson.getContact().getCommunications();
+
+        Optional<TblCommunication> optionalTblCommunication = tblCommunicationList.stream()
+                .filter(tblCommunication -> tblCommunication.getRefCommunicationType().getId().equals(communicationTypeId))
+                .findFirst();
+
+        if (optionalTblCommunication.isPresent()) {
+            if (!Objects.equals(optionalTblCommunication.get().getCommunicationData(), communicationdata)){
+                optionalTblCommunication.get().setCommunicationData(communicationdata);
+                attributesChanged = true;
+            }
+        } else {
+            attributesChanged = createAndSaveNewTblCommunication(tblInternalPerson, communicationdata, refCommunicationType, attributesChanged);
+        }
+        return attributesChanged;
+    }
+
+    private boolean createAndSaveNewTblCommunication(TblInternalPerson tblInternalPerson, String communicationData, RefCommunicationType refCommunicationType, boolean attributesChanged) {
+        if (StringUtils.isEmpty(communicationData)) return attributesChanged;
+        TblCommunication tblCommunication = new TblCommunication();
+        tblCommunication.setUuid(UUID.randomUUID());
+        tblCommunication.setTblContact(tblInternalPerson.getContact());
+        tblCommunication.setRefCommunicationType(refCommunicationType);
+        tblCommunication.setCommunicationData(communicationData);
+        communicationRepository.save(tblCommunication);
+        tblInternalPerson.getContact().getCommunications().add(tblCommunication);
+        return true;
+    }
+
 
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/SchedulingService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/SchedulingService.java
new file mode 100644
index 0000000..702e3ec
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/SchedulingService.java
@@ -0,0 +1,23 @@
+package org.eclipse.openk.contactbasedata.service;
+
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+
+@Log4j2
+@Service
+public class SchedulingService {
+
+    @Autowired
+    LdapUserService ldapUserService;
+
+    @Scheduled(cron = "${ldap.scheduling.cron-expression}")
+    public void scheduleTaskSynchronize() {
+        log.info("Executing scheduled task: Synchronizing Users");
+        ldapUserService.synchronizeLDAP();
+        log.info("Finished scheduled task: Synchronizing Users");
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/UserService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/UserService.java
index c0d96cb..1d946ca 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/UserService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/UserService.java
@@ -26,21 +26,17 @@
 
 @Service
 public class UserService {
+
     @Autowired
     private AuthNAuthApi authNAuthApi;
 
-    @Value("${jwt.staticJwt}")
-    private String staticJwt;
-
     public List<UserModule> getUserModules() {
         String bearerToken = (String)SecurityContextHolder.getContext().getAuthentication().getDetails();
         return authNAuthApi.getUserModulesForUser(bearerToken);
     }
 
     public List<KeyCloakUser> getKeycloakUsers() {
-        //String bearerToken = (String)SecurityContextHolder.getContext().getAuthentication().getDetails();
-        Object details = SecurityContextHolder.getContext().getAuthentication().getDetails();
-        String bearerToken = staticJwt;
+        String bearerToken = (String)SecurityContextHolder.getContext().getAuthentication().getDetails();
         return authNAuthApi.getKeycloakUsers(bearerToken);
     }
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/util/LdapUserAttributesMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/service/util/LdapUserAttributesMapper.java
index 2738cc2..033f5bf 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/util/LdapUserAttributesMapper.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/util/LdapUserAttributesMapper.java
@@ -29,25 +29,31 @@
     ----------------------
     */
 
-    @Value("${ldap.uid}")
+    @Value("${ldap.attribute-mapping.uid}")
     private String uid;
 
-    @Value("${ldap.fullname}")
+    @Value("${ldap.attribute-mapping.fullname}")
     private String fullname;
 
-    @Value("${ldap.lastname}")
+    @Value("${ldap.attribute-mapping.lastname}")
     private String lastname;
 
-    @Value("${ldap.firstname}")
+    @Value("${ldap.attribute-mapping.firstname}")
     private String firstname;
 
-    @Value("${ldap.title}")
+    @Value("${ldap.attribute-mapping.title}")
     private String title;
 
-    @Value("${ldap.mail}")
+    @Value("${ldap.attribute-mapping.department}")
+    private String department;
+
+    @Value("${ldap.attribute-mapping.mail}")
     private String mail;
 
-    @Value("${ldap.password}")
+    @Value("${ldap.attribute-mapping.telephone-number}")
+    private String telephoneNumber;
+
+    @Value("${ldap.attribute-mapping.password}")
     private String password;
 
 
@@ -75,6 +81,14 @@
         if (attribute != null) {
             ldapUser.setTitle((String) attribute.get());
         }
+        attribute = attributes.get(department);
+        if (attribute != null) {
+            ldapUser.setDepartment((String) attribute.get());
+        }
+        attribute = attributes.get(telephoneNumber);
+        if (attribute != null) {
+            ldapUser.setTelephoneNumber((String) attribute.get());
+        }
         attribute = attributes.get(mail);
         if (attribute != null) {
             ldapUser.setMail((String) attribute.get());
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/LdapUser.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/LdapUser.java
index 6b1601b..5d5db8f 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/LdapUser.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/LdapUser.java
@@ -18,6 +18,8 @@
     private String title;
     private String department;
     private String mail;
+    private String telephoneNumber;
+
     private byte[] password;
 
     public LdapUser() {
@@ -102,6 +104,14 @@
         this.title = title;
     }
 
+    public String getTelephoneNumber() {
+        return telephoneNumber;
+    }
+
+    public void setTelephoneNumber(String telephoneNumber) {
+        this.telephoneNumber = telephoneNumber;
+    }
+
     @Override
     public String toString() {
         return uid;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 774100c..83830a7 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -25,13 +25,22 @@
     urls: ldap://entopkon:10389
 
 ldap:
-  uid: uid
-  fullname: cn
-  lastname: sn
-  firstname: givenname
-  title: title
-  mail: mail
-  password: userpassword
+  attribute-mapping:
+    uid: uid
+    fullname: cn
+    lastname: sn
+    firstname: givenname
+    title: title
+    mail: mail
+    department: department
+    telephone-number: phone
+    password: userpassword
+  db-id-mapping:
+    mail-id: 1
+    telephone-number-id: 2
+  scheduling:
+    enabled: false
+    cron-expression: '*/10 * * * * *'
 
 server:
   max-http-header-size: 262144
@@ -56,7 +65,6 @@
         connectTimeout: 60000
         readTimeout: 60000
 cors:
-  allowedOrigins: http://localhost:8080
   corsEnabled: false
 
 logging:
@@ -84,6 +92,26 @@
 ---
 
 spring:
+  profiles: devserver-local
+
+jwt:
+  tokenHeader: Authorization
+  useStaticJwt: false
+  staticJwt: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJIYlI3Z2pobmE2eXJRZnZJTWhUSV9tY2g3ZmtTQWVFX3hLTjBhZVl0bjdjIn0.eyJqdGkiOiI5MGI0NGFkOC1iYjlmLTQ1MzktYTQwYy0yYjQyZTNkNjNiOGEiLCJleHAiOjE1Nzg2NTU3OTUsIm5iZiI6MCwiaWF0IjoxNTc4NjU1NDk1LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvRWxvZ2Jvb2siLCJhdWQiOiJlbG9nYm9vay1iYWNrZW5kIiwic3ViIjoiODYyNjY5NmYtZjFhMi00ZGI1LTkyZWYtZTlhMjQ2Njg1YTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiZWxvZ2Jvb2stYmFja2VuZCIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjJmMWIzODE5LWZjNjQtNDEzNC1iNWQxLWY3ZWY4NzU5NDBkNCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiKiJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsia29uLWFkbWluIiwia29uLXdyaXRlciIsImtvbi1hY2Nlc3MiLCJrb24tcmVhZGVyIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnt9LCJuYW1lIjoiVGVzdGVyRmlyc3RuYW1lX3J3YSBUZXN0ZXJMYXN0bmFtZV9yd2EiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlcl9yd2EiLCJnaXZlbl9uYW1lIjoiVGVzdGVyRmlyc3RuYW1lX3J3YSIsImZhbWlseV9uYW1lIjoiVGVzdGVyTGFzdG5hbWVfcndhIn0.DAYXuv4tKn8RXqO1jyttnD-tF4nShUBQyfe4bKbAiPAyY2x5YbAf3M4eXnLrGqo8-loGKldICC28bL0LaMA3KKkQEOfW5sfpGqoN6212vs89mOklt0TJYc5PMXwFgJ5WC_TKjdwq7-aaDafOEWehV0U1ut3s-94ovNYIEn29nzXm2W1ldoXJEq03F880jlysQ5zlRvGF7eXEEpFfI2URyyNQ2UWh0Ssfq-gOAt2pbF1u6prA5RfvUmZ3v1eu21YLGZtgqPqxb1l6odyH3ip15j_HdgnTeo52ymxuRUj65Mskme3V5ev2DitHI9vZgnpV8Idhb4TTWliBeGCOMfDFCg
+
+server:
+  port: 9155
+
+cors:
+  corsEnabled: true
+
+authNAuthService:
+  ribbon:
+    listOfServers: http://localhost:8080
+
+---
+
+spring:
   profiles: devserver
 
 jwt:
@@ -95,7 +123,6 @@
   port: 9155
 
 cors:
-  allowedOrigins: http://localhost:8080
   corsEnabled: true
 
 
@@ -113,7 +140,6 @@
   port: 9156
 
 cors:
-  allowedOrigins: http://localhost:8080
   corsEnabled: true
 
 ---
@@ -148,5 +174,4 @@
     listOfServers: http://localhost:8080
 
 cors:
-  allowedOrigins: http://localhost:8080
   corsEnabled: true
\ No newline at end of file