PageRenderTime 26ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/plugins/docman/include/Docman_VersionFactory.class.php

https://gitlab.com/prenaud76/tuleap
PHP | 296 lines | 161 code | 24 blank | 111 comment | 26 complexity | 4abf5eefeb6bd2c28e6d88bdc7313b86 MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception, LGPL-3.0, GPL-2.0, GPL-3.0
  1. <?php
  2. /*
  3. * Copyright (c) STMicroelectronics, 2006. All Rights Reserved.
  4. *
  5. * Originally written by Manuel Vacelet, 2006
  6. *
  7. * This file is a part of Codendi.
  8. *
  9. * Codendi is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * Codendi is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with Codendi. If not, see <http://www.gnu.org/licenses/>.
  21. */
  22. require_once('Docman_VersionDao.class.php');
  23. require_once('Docman_Version.class.php');
  24. /**
  25. * VersionFactory is a transport object (aka container) used to share data between
  26. * Model/Controler and View layer of the application
  27. */
  28. class Docman_VersionFactory {
  29. function Docman_VersionFactory() {
  30. }
  31. function create($row) {
  32. $dao =& $this->_getVersionDao();
  33. return $dao->createFromRow($row);
  34. }
  35. var $dao;
  36. function &_getVersionDao() {
  37. if (!$this->dao) {
  38. $this->dao =& new Docman_VersionDao(CodendiDataAccess::instance());
  39. }
  40. return $this->dao;
  41. }
  42. function _getEventManager() {
  43. return EventManager::instance();
  44. }
  45. function _getItemFactory() {
  46. return new Docman_ItemFactory();
  47. }
  48. function _getUserManager() {
  49. return UserManager::instance();
  50. }
  51. function getAllVersionForItem(&$item) {
  52. $dao =& $this->_getVersionDao();
  53. $dar = $dao->searchByItemId($item->getId());
  54. $versions = false;
  55. if ($dar && !$dar->isError()) {
  56. $versions = array();
  57. while ($dar->valid()) {
  58. $row = $dar->current();
  59. $versions[] = new Docman_Version($row);
  60. $dar->next();
  61. }
  62. }
  63. return $versions;
  64. }
  65. public function getCurrentVersionForItem($item) {
  66. $all_versions = $this->getAllVersionForItem($item);
  67. if (! empty($all_versions)) {
  68. return $all_versions[0];
  69. }
  70. return null;
  71. }
  72. function getSpecificVersion($item, $number) {
  73. $dao = $this->_getVersionDao();
  74. $dar = $dao->searchByNumber($item->getId(), $number);
  75. $version = null;
  76. if ($dar && !$dar->isError() && $dar->valid()) {
  77. $version = new Docman_Version($dar->current());
  78. }
  79. return $version;
  80. }
  81. /**
  82. * Returns the version of a given id
  83. *
  84. * @param Integer $id Id of the version
  85. * @param String $table Table name
  86. *
  87. * @return Docman_Version | null
  88. */
  89. function getSpecificVersionById($id, $table = 'plugin_docman_version_deleted') {
  90. $dao = $this->_getVersionDao();
  91. $dar = $dao->searchById($id, $table);
  92. $version = null;
  93. if ($dar && !$dar->isError() && $dar->valid()) {
  94. $version = new Docman_Version($dar->current());
  95. }
  96. return $version;
  97. }
  98. /**
  99. * Retrieve the next available version number for a file
  100. *
  101. * @param Docman_File $item
  102. *
  103. * @return Integer
  104. */
  105. function getNextVersionNumber($item) {
  106. $dao = $this->_getVersionDao();
  107. return $dao->searchNextVersionNumber($item->getId());
  108. }
  109. /**
  110. * Delete given version of document
  111. *
  112. * @param Docman_Version $item
  113. * @param Integer $number
  114. *
  115. * @return Boolean
  116. */
  117. function deleteSpecificVersion($item, $number) {
  118. // The event must be processed before the version is deleted
  119. $version = $this->getSpecificVersion($item, $number) ;
  120. $user = $this->_getUserManager()->getCurrentUser();
  121. $version->fireDeleteEvent($item, $user);
  122. $dao = $this->_getVersionDao();
  123. return $dao->deleteSpecificVersion($item->getId(), $number);
  124. }
  125. /**
  126. * Physically remove files related to deleted versions
  127. *
  128. * @param Integer $time
  129. *
  130. * @return Boolean
  131. */
  132. public function purgeDeletedVersions($time) {
  133. $dao = $this->_getVersionDao();
  134. $dar = $dao->listVersionsToPurge($time);
  135. if ($dar && !$dar->isError()) {
  136. foreach ($dar as $row) {
  137. $version = new Docman_Version($row);
  138. $this->purgeDeletedVersion($version);
  139. }
  140. return true;
  141. }
  142. return false;
  143. }
  144. /**
  145. * Invoque ''archive deleted item' hook in order to make a backup of a given item version.
  146. * This method should be used whithin the deleted docman version purge process
  147. *
  148. * @param Docman_Version $version Deleted docman item version
  149. *
  150. * @return Void
  151. */
  152. public function archiveBeforePurge($version) {
  153. $item = $this->_getItemFactory()->getItemFromDb($version->getItemId(), array('ignore_deleted' => true));
  154. $prefix = $item->getGroupId().'_i'.$version->getItemId().'_v'.$version->getNumber();
  155. $params = array('source_path' => $version->getPath(),
  156. 'archive_prefix' => $prefix);
  157. $this->_getEventManager()->processEvent('archive_deleted_item', $params);
  158. }
  159. /**
  160. * Physically remove the given version from the filesystem
  161. *
  162. * @param Docman_Version $version
  163. *
  164. * @return Boolean
  165. */
  166. public function purgeDeletedVersion($version) {
  167. $this->archiveBeforePurge($version);
  168. if (file_exists($version->getPath()) && $this->physicalDeleteVersion($version->getPath())) {
  169. $dao = $this->_getVersionDao();
  170. return $dao->setPurgeDate($version->getId(), time());
  171. }
  172. return false;
  173. }
  174. /**
  175. * Restore one version
  176. *
  177. * @param Docman_Version $version
  178. *
  179. * @return Boolean
  180. */
  181. public function restore($version) {
  182. $dao = $this->_getVersionDao();
  183. $dar = $dao->searchDeletedVersion($version->getItemId(), $version->getNumber());
  184. if ($dar && !$dar->isError()) {
  185. $row = $dar->getRow();
  186. if (!$row['purge_date'] && file_exists($row['path'])) {
  187. if ($dao->restore($version->getItemId(), $version->getNumber())) {
  188. // Log the event
  189. // Take into account deleted items because, when we restore a deleted item
  190. // the versions are restored before the item (because we restore the item
  191. // only if at least one version was restored successfully
  192. $item = $this->_getItemFactory()->getItemFromDb($version->getItemId(), array('ignore_deleted' => true));
  193. $user = $this->_getUserManager()->getCurrentUser();
  194. $value = $version->getNumber();
  195. if ($row['label'] !== '') {
  196. $value .= ' ('.$row['label'].')';
  197. }
  198. $this->_getEventManager()->processEvent('plugin_docman_event_restore_version', array(
  199. 'group_id' => $item->getGroupId(),
  200. 'item' => $item,
  201. 'old_value' => $value,
  202. 'user' => $user)
  203. );
  204. return true;
  205. }
  206. }
  207. }
  208. return false;
  209. }
  210. /**
  211. * @param String $docman_path
  212. * @param Project $project
  213. * @param String $new_name
  214. * @return Boolean
  215. */
  216. function renameProject($docman_path, $project, $new_name){
  217. $updateSystem = rename($docman_path.$project->getUnixName(true), $docman_path.strtolower($new_name));
  218. if ($updateSystem){
  219. $dao = $this->_getVersionDao();
  220. return $dao->renameProject($docman_path, $project, $new_name);
  221. }
  222. return false;
  223. }
  224. /**
  225. * List pending versions ( marked as deleted but not physically removed yet)
  226. * in order to ease the restore
  227. *
  228. * @param Integer $groupId
  229. * @param Integer $offset
  230. * @param Integer $limit
  231. *
  232. * @return Array
  233. */
  234. function listPendingVersions($groupId, $offset, $limit) {
  235. $dao = $this->_getVersionDao();
  236. return $dao->listPendingVersions($groupId, $offset, $limit);
  237. }
  238. /**
  239. * List versions of the item that are deleted but not already purged
  240. *
  241. * @param Docman_Item $item
  242. *
  243. * @return Array()
  244. */
  245. function listVersionsToPurgeForItem($item) {
  246. $dao = $this->_getVersionDao();
  247. $dar = $dao->listVersionsToPurgeByItemId($item->getId());
  248. if ($dar && !$dar->isError() && $dar->rowCount() > 0) {
  249. $list = array();
  250. foreach ($dar as $row) {
  251. $version = new Docman_Version($row);
  252. $list[] = $version;
  253. }
  254. return $list;
  255. }
  256. return false;
  257. }
  258. /**
  259. * Wrapper to unlink
  260. *
  261. * @param String $path
  262. *
  263. * @return Boolean
  264. */
  265. function physicalDeleteVersion($path) {
  266. if (unlink($path)) {
  267. return true;
  268. }
  269. return false;
  270. }
  271. }
  272. ?>