public function addDcIfNotExist($dn, $name)
 {
     if (!$this->ldap->isEntityExist($dn)) {
         $data = array();
         $data['dc'] = $name;
         $data['o'] = $name;
         $data['objectclass'] = array('top', 'organization', 'dcObject');
         $this->ldap->add($dn, $data);
         $this->logger->info("Created Dc:'" . $dn . "''");
     }
 }
 public function update(User $user)
 {
     $errors = $this->validator->validate($user);
     if (count($errors) > 0) {
         throw new InvalidArgumentException((string) $errors);
     }
     // rehash changed passwords
     if ($user->getPasswordObject()->getPasswordPlain() !== null) {
         $this->encodePassword($user->getEncoder(), $user->getPasswordObject());
     }
     // validate ldap schemas
     foreach ($user->getObjects() as $object) {
         $errors = $this->validator->validate($object);
         if (count($errors) > 0) {
             throw new InvalidArgumentException($this->getUsername() . '(User):' . (string) $errors);
         }
     }
     $transformer = new LdapArrayToObjectTransformer(null);
     $this->client->replace('uid=' . $user->getUsername() . ',ou=users,' . $this->baseDn, $transformer->transform($user));
     foreach ($user->getServices() as $service) {
         $dn = 'uid=' . $user->getUsername() . ',ou=users,dc=' . $service->getName() . ',' . $this->baseDn;
         if ($service->isEnabled()) {
             foreach ($service->getPasswords() as $password) {
                 if ($password->getPasswordPlain() !== null) {
                     $this->encodePassword($service->getEncoder(), $password);
                 }
             }
             // validate ldap schemas
             foreach ($service->getObjects() as $object) {
                 $errors = $this->validator->validate($object);
                 if (count($errors) > 0) {
                     throw new InvalidArgumentException($service->getName() . "(Service): " . (string) $errors);
                 }
             }
             if ($this->client->isEntityExist($dn)) {
                 $this->client->replace($dn, $transformer->transform($service));
             } else {
                 $this->client->add($dn, $transformer->transform($service));
             }
             //add groups
             foreach ($service->getGroups() as $group) {
                 $dnGroup = 'uid=' . $user->getUsername() . ',ou=groups,dc=' . $service->getName() . ',' . $this->baseDn;
                 $errors = $this->validator->validate($group);
                 if (count($errors) > 0) {
                     throw new InvalidArgumentException($group->getName() . "(Group): " . (string) $errors);
                 }
                 if ($group->isEnabled()) {
                     if ($this->client->isEntityExist($dnGroup)) {
                         $this->client->replace($dnGroup, $transformer->transform($service));
                     } else {
                         $this->client->add($dnGroup, $transformer->transform($service));
                     }
                 } else {
                     if ($this->client->isEntityExist($dnGroup)) {
                         $this->client->delete($dnGroup);
                     }
                 }
             }
         } else {
             // !$service->isEnabled()
             if ($this->client->isEntityExist($dn)) {
                 $this->client->delete($dn);
             }
         }
     }
 }