From 3265bbb1841cc2379621d0dc83ffce9e47985e45 Mon Sep 17 00:00:00 2001 From: Umherirrender Date: Thu, 14 Mar 2019 19:50:40 +0100 Subject: [PATCH] Move class RevisionListBase and friends to own file Change-Id: I2c3675286bef948585ee0364288081aad9fd4376 --- .phpcs.xml | 2 - autoload.php | 8 +- includes/RevisionList.php | 447 --------------------- includes/revisionlist/RevisionItem.php | 135 +++++++ includes/revisionlist/RevisionItemBase.php | 177 ++++++++ includes/revisionlist/RevisionList.php | 53 +++ includes/revisionlist/RevisionListBase.php | 148 +++++++ 7 files changed, 517 insertions(+), 453 deletions(-) delete mode 100644 includes/RevisionList.php create mode 100644 includes/revisionlist/RevisionItem.php create mode 100644 includes/revisionlist/RevisionItemBase.php create mode 100644 includes/revisionlist/RevisionList.php create mode 100644 includes/revisionlist/RevisionListBase.php diff --git a/.phpcs.xml b/.phpcs.xml index f4d6177a98..69346483b8 100644 --- a/.phpcs.xml +++ b/.phpcs.xml @@ -71,7 +71,6 @@ any new occurrences. --> */includes/Feed\.php - */includes/RevisionList\.php */includes/installer/PhpBugTests\.php */includes/specials/SpecialMostinterwikis\.php */includes/compat/XMPReader\.php @@ -232,7 +231,6 @@ */includes/poolcounter/PoolCounter\.php */includes/PrefixSearch\.php */includes/profiler/SectionProfiler\.php - */includes/RevisionList\.php */includes/search/SearchEngine\.php */includes/specialpage/LoginSignupSpecialPage\.php */includes/specials/forms/PreferencesFormLegacy\.php diff --git a/autoload.php b/autoload.php index 9dad6f2b1f..e89f6f24be 100644 --- a/autoload.php +++ b/autoload.php @@ -1278,10 +1278,10 @@ $wgAutoloadLocalClasses = [ 'Revision' => __DIR__ . '/includes/Revision.php', 'RevisionDeleteUser' => __DIR__ . '/includes/revisiondelete/RevisionDeleteUser.php', 'RevisionDeleter' => __DIR__ . '/includes/revisiondelete/RevisionDeleter.php', - 'RevisionItem' => __DIR__ . '/includes/RevisionList.php', - 'RevisionItemBase' => __DIR__ . '/includes/RevisionList.php', - 'RevisionList' => __DIR__ . '/includes/RevisionList.php', - 'RevisionListBase' => __DIR__ . '/includes/RevisionList.php', + 'RevisionItem' => __DIR__ . '/includes/revisionlist/RevisionItem.php', + 'RevisionItemBase' => __DIR__ . '/includes/revisionlist/RevisionItemBase.php', + 'RevisionList' => __DIR__ . '/includes/revisionlist/RevisionList.php', + 'RevisionListBase' => __DIR__ . '/includes/revisionlist/RevisionListBase.php', 'RiffExtractor' => __DIR__ . '/includes/libs/RiffExtractor.php', 'RightsLogFormatter' => __DIR__ . '/includes/logging/RightsLogFormatter.php', 'RollbackAction' => __DIR__ . '/includes/actions/RollbackAction.php', diff --git a/includes/RevisionList.php b/includes/RevisionList.php deleted file mode 100644 index 5243cc65dd..0000000000 --- a/includes/RevisionList.php +++ /dev/null @@ -1,447 +0,0 @@ -setContext( $context ); - $this->title = $title; - } - - /** - * Select items only where the ID is any of the specified values - * @param array $ids - */ - function filterByIds( array $ids ) { - $this->ids = $ids; - } - - /** - * Get the internal type name of this list. Equal to the table name. - * Override this function. - * @return null - */ - public function getType() { - return null; - } - - /** - * Initialise the current iteration pointer - */ - protected function initCurrent() { - $row = $this->res->current(); - if ( $row ) { - $this->current = $this->newItem( $row ); - } else { - $this->current = false; - } - } - - /** - * Start iteration. This must be called before current() or next(). - * @return Revision First list item - */ - public function reset() { - if ( !$this->res ) { - $this->res = $this->doQuery( wfGetDB( DB_REPLICA ) ); - } else { - $this->res->rewind(); - } - $this->initCurrent(); - return $this->current; - } - - public function rewind() { - $this->reset(); - } - - /** - * Get the current list item, or false if we are at the end - * @return Revision - */ - public function current() { - return $this->current; - } - - /** - * Move the iteration pointer to the next list item, and return it. - * @return Revision - */ - public function next() { - $this->res->next(); - $this->initCurrent(); - return $this->current; - } - - public function key() { - return $this->res ? $this->res->key() : 0; - } - - public function valid() { - return $this->res ? $this->res->valid() : false; - } - - /** - * Get the number of items in the list. - * @return int - */ - public function length() { - if ( !$this->res ) { - return 0; - } else { - return $this->res->numRows(); - } - } - - /** - * Do the DB query to iterate through the objects. - * @param IDatabase $db DB object to use for the query - */ - abstract public function doQuery( $db ); - - /** - * Create an item object from a DB result row - * @param object $row - */ - abstract public function newItem( $row ); -} - -/** - * Abstract base class for revision items - */ -abstract class RevisionItemBase { - /** @var RevisionListBase The parent */ - protected $list; - - /** The database result row */ - protected $row; - - /** - * @param RevisionListBase $list - * @param object $row DB result row - */ - public function __construct( $list, $row ) { - $this->list = $list; - $this->row = $row; - } - - /** - * Get the DB field name associated with the ID list. - * Override this function. - * @return null - */ - public function getIdField() { - return null; - } - - /** - * Get the DB field name storing timestamps. - * Override this function. - * @return bool - */ - public function getTimestampField() { - return false; - } - - /** - * Get the DB field name storing user ids. - * Override this function. - * @return bool - */ - public function getAuthorIdField() { - return false; - } - - /** - * Get the DB field name storing user names. - * Override this function. - * @return bool - */ - public function getAuthorNameField() { - return false; - } - - /** - * Get the DB field name storing actor ids. - * Override this function. - * @since 1.31 - * @return bool - */ - public function getAuthorActorField() { - return false; - } - - /** - * Get the ID, as it would appear in the ids URL parameter - * @return int - */ - public function getId() { - $field = $this->getIdField(); - return $this->row->$field; - } - - /** - * Get the date, formatted in user's language - * @return string - */ - public function formatDate() { - return $this->list->getLanguage()->userDate( $this->getTimestamp(), - $this->list->getUser() ); - } - - /** - * Get the time, formatted in user's language - * @return string - */ - public function formatTime() { - return $this->list->getLanguage()->userTime( $this->getTimestamp(), - $this->list->getUser() ); - } - - /** - * Get the timestamp in MW 14-char form - * @return mixed - */ - public function getTimestamp() { - $field = $this->getTimestampField(); - return wfTimestamp( TS_MW, $this->row->$field ); - } - - /** - * Get the author user ID - * @return int - */ - public function getAuthorId() { - $field = $this->getAuthorIdField(); - return intval( $this->row->$field ); - } - - /** - * Get the author user name - * @return string - */ - public function getAuthorName() { - $field = $this->getAuthorNameField(); - return strval( $this->row->$field ); - } - - /** - * Get the author actor ID - * @since 1.31 - * @return string - */ - public function getAuthorActor() { - $field = $this->getAuthorActorField(); - return strval( $this->row->$field ); - } - - /** - * Returns true if the current user can view the item - */ - abstract public function canView(); - - /** - * Returns true if the current user can view the item text/file - */ - abstract public function canViewContent(); - - /** - * Get the HTML of the list item. Should be include "
  • " tags. - * This is used to show the list in HTML form, by the special page. - */ - abstract public function getHTML(); - - /** - * Returns an instance of LinkRenderer - * @return \MediaWiki\Linker\LinkRenderer - */ - protected function getLinkRenderer() { - return MediaWikiServices::getInstance()->getLinkRenderer(); - } -} - -class RevisionList extends RevisionListBase { - public function getType() { - return 'revision'; - } - - /** - * @param IDatabase $db - * @return mixed - */ - public function doQuery( $db ) { - $conds = [ 'rev_page' => $this->title->getArticleID() ]; - if ( $this->ids !== null ) { - $conds['rev_id'] = array_map( 'intval', $this->ids ); - } - $revQuery = Revision::getQueryInfo( [ 'page', 'user' ] ); - return $db->select( - $revQuery['tables'], - $revQuery['fields'], - $conds, - __METHOD__, - [ 'ORDER BY' => 'rev_id DESC' ], - $revQuery['joins'] - ); - } - - public function newItem( $row ) { - return new RevisionItem( $this, $row ); - } -} - -/** - * Item class for a live revision table row - */ -class RevisionItem extends RevisionItemBase { - /** @var Revision */ - protected $revision; - - /** @var RequestContext */ - protected $context; - - public function __construct( $list, $row ) { - parent::__construct( $list, $row ); - $this->revision = new Revision( $row ); - $this->context = $list->getContext(); - } - - public function getIdField() { - return 'rev_id'; - } - - public function getTimestampField() { - return 'rev_timestamp'; - } - - public function getAuthorIdField() { - return 'rev_user'; - } - - public function getAuthorNameField() { - return 'rev_user_text'; - } - - public function canView() { - return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->context->getUser() ); - } - - public function canViewContent() { - return $this->revision->userCan( Revision::DELETED_TEXT, $this->context->getUser() ); - } - - public function isDeleted() { - return $this->revision->isDeleted( Revision::DELETED_TEXT ); - } - - /** - * Get the HTML link to the revision text. - * @todo Essentially a copy of RevDelRevisionItem::getRevisionLink. That class - * should inherit from this one, and implement an appropriate interface instead - * of extending RevDelItem - * @return string - */ - protected function getRevisionLink() { - $date = $this->list->getLanguage()->userTimeAndDate( - $this->revision->getTimestamp(), $this->list->getUser() ); - - if ( $this->isDeleted() && !$this->canViewContent() ) { - return htmlspecialchars( $date ); - } - $linkRenderer = $this->getLinkRenderer(); - return $linkRenderer->makeKnownLink( - $this->list->title, - $date, - [], - [ - 'oldid' => $this->revision->getId(), - 'unhide' => 1 - ] - ); - } - - /** - * Get the HTML link to the diff. - * @todo Essentially a copy of RevDelRevisionItem::getDiffLink. That class - * should inherit from this one, and implement an appropriate interface instead - * of extending RevDelItem - * @return string - */ - protected function getDiffLink() { - if ( $this->isDeleted() && !$this->canViewContent() ) { - return $this->context->msg( 'diff' )->escaped(); - } else { - $linkRenderer = $this->getLinkRenderer(); - return $linkRenderer->makeKnownLink( - $this->list->title, - $this->list->msg( 'diff' )->text(), - [], - [ - 'diff' => $this->revision->getId(), - 'oldid' => 'prev', - 'unhide' => 1 - ] - ); - } - } - - /** - * @todo Essentially a copy of RevDelRevisionItem::getHTML. That class - * should inherit from this one, and implement an appropriate interface instead - * of extending RevDelItem - * @return string - */ - public function getHTML() { - $difflink = $this->context->msg( 'parentheses' ) - ->rawParams( $this->getDiffLink() )->escaped(); - $revlink = $this->getRevisionLink(); - $userlink = Linker::revUserLink( $this->revision ); - $comment = Linker::revComment( $this->revision ); - if ( $this->isDeleted() ) { - $revlink = "$revlink"; - } - return "
  • $difflink $revlink $userlink $comment
  • "; - } -} diff --git a/includes/revisionlist/RevisionItem.php b/includes/revisionlist/RevisionItem.php new file mode 100644 index 0000000000..faf8d82e79 --- /dev/null +++ b/includes/revisionlist/RevisionItem.php @@ -0,0 +1,135 @@ +revision = new Revision( $row ); + $this->context = $list->getContext(); + } + + public function getIdField() { + return 'rev_id'; + } + + public function getTimestampField() { + return 'rev_timestamp'; + } + + public function getAuthorIdField() { + return 'rev_user'; + } + + public function getAuthorNameField() { + return 'rev_user_text'; + } + + public function canView() { + return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->context->getUser() ); + } + + public function canViewContent() { + return $this->revision->userCan( Revision::DELETED_TEXT, $this->context->getUser() ); + } + + public function isDeleted() { + return $this->revision->isDeleted( Revision::DELETED_TEXT ); + } + + /** + * Get the HTML link to the revision text. + * @todo Essentially a copy of RevDelRevisionItem::getRevisionLink. That class + * should inherit from this one, and implement an appropriate interface instead + * of extending RevDelItem + * @return string + */ + protected function getRevisionLink() { + $date = $this->list->getLanguage()->userTimeAndDate( + $this->revision->getTimestamp(), $this->list->getUser() ); + + if ( $this->isDeleted() && !$this->canViewContent() ) { + return htmlspecialchars( $date ); + } + $linkRenderer = $this->getLinkRenderer(); + return $linkRenderer->makeKnownLink( + $this->list->title, + $date, + [], + [ + 'oldid' => $this->revision->getId(), + 'unhide' => 1 + ] + ); + } + + /** + * Get the HTML link to the diff. + * @todo Essentially a copy of RevDelRevisionItem::getDiffLink. That class + * should inherit from this one, and implement an appropriate interface instead + * of extending RevDelItem + * @return string + */ + protected function getDiffLink() { + if ( $this->isDeleted() && !$this->canViewContent() ) { + return $this->context->msg( 'diff' )->escaped(); + } else { + $linkRenderer = $this->getLinkRenderer(); + return $linkRenderer->makeKnownLink( + $this->list->title, + $this->list->msg( 'diff' )->text(), + [], + [ + 'diff' => $this->revision->getId(), + 'oldid' => 'prev', + 'unhide' => 1 + ] + ); + } + } + + /** + * @todo Essentially a copy of RevDelRevisionItem::getHTML. That class + * should inherit from this one, and implement an appropriate interface instead + * of extending RevDelItem + * @return string + */ + public function getHTML() { + $difflink = $this->context->msg( 'parentheses' ) + ->rawParams( $this->getDiffLink() )->escaped(); + $revlink = $this->getRevisionLink(); + $userlink = Linker::revUserLink( $this->revision ); + $comment = Linker::revComment( $this->revision ); + if ( $this->isDeleted() ) { + $revlink = "$revlink"; + } + return "
  • $difflink $revlink $userlink $comment
  • "; + } +} diff --git a/includes/revisionlist/RevisionItemBase.php b/includes/revisionlist/RevisionItemBase.php new file mode 100644 index 0000000000..dcb2f39932 --- /dev/null +++ b/includes/revisionlist/RevisionItemBase.php @@ -0,0 +1,177 @@ +list = $list; + $this->row = $row; + } + + /** + * Get the DB field name associated with the ID list. + * Override this function. + * @return null + */ + public function getIdField() { + return null; + } + + /** + * Get the DB field name storing timestamps. + * Override this function. + * @return bool + */ + public function getTimestampField() { + return false; + } + + /** + * Get the DB field name storing user ids. + * Override this function. + * @return bool + */ + public function getAuthorIdField() { + return false; + } + + /** + * Get the DB field name storing user names. + * Override this function. + * @return bool + */ + public function getAuthorNameField() { + return false; + } + + /** + * Get the DB field name storing actor ids. + * Override this function. + * @since 1.31 + * @return bool + */ + public function getAuthorActorField() { + return false; + } + + /** + * Get the ID, as it would appear in the ids URL parameter + * @return int + */ + public function getId() { + $field = $this->getIdField(); + return $this->row->$field; + } + + /** + * Get the date, formatted in user's language + * @return string + */ + public function formatDate() { + return $this->list->getLanguage()->userDate( $this->getTimestamp(), + $this->list->getUser() ); + } + + /** + * Get the time, formatted in user's language + * @return string + */ + public function formatTime() { + return $this->list->getLanguage()->userTime( $this->getTimestamp(), + $this->list->getUser() ); + } + + /** + * Get the timestamp in MW 14-char form + * @return mixed + */ + public function getTimestamp() { + $field = $this->getTimestampField(); + return wfTimestamp( TS_MW, $this->row->$field ); + } + + /** + * Get the author user ID + * @return int + */ + public function getAuthorId() { + $field = $this->getAuthorIdField(); + return intval( $this->row->$field ); + } + + /** + * Get the author user name + * @return string + */ + public function getAuthorName() { + $field = $this->getAuthorNameField(); + return strval( $this->row->$field ); + } + + /** + * Get the author actor ID + * @since 1.31 + * @return string + */ + public function getAuthorActor() { + $field = $this->getAuthorActorField(); + return strval( $this->row->$field ); + } + + /** + * Returns true if the current user can view the item + */ + abstract public function canView(); + + /** + * Returns true if the current user can view the item text/file + */ + abstract public function canViewContent(); + + /** + * Get the HTML of the list item. Should be include "
  • " tags. + * This is used to show the list in HTML form, by the special page. + */ + abstract public function getHTML(); + + /** + * Returns an instance of LinkRenderer + * @return \MediaWiki\Linker\LinkRenderer + */ + protected function getLinkRenderer() { + return MediaWikiServices::getInstance()->getLinkRenderer(); + } +} diff --git a/includes/revisionlist/RevisionList.php b/includes/revisionlist/RevisionList.php new file mode 100644 index 0000000000..e7fab9b8c6 --- /dev/null +++ b/includes/revisionlist/RevisionList.php @@ -0,0 +1,53 @@ + $this->title->getArticleID() ]; + if ( $this->ids !== null ) { + $conds['rev_id'] = array_map( 'intval', $this->ids ); + } + $revQuery = Revision::getQueryInfo( [ 'page', 'user' ] ); + return $db->select( + $revQuery['tables'], + $revQuery['fields'], + $conds, + __METHOD__, + [ 'ORDER BY' => 'rev_id DESC' ], + $revQuery['joins'] + ); + } + + public function newItem( $row ) { + return new RevisionItem( $this, $row ); + } +} diff --git a/includes/revisionlist/RevisionListBase.php b/includes/revisionlist/RevisionListBase.php new file mode 100644 index 0000000000..fb379c953a --- /dev/null +++ b/includes/revisionlist/RevisionListBase.php @@ -0,0 +1,148 @@ +setContext( $context ); + $this->title = $title; + } + + /** + * Select items only where the ID is any of the specified values + * @param array $ids + */ + function filterByIds( array $ids ) { + $this->ids = $ids; + } + + /** + * Get the internal type name of this list. Equal to the table name. + * Override this function. + * @return null + */ + public function getType() { + return null; + } + + /** + * Initialise the current iteration pointer + */ + protected function initCurrent() { + $row = $this->res->current(); + if ( $row ) { + $this->current = $this->newItem( $row ); + } else { + $this->current = false; + } + } + + /** + * Start iteration. This must be called before current() or next(). + * @return Revision First list item + */ + public function reset() { + if ( !$this->res ) { + $this->res = $this->doQuery( wfGetDB( DB_REPLICA ) ); + } else { + $this->res->rewind(); + } + $this->initCurrent(); + return $this->current; + } + + public function rewind() { + $this->reset(); + } + + /** + * Get the current list item, or false if we are at the end + * @return Revision + */ + public function current() { + return $this->current; + } + + /** + * Move the iteration pointer to the next list item, and return it. + * @return Revision + */ + public function next() { + $this->res->next(); + $this->initCurrent(); + return $this->current; + } + + public function key() { + return $this->res ? $this->res->key() : 0; + } + + public function valid() { + return $this->res ? $this->res->valid() : false; + } + + /** + * Get the number of items in the list. + * @return int + */ + public function length() { + if ( !$this->res ) { + return 0; + } else { + return $this->res->numRows(); + } + } + + /** + * Do the DB query to iterate through the objects. + * @param IDatabase $db DB object to use for the query + */ + abstract public function doQuery( $db ); + + /** + * Create an item object from a DB result row + * @param object $row + */ + abstract public function newItem( $row ); +} -- 2.20.1