/**
  * Save the value and return the id
  *
  * @param Tracker_Artifact                $artifact                The artifact
  * @param int                             $changeset_value_id      The id of the changeset_value
  * @param mixed                           $value                   The value submitted by the user
  * @param Tracker_Artifact_ChangesetValue $previous_changesetvalue The data previously stored in the db
  *
  * @return boolean
  */
 protected function saveValue($artifact, $changeset_value_id, $value, Tracker_Artifact_ChangesetValue $previous_changesetvalue = null)
 {
     $save_ok = true;
     $success = array();
     $dao = $this->getValueDao();
     //first save the previous files
     if ($previous_changesetvalue) {
         $previous_fileinfo_ids = array();
         foreach ($previous_changesetvalue as $previous_attachment) {
             if (empty($value['delete']) || !in_array($previous_attachment->getId(), $value['delete'])) {
                 $previous_fileinfo_ids[] = $previous_attachment->getId();
             }
         }
         if (count($previous_fileinfo_ids)) {
             $save_ok = $save_ok && $dao->create($changeset_value_id, $previous_fileinfo_ids);
         }
     }
     //Now save the new submitted files
     $current_user = UserManager::instance()->getCurrentUser();
     $r = new Rule_File();
     foreach ($value as $i => $file_info) {
         if ("{$i}" != 'delete' && $r->isValid($file_info)) {
             $temporary = new Tracker_Artifact_Attachment_TemporaryFileManager($this->getCurrentUser(), $this->getTemporaryFileManagerDao(), $this->getFileInfoFactory());
             if (isset($file_info['id'])) {
                 $temporary_file = $temporary->getFileByTemporaryName($file_info['id']);
             }
             if (isset($temporary_file)) {
                 $attachment = new Tracker_FileInfo($temporary_file->getId(), $this, $current_user->getId(), trim($temporary_file->getDescription()), $temporary_file->getName(), $temporary_file->getSize(), $temporary_file->getType());
                 if ($this->createAttachmentForRest($attachment, $file_info)) {
                     $success[] = $attachment->getId();
                 }
             } else {
                 $attachment = new Tracker_FileInfo(null, $this, $current_user->getId(), trim($file_info['description']), $file_info['name'], $file_info['size'], $file_info['type']);
                 if ($this->createAttachment($attachment, $file_info)) {
                     $success[] = $attachment->getId();
                 }
             }
         }
     }
     if (count($success)) {
         $save_ok = $save_ok && $dao->create($changeset_value_id, $success);
     }
     return $save_ok;
 }