joomla-platform / libraries / joomla / cache / controller.php

<?php
/**
 * @package     Joomla.Platform
 * @subpackage  Cache
 *
 * @copyright   Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('JPATH_PLATFORM') or die;

/**
 * Public cache handler
 *
 * @abstract
 * @package     Joomla.Platform
 * @subpackage  Cache
 * @since       11.1
 */
class JCacheController
{
    /**
     * @since   11.1
     */
    public $cache;

    /**
     * @since   11.1
     */
    public $options;

    /**
     * Constructor
     *
     * @param   array   $options    options
     * @since   11.1
     */
    public function __construct($options)
    {
        $this->cache    = new JCache($options);
        $this->options  = & $this->cache->_options;

        // Overwrite default options with given options
        foreach ($options AS $option=>$value) {
            if (isset($options[$option])) {
                $this->options[$option] = $options[$option];
            }
        }
    }

    /**
     * @since   11.1
     */
    public function __call ($name, $arguments)
    {
        $nazaj = call_user_func_array (array ($this->cache, $name), $arguments);
        return $nazaj;
    }

    /**
     * Returns a reference to a cache adapter object, always creating it
     *
     * @param   string  $type   The cache object type to instantiate
     * 
     * @return  object  A JCache object
     * @since   11.1
     */
    public static function getInstance($type = 'output', $options = array())
    {
        JCacheController::addIncludePath(JPATH_PLATFORM.DS.'joomla'.DS.'cache'.DS.'controller');

        $type = strtolower(preg_replace('/[^A-Z0-9_\.-]/i', '', $type));

        $class = 'JCacheController'.ucfirst($type);

        if (!class_exists($class)) {
            // Search for the class file in the JCache include paths.
            jimport('joomla.filesystem.path');

            if ($path = JPath::find(JCacheController::addIncludePath(), strtolower($type).'.php')) {
                require_once $path;
            } else {
                JError::raiseError(500, 'Unable to load Cache Controller: '.$type);
            }
        }

        return new $class($options);
    }

    /**
     * Set caching enabled state
     *
     * @param   boolean $enabled    True to enable caching
     * 
     * @return  void
     * @since   11.1
     */
    public function setCaching($enabled)
    {
        $this->cache->setCaching($enabled);
    }

    /**
     * Set cache lifetime
     *
     * @param   int     $lt Cache lifetime
     * 
     * @return  void
     * @since   11.1
     */
    public function setLifeTime($lt)
    {
        $this->cache->setLifeTime($lt);
    }

    /**
     * Add a directory where JCache should search for controllers. You may
     * either pass a string or an array of directories.
     *
     * @param   string  A path to search.
     * @return  array   An array with directory elements
     * @since   11.1
     */
    public static function addIncludePath($path='')
    {
        static $paths;

        if (!isset($paths)) {
            $paths = array();
        }
        if (!empty($path) && !in_array($path, $paths)) {
            jimport('joomla.filesystem.path');
            array_unshift($paths, JPath::clean($path));
        }
        return $paths;
    }

    /**
     * Get stored cached data by id and group
     *
     * @param   string  $id     The cache data id
     * @param   string  $group  The cache data group
     * @return  mixed   False on no result, cached object otherwise
     * @since   11.1
     */
    public function get($id, $group=null)
    {
        $data = false;
        $data = $this->cache->get($id, $group);

        if ($data === false) {
            $locktest = new stdClass;
            $locktest->locked = null;
            $locktest->locklooped = null;
            $locktest = $this->cache->lock($id, $group);
            if ($locktest->locked == true && $locktest->locklooped == true) {
                $data = $this->cache->get($id, $group);
            }
            if ($locktest->locked == true) $this->cache->unlock($id, $group);
        }

        // Check again because we might get it from second attempt
        if ($data !== false) {
            $data = unserialize(trim($data));  // trim to fix unserialize errors
        }
        return $data;
    }

    /**
     * Store data to cache by id and group
     *
     * @param   string  $id     The cache data id
     * @param   string  $group  The cache data group
     * @param   mixed   $data   The data to store
     * @return  boolean True if cache was stored
     * @since   11.1
     */
    public function store($data, $id, $group=null)
    {
        $locktest = new stdClass;
        $locktest->locked = null;
        $locktest->locklooped = null;

        $locktest = $this->cache->lock($id, $group);

        if ($locktest->locked == false && $locktest->locklooped == true) {
            $locktest = $this->cache->lock($id, $group);
        }

        $sucess = $this->cache->store(serialize($data), $id,  $group);

        if ($locktest->locked == true) $this->cache->unlock($id, $group);

        return $sucess;
    }
}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.