/**
  * @param \Claroline\MessageBundle\Entity\Message $message
  * @param bool setAsSent
  *
  * @return \Claroline\MessageBundle\Entity\Message
  */
 public function send(Message $message, $setAsSent = true, $sendMail = true)
 {
     if (substr($receiversString = $message->getTo(), -1, 1) === ';') {
         $receiversString = substr_replace($receiversString, '', -1);
     }
     $receiversNames = explode(';', $receiversString);
     $usernames = array();
     $groupNames = array();
     $workspaceCodes = array();
     $userReceivers = array();
     $groupReceivers = array();
     $workspaceReceivers = array();
     //split the string of target into different array.
     foreach ($receiversNames as $receiverName) {
         if (substr($receiverName, 0, 1) === '{') {
             $groupNames[] = trim($receiverName, '{}');
         } else {
             if (substr($receiverName, 0, 1) === '[') {
                 $workspaceCodes[] = trim($receiverName, '[]');
             } else {
                 $usernames[] = $receiverName;
             }
         }
     }
     //get the different entities from the freshly created array.
     if (count($usernames) > 0) {
         $userReceivers = $this->userRepo->findByUsernames($usernames);
     }
     if (count($groupNames) > 0) {
         $groupReceivers = $this->groupRepo->findGroupsByNames($groupNames);
     }
     if (count($workspaceCodes) > 0) {
         $workspaceReceivers = $this->workspaceRepo->findWorkspacesByCode($workspaceCodes);
     }
     if (null !== $message->getParent()) {
         $message->setParent($message->getParent());
     }
     $this->om->persist($message);
     if ($setAsSent && $message->getSender()) {
         $userMessage = $this->om->factory('Claroline\\MessageBundle\\Entity\\UserMessage');
         $userMessage->setIsSent(true);
         $userMessage->setUser($message->getSender());
         $userMessage->setMessage($message);
         $this->om->persist($userMessage);
     }
     $mailNotifiedUsers = array();
     //get every users which are going to be notified
     foreach ($groupReceivers as $groupReceiver) {
         $users = $this->userRepo->findByGroup($groupReceiver);
         foreach ($users as $user) {
             $userReceivers[] = $user;
         }
     }
     //workspaces are going to be notified
     foreach ($workspaceReceivers as $workspaceReceiver) {
         $users = $this->userRepo->findByWorkspaceWithUsersFromGroup($workspaceReceiver);
         foreach ($users as $user) {
             $userReceivers[] = $user;
         }
     }
     $ids = [];
     $filteredUsers = array_filter($userReceivers, function ($user) use(&$ids) {
         if (!in_array($user->getId(), $ids)) {
             $ids[] = $user->getId();
             return true;
         }
     });
     foreach ($filteredUsers as $filteredUser) {
         $userMessage = $this->om->factory('Claroline\\MessageBundle\\Entity\\UserMessage');
         $userMessage->setUser($filteredUser);
         $userMessage->setMessage($message);
         $this->om->persist($userMessage);
         if ($filteredUser->isMailNotified()) {
             $mailNotifiedUsers[] = $filteredUser;
         }
     }
     if ($sendMail) {
         $this->mailManager->send($message->getObject(), $message->getContent(), $mailNotifiedUsers, $message->getSender());
     }
     $this->om->flush();
     return $message;
 }
 protected static function createMessage($alias, User $sender, array $receivers, $object, $content, Message $parent = null, $removed = false)
 {
     $message = new Message();
     $message->setSender($sender);
     $message->setObject($object);
     $message->setContent($content);
     $message->setDate(self::$time);
     $message->setTo('x1;x2;x3');
     if ($parent) {
         $message->setParent($parent);
     }
     self::$om->startFlushSuite();
     self::create($alias, $message);
     $userMessage = new UserMessage();
     $userMessage->setIsSent(true);
     $userMessage->setUser($sender);
     $userMessage->setMessage($message);
     if ($removed) {
         $userMessage->markAsRemoved($removed);
     }
     self::create($alias . '/' . $sender->getUsername(), $userMessage);
     foreach ($receivers as $receiver) {
         $userMessage = new UserMessage();
         $userMessage->setUser($receiver);
         $userMessage->setMessage($message);
         self::create($alias . '/' . $receiver->getUsername(), $userMessage);
     }
     self::$om->endFlushSuite();
 }