MediaWiki  REL1_24
RCCacheEntryFactory.php
Go to the documentation of this file.
00001 <?php
00023 class RCCacheEntryFactory {
00024 
00025     /* @var IContextSource */
00026     private $context;
00027 
00028     /* @var string[] */
00029     private $messages;
00030 
00035     public function __construct( IContextSource $context, $messages ) {
00036         $this->context = $context;
00037         $this->messages = $messages;
00038     }
00039 
00046     public function newFromRecentChange( RecentChange $baseRC, $watched ) {
00047         $user = $this->context->getUser();
00048         $counter = $baseRC->counter;
00049 
00050         $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
00051 
00052         // Should patrol-related stuff be shown?
00053         $cacheEntry->unpatrolled = ChangesList::isUnpatrolled( $baseRC, $user );
00054 
00055         $cacheEntry->watched = $cacheEntry->mAttribs['rc_type'] == RC_LOG ? false : $watched;
00056         $cacheEntry->numberofWatchingusers = $baseRC->numberofWatchingusers;
00057 
00058         $cacheEntry->link = $this->buildCLink( $cacheEntry );
00059         $cacheEntry->timestamp = $this->buildTimestamp( $cacheEntry );
00060 
00061         // Make "cur" and "diff" links.  Do not use link(), it is too slow if
00062         // called too many times (50% of CPU time on RecentChanges!).
00063         $showDiffLinks = $this->showDiffLinks( $cacheEntry, $user );
00064 
00065         $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks, $counter );
00066         $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks, $counter );
00067         $cacheEntry->lastlink = $this->buildLastLink( $cacheEntry, $showDiffLinks );
00068 
00069         // Make user links
00070         $cacheEntry->userlink = $this->getUserLink( $cacheEntry );
00071 
00072         if ( !ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
00073             $cacheEntry->usertalklink = Linker::userToolLinks(
00074                 $cacheEntry->mAttribs['rc_user'],
00075                 $cacheEntry->mAttribs['rc_user_text']
00076             );
00077         }
00078 
00079         return $cacheEntry;
00080     }
00081 
00088     private function showDiffLinks( RecentChange $cacheEntry, User $user ) {
00089         return ChangesList::userCan( $cacheEntry, Revision::DELETED_TEXT, $user );
00090     }
00091 
00097     private function buildCLink( RecentChange $cacheEntry ) {
00098         $type = $cacheEntry->mAttribs['rc_type'];
00099 
00100         // New unpatrolled pages
00101         if ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
00102             $clink = Linker::linkKnown( $cacheEntry->getTitle() );
00103         // Log entries
00104         } elseif ( $type == RC_LOG ) {
00105             $logType = $cacheEntry->mAttribs['rc_log_type'];
00106 
00107             if ( $logType ) {
00108                 $clink = $this->getLogLink( $logType );
00109             } else {
00110                 wfDebugLog( 'recentchanges', 'Unexpected log entry with no log type in recent changes' );
00111                 $clink = Linker::link( $cacheEntry->getTitle() );
00112             }
00113         // Log entries (old format) and special pages
00114         } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
00115             wfDebugLog( 'recentchanges', 'Unexpected special page in recentchanges' );
00116             $clink = '';
00117         // Edits
00118         } else {
00119             $clink = Linker::linkKnown( $cacheEntry->getTitle() );
00120         }
00121 
00122         return $clink;
00123     }
00124 
00125     private function getLogLink( $logType ) {
00126         $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
00127         $logpage = new LogPage( $logType );
00128         $logname = $logpage->getName()->escaped();
00129 
00130         $logLink = $this->context->msg( 'parentheses' )
00131             ->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
00132 
00133         return $logLink;
00134     }
00135 
00141     private function buildTimestamp( RecentChange $cacheEntry ) {
00142         return $this->context->getLanguage()->userTime(
00143             $cacheEntry->mAttribs['rc_timestamp'],
00144             $this->context->getUser()
00145         );
00146     }
00147 
00153     private function buildCurQueryParams( RecentChange $recentChange ) {
00154         return array(
00155             'curid' => $recentChange->mAttribs['rc_cur_id'],
00156             'diff' => 0,
00157             'oldid' => $recentChange->mAttribs['rc_this_oldid']
00158         );
00159     }
00160 
00168     private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
00169         $queryParams = $this->buildCurQueryParams( $cacheEntry );
00170         $curMessage = $this->getMessage( 'cur' );
00171         $logTypes = array( RC_LOG );
00172 
00173         if ( !$showDiffLinks || in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
00174             $curLink = $curMessage;
00175         } else {
00176             $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
00177             $curLink = "<a href=\"$curUrl\" tabindex=\"$counter\">$curMessage</a>";
00178         }
00179 
00180         return $curLink;
00181     }
00182 
00188     private function buildDiffQueryParams( RecentChange $recentChange ) {
00189         return array(
00190             'curid' => $recentChange->mAttribs['rc_cur_id'],
00191             'diff' => $recentChange->mAttribs['rc_this_oldid'],
00192             'oldid' => $recentChange->mAttribs['rc_last_oldid']
00193         );
00194     }
00195 
00203     private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
00204         $queryParams = $this->buildDiffQueryParams( $cacheEntry );
00205         $diffMessage = $this->getMessage( 'diff' );
00206         $logTypes = array( RC_NEW, RC_LOG );
00207 
00208         if ( !$showDiffLinks ) {
00209             $diffLink = $diffMessage;
00210         } elseif ( in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
00211             $diffLink = $diffMessage;
00212         } else {
00213             $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
00214             $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
00215         }
00216 
00217         return $diffLink;
00218     }
00219 
00226     private function buildLastLink( RecentChange $cacheEntry, $showDiffLinks ) {
00227         $lastOldid = $cacheEntry->mAttribs['rc_last_oldid'];
00228         $lastMessage = $this->getMessage( 'last' );
00229         $type = $cacheEntry->mAttribs['rc_type'];
00230         $logTypes = array( RC_LOG );
00231 
00232         // Make "last" link
00233         if ( !$showDiffLinks || !$lastOldid || in_array( $type, $logTypes ) ) {
00234             $lastLink = $lastMessage;
00235         } else {
00236             $lastLink = Linker::linkKnown(
00237                 $cacheEntry->getTitle(),
00238                 $lastMessage,
00239                 array(),
00240                 $this->buildDiffQueryParams( $cacheEntry )
00241             );
00242         }
00243 
00244         return $lastLink;
00245     }
00246 
00252     private function getUserLink( RecentChange $cacheEntry ) {
00253         if ( ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
00254             $userLink = ' <span class="history-deleted">' .
00255                 $this->context->msg( 'rev-deleted-user' )->escaped() . '</span>';
00256         } else {
00257             $userLink = Linker::userLink(
00258                 $cacheEntry->mAttribs['rc_user'],
00259                 $cacheEntry->mAttribs['rc_user_text']
00260             );
00261         }
00262 
00263         return $userLink;
00264     }
00265 
00271     private function getMessage( $key ) {
00272         return $this->messages[$key];
00273     }
00274 
00275 }