184 lines
6.2 KiB
PHP
184 lines
6.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; under version 2
|
|
* of the License (non-upgradable).
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Copyright (c) 2002-2008 (original work) Public Research Centre Henri Tudor & University of Luxembourg (under the project TAO & TAO2);
|
|
* 2008-2010 (update and modification) Deutsche Institut für Internationale Pädagogische Forschung (under the project TAO-TRANSFER);
|
|
* 2009-2012 (update and modification) Public Research Centre Henri Tudor (under the project TAO-SUSTAIN & TAO-DEV);
|
|
*
|
|
*/
|
|
|
|
use oat\oatbox\service\ServiceManager;
|
|
use oat\oatbox\cache\SimpleCache;
|
|
|
|
/**
|
|
* A facade aiming at helping client code to put User data in the Cache memory.
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
* @package generis
|
|
|
|
*/
|
|
class core_kernel_users_Cache
|
|
{
|
|
// --- ASSOCIATIONS ---
|
|
|
|
|
|
// --- ATTRIBUTES ---
|
|
|
|
/**
|
|
* Short description of attribute SERIAL_PREFIX_INCLUDED_ROLES
|
|
*
|
|
* @access public
|
|
* @var string
|
|
*/
|
|
const SERIAL_PREFIX_INCLUDED_ROLES = 'roles-ir';
|
|
// --- OPERATIONS ---
|
|
|
|
/**
|
|
* Retrieve roles included in a given Generis Role from the Cache memory.
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
*
|
|
* @param core_kernel_classes_Resource $role A Generis Role Resource.
|
|
*
|
|
* @return array
|
|
* @throws \oat\oatbox\service\ServiceNotFoundException
|
|
* @throws common_Exception
|
|
* @throws core_kernel_users_CacheException
|
|
*/
|
|
public static function retrieveIncludedRoles(core_kernel_classes_Resource $role)
|
|
{
|
|
$returnValue = [];
|
|
$serial = self::buildIncludedRolesSerial($role);
|
|
$fromCache = ServiceManager::getServiceManager()->get(SimpleCache::SERVICE_ID)->get($serial);
|
|
// array of URIs.
|
|
if (is_null($fromCache)) {
|
|
$roleUri = $role->getUri();
|
|
$msg = "Includes roles related to Role with URI '${roleUri}' is not in the Cache memory.";
|
|
throw new core_kernel_users_CacheException($msg);
|
|
}
|
|
|
|
foreach ($fromCache as $uri) {
|
|
$returnValue[$uri] = new core_kernel_classes_Resource($uri);
|
|
}
|
|
|
|
return (array) $returnValue;
|
|
}
|
|
|
|
/**
|
|
* Put roles included in a Generis Role in the Cache memory.
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
*
|
|
* @param core_kernel_classes_Resource $role
|
|
* @param array $includedRoles
|
|
*
|
|
* @return bool
|
|
* @throws \oat\oatbox\service\ServiceNotFoundException
|
|
* @throws common_Exception
|
|
* @throws core_kernel_users_CacheException
|
|
*/
|
|
public static function cacheIncludedRoles(core_kernel_classes_Resource $role, $includedRoles)
|
|
{
|
|
// Make a simple array of URIs with the included roles.
|
|
$toCache = [];
|
|
foreach ($includedRoles as $resource) {
|
|
$toCache[] = $resource->getUri();
|
|
}
|
|
|
|
$serial = self::buildIncludedRolesSerial($role);
|
|
/** @var SimpleCache $cache */
|
|
$cache = ServiceManager::getServiceManager()->get(SimpleCache::SERVICE_ID);
|
|
try {
|
|
$cache->set($serial, $toCache);
|
|
$returnValue = true;
|
|
} catch (common_Exception $e) {
|
|
$roleUri = $role->getUri();
|
|
$msg = "An error occurred while writing included roles in the cache memory for Role '${roleUri}': ";
|
|
$msg .= $e->getMessage();
|
|
throw new core_kernel_users_CacheException($msg);
|
|
}
|
|
|
|
|
|
return (bool) $returnValue;
|
|
}
|
|
|
|
/**
|
|
* Remove roles included in a Generis Role from the Cache memory.
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
* @param core_kernel_classes_Resource $role A Generis Role as a Resource.
|
|
* @return boolean
|
|
*/
|
|
public static function removeIncludedRoles(core_kernel_classes_Resource $role)
|
|
{
|
|
$serial = self::buildIncludedRolesSerial($role);
|
|
ServiceManager::getServiceManager()->get('generis/cache')->remove($serial);
|
|
;
|
|
|
|
// -- note: the cache might exist even if it was successfully
|
|
// removed due to race conditions.
|
|
// $returnValue = (file_exists(GENERIS_CACHE_PATH . $serial)) ? false : true;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the roles included in a given Generis Role are in the
|
|
* memory.
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
* @param core_kernel_classes_Resource $role The Generis Role you want to check if its included roles are in the cache memory.
|
|
* @return boolean
|
|
*/
|
|
public static function areIncludedRolesInCache(core_kernel_classes_Resource $role)
|
|
{
|
|
|
|
$serial = self::buildIncludedRolesSerial($role);
|
|
return ServiceManager::getServiceManager()->get('generis/cache')->has($serial);
|
|
}
|
|
|
|
/**
|
|
* Build a serial aiming at identifying the includes roles of a given
|
|
* Role in the Cache memory.
|
|
*
|
|
* @access private
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
* @param core_kernel_classes_Resource $role The role you want to create a serial for.
|
|
* @return string
|
|
*/
|
|
private static function buildIncludedRolesSerial(core_kernel_classes_Resource $role)
|
|
{
|
|
return self::SERIAL_PREFIX_INCLUDED_ROLES . urlencode($role->getUri());
|
|
}
|
|
|
|
/**
|
|
* Removes all entries related to included roles from the Cache memory.
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
* @return void
|
|
*/
|
|
public static function flush()
|
|
{
|
|
ServiceManager::getServiceManager()->get('generis/cache')->purge();
|
|
}
|
|
}
|