follow up to r114215, fix some fails and added CachedAction implementing the same...
authorJeroen De Dauw <jeroendedauw@users.mediawiki.org>
Tue, 20 Mar 2012 00:04:36 +0000 (00:04 +0000)
committerJeroen De Dauw <jeroendedauw@users.mediawiki.org>
Tue, 20 Mar 2012 00:04:36 +0000 (00:04 +0000)
includes/AutoLoader.php
includes/CacheHelper.php
includes/actions/CachedAction.php [new file with mode: 0644]
includes/specials/SpecialCachedPage.php

index adf7834..53da8b4 100644 (file)
@@ -259,6 +259,7 @@ $wgAutoloadLocalClasses = array(
        'ZipDirectoryReader' => 'includes/ZipDirectoryReader.php',
 
        # includes/actions
+       'CachedAction' => 'includes/actions/CachedAction.php',
        'CreditsAction' => 'includes/actions/CreditsAction.php',
        'DeleteAction' => 'includes/actions/DeleteAction.php',
        'EditAction' => 'includes/actions/EditAction.php',
index b61e2ad..92f1d46 100644 (file)
@@ -1,5 +1,13 @@
 <?php
 
+/**
+ * Interface for all classes implementing CacheHelper functionality.
+ *
+ * @since 1.20
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
 interface ICacheHelper {
 
        /**
@@ -22,18 +30,20 @@ interface ICacheHelper {
        function startCache( $cacheExpiry = null, $cacheEnabled = null );
 
        /**
-        * Add some HTML to be cached.
-        * This is done by providing a callback function that should
-        * return the HTML to be added. It will only be called if the
-        * item is not in the cache yet or when the cache has been invalidated.
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
         *
         * @since 1.20
         *
         * @param {function} $computeFunction
-        * @param array $args
+        * @param array|mixed $args
         * @param string|null $key
+        *
+        * @return mixed
         */
-       function addCachedHTML( $computeFunction, $args = array(), $key = null );
+       function getCachedValue( $computeFunction, $args = array(), $key = null );
 
        /**
         * Saves the HTML to the cache in case it got recomputed.
@@ -73,7 +83,6 @@ interface ICacheHelper {
  * @since 1.20
  *
  * @file CacheHelper.php
- * @ingroup SpecialPage
  *
  * @licence GNU GPL v2 or later
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
@@ -216,24 +225,6 @@ class CacheHelper implements ICacheHelper {
                }
        }
 
-
-
-       /**
-        * Add some HTML to be cached.
-        * This is done by providing a callback function that should
-        * return the HTML to be added. It will only be called if the
-        * item is not in the cache yet or when the cache has been invalidated.
-        *
-        * @since 1.20
-        *
-        * @param {function} $computeFunction
-        * @param array $args
-        * @param string|null $key
-        */
-       public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
-               $this->getOutput()->addHTML( $this->getCachedValue( $computeFunction, $args, $key ) );
-       }
-
        /**
         * Get a cached value if available or compute it if not and then cache it if possible.
         * The provided $computeFunction is only called when the computation needs to happen
diff --git a/includes/actions/CachedAction.php b/includes/actions/CachedAction.php
new file mode 100644 (file)
index 0000000..5a2264a
--- /dev/null
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * Abstract action class with scaffolding for caching HTML and other values
+ * in a single blob.
+ *
+ * Before using any of the cahing functionality, call startCache.
+ * After the last call to either getCachedValue or addCachedHTML, call saveCache.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * @since 1.20
+ *
+ * @file CachedAction.php
+ * @ingroup Action
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class CachedAction extends FormlessAction implements ICacheHelper {
+
+       /**
+        * CacheHelper object to which we foreward the non-SpecialPage specific caching work.
+        * Initialized in startCache.
+        *
+        * @since 1.20
+        * @var CacheHelper
+        */
+       protected $cacheHelper;
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       public function setCacheEnabled( $cacheEnabled ) {
+               $this->cacheHelper->setCacheEnabled( $cacheEnabled );
+       }
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expirty, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
+               $this->cacheHelper = new CacheHelper( $this->get );
+
+               $this->cacheHelper->setOnInitializedHandler( array( $this, 'onCacheInitialized' ) );
+
+               $keyArgs = $this->getCacheKey();
+
+               if ( array_key_exists( 'action', $keyArgs ) && $keyArgs['action'] === 'purge' ) {
+                       unset( $keyArgs['action'] );
+               }
+
+               $this->cacheHelper->setCacheKey( $keyArgs );
+
+               if ( $this->getRequest()->getText( 'action' ) === 'purge' ) {
+                       $this->cacheHelper->purge();
+               }
+
+               $this->cacheHelper->startCache( $cacheExpiry, $cacheEnabled );
+       }
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               return $this->cacheHelper->getCachedValue( $computeFunction, $args, $key );
+       }
+
+       /**
+        * Add some HTML to be cached.
+        * This is done by providing a callback function that should
+        * return the HTML to be added. It will only be called if the
+        * item is not in the cache yet or when the cache has been invalidated.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array $args
+        * @param string|null $key
+        */
+       public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
+               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+       }
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       public function saveCache() {
+               $this->cacheHelper->saveCache();
+       }
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry..
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       public function setExpirey( $cacheExpiry ) {
+               $this->cacheHelper->setExpirey( $cacheExpiry );
+       }
+
+       /**
+        * Returns the variables used to constructed the cache key in an array.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getCacheKey() {
+               return array(
+                       get_class( $this->page ),
+                       $this->getName(),
+                       $this->getLanguage()->getCode()
+               );
+       }
+
+       /**
+        * Gets called after the cache got initialized.
+        *
+        * @since 1.20
+        *
+        * @param boolean $hasCached
+        */
+       public function onCacheInitialized( $hasCached ) {
+               if ( $hasCached ) {
+                       $this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
+               }
+       }
+
+}
\ No newline at end of file
index b721c26..eb8e6b9 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 
 /**
- * Abstract special page class with scaffolding for caching the HTML output.
+ * Abstract special page class with scaffolding for caching HTML and other values
+ * in a single blob.
  *
  * Before using any of the cahing functionality, call startCache.
  * After the last call to either getCachedValue or addCachedHTML, call saveCache.
@@ -74,6 +75,24 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
                $this->cacheHelper->startCache( $cacheExpiry, $cacheEnabled );
        }
 
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               return $this->cacheHelper->getCachedValue( $computeFunction, $args, $key );
+       }
+
        /**
         * Add some HTML to be cached.
         * This is done by providing a callback function that should