tao-test/app/generis/common/session/class.BasicSession.php

202 lines
6.0 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) 2017-2021 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
*
*/
/**
* Represents a Session on Generis.
*
* @access private
* @author Joel Bout, <joel@taotesting.com>
* @package generis
*/
use oat\generis\model\GenerisRdf;
use oat\generis\model\OntologyRdfs;
use oat\oatbox\user\User;
use oat\oatbox\Refreshable;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
use oat\oatbox\user\UserLanguageServiceInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use oat\oatbox\session\SessionContext;
class common_session_BasicSession implements common_session_Session, ServiceLocatorAwareInterface
{
use ServiceLocatorAwareTrait {
setServiceLocator as protected setOriginalServiceLocator;
}
/**
* @var common_user_User
*/
private $user;
/**
* @var SessionContext[]
*/
private $contexts;
/**
* @param SessionContext[] $context
*/
public function __construct(User $user, array $contexts = [])
{
$this->user = $user;
$this->contexts = $contexts;
}
public function getUser()
{
return $this->user;
}
/**
* {@inheritDoc}
* @see common_session_Session::getUserUri()
*/
public function getUserUri()
{
return $this->user->getIdentifier();
}
/**
* @param string $property
* @return mixed
*/
public function getUserPropertyValues($property)
{
return $this->user->getPropertyValues($property);
}
/**
* (non-PHPdoc)
* @see common_session_Session::getUserLabel()
*/
public function getUserLabel()
{
$label = '';
$first = $this->user->getPropertyValues(GenerisRdf::PROPERTY_USER_FIRSTNAME);
$label .= empty($first) ? '' : current($first);
$last = $this->user->getPropertyValues(GenerisRdf::PROPERTY_USER_LASTNAME);
$label .= empty($last) ? '' : ' ' . current($last);
$label = trim($label);
if (empty($label)) {
$login = $this->user->getPropertyValues(GenerisRdf::PROPERTY_USER_LOGIN);
if (!empty($login)) {
$label = current($login);
}
}
if (empty($label)) {
$rdflabel = $this->user->getPropertyValues(OntologyRdfs::RDFS_LABEL);
$label = empty($rdflabel) ? __('user') : current($rdflabel);
}
return $label;
}
/**
* {@inheritDoc}
* @see common_session_Session::getUserRoles()
*/
public function getUserRoles()
{
$returnValue = [];
// We use a Depth First Search approach to flatten the Roles Graph.
foreach ($this->user->getPropertyValues(GenerisRdf::PROPERTY_USER_ROLES) as $roleUri) {
$returnValue[$roleUri] = $roleUri;
$role = new core_kernel_classes_Resource($roleUri);
foreach (core_kernel_users_Service::singleton()->getIncludedRoles($role) as $incRole) {
$returnValue[$incRole->getUri()] = $incRole->getUri();
}
}
return $returnValue;
}
/**
* @return string language code (e.g. 'en-US')
*/
public function getDataLanguage()
{
return $this->getServiceLocator()->get(UserLanguageServiceInterface::class)->getDataLanguage($this->getUser());
}
/**
* @return string language code (e.g. 'en-US')
*/
public function getInterfaceLanguage()
{
/** @var PHPSession $session */
$session = PHPSession::singleton();
/** @var UserLanguageServiceInterface $userLanguageService */
$userLanguageService = $this->getServiceLocator()->get(UserLanguageServiceInterface::class);
if ($session->hasAttribute('overrideInterfaceLanguage')) {
$userLanguageService->setCustomInterfaceLanguage($session->getAttribute('overrideInterfaceLanguage'));
} else {
// Just to be sure the custom interface language is removed when the session attribute is gone
$userLanguageService->setCustomInterfaceLanguage(null);
}
return $userLanguageService->getInterfaceLanguage($this->getUser());
}
/**
* (non-PHPdoc)
* @see common_session_Session::getTimeZone()
*/
public function getTimeZone()
{
$tzs = $this->user->getPropertyValues(GenerisRdf::PROPERTY_USER_TIMEZONE);
$tz = empty($tzs) ? '' : (string)current($tzs);
return empty($tz) ? TIME_ZONE : $tz;
}
public function refresh()
{
if ($this->user instanceof Refreshable) {
$this->user->refresh();
}
}
/**
* {@inheritDoc}
* @see \Zend\ServiceManager\ServiceLocatorAwareInterface::setServiceLocator()
* propagate to user
*/
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
if ($this->user instanceof ServiceLocatorAwareInterface) {
$this->user->setServiceLocator($serviceLocator);
}
return $this->setOriginalServiceLocator($serviceLocator);
}
public function getContexts(string $class = null): array
{
$contexts = $this->contexts;
if ($class != null) {
$contexts = array_filter($contexts, function($element) use ($class) {return $element instanceof $class;});
}
return $contexts;
}
}