+ $oldpath = File::path($this->getFilename());
+ $thumbpath = self::path($this->getFilename());
+
+ // If we have a file in our old thumbnail storage path, move (or copy) it to the new one
+ // (if the if/elseif don't match, we have a $thumbpath just as we should and can return it)
+ if (file_exists($oldpath) && !file_exists($thumbpath)) {
+ try {
+ // let's get the filename of the File, to check below if it happens to be identical
+ $file_filename = $this->getFile()->getFilename();
+ } catch (NoResultException $e) {
+ // reasonably the function calling us will handle the following as "File_thumbnail entry should be deleted"
+ throw new FileNotFoundException($thumbpath);
+ } catch (InvalidFilenameException $e) {
+ // invalid filename in getFile()->getFilename(), just
+ // means the File object isn't stored locally and that
+ // means it's safe to move it below.
+ $file_filename = null;
+ }
+
+ if ($this->getFilename() === $file_filename) {
+ // special case where thumbnail file exactly matches stored File filename
+ common_debug('File filename and File_thumbnail filename match on '.$this->file_id.', copying instead');
+ copy($oldpath, $thumbpath);
+ } elseif (!rename($oldpath, $thumbpath)) {
+ common_log(LOG_ERR, 'Could not move thumbnail from '._ve($oldpath).' to '._ve($thumbpath));
+ throw new ServerException('Could not move thumbnail from old path to new path.');
+ } else {
+ common_log(LOG_DEBUG, 'Moved thumbnail '.$this->file_id.' from '._ve($oldpath).' to '._ve($thumbpath));
+ }
+ } elseif (!file_exists($thumbpath)) {
+ throw new FileNotFoundException($thumbpath);