Merge branch 'appframework-master' into vcategories_public

Conflicts:
	lib/server.php
This commit is contained in:
Thomas Müller 2013-09-18 22:36:25 +02:00
commit 690e98d45a
21 changed files with 396 additions and 114 deletions

View File

@ -106,16 +106,6 @@ abstract class Controller {
}
/**
* Shortcut for getting session variables
* @param string $key the key that will be taken from the $_SESSION array
* @return array the value in the $_SESSION element
*/
public function session($key) {
return $this->request->getSession($key);
}
/**
* Shortcut for getting cookie variables
* @param string $key the key that will be taken from the $_COOKIE array

View File

@ -33,16 +33,15 @@ class Request implements \ArrayAccess, \Countable, IRequest {
protected $items = array();
protected $allowedKeys = array(
'get',
'post',
'files',
'server',
'env',
'session',
'cookies',
'urlParams',
'params',
'parameters',
'get',
'post',
'files',
'server',
'env',
'cookies',
'urlParams',
'params',
'parameters',
'method'
);
@ -156,7 +155,6 @@ class Request implements \ArrayAccess, \Countable, IRequest {
case 'files':
case 'server':
case 'env':
case 'session':
case 'cookies':
case 'parameters':
case 'params':
@ -229,8 +227,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param mixed $default If the key is not found, this value will be returned
* @return mixed the content of the array
*/
public function getParam($key, $default = null)
{
public function getParam($key, $default = null) {
return isset($this->parameters[$key])
? $this->parameters[$key]
: $default;
@ -241,8 +238,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* (as GET or POST) or throuh the URL by the route
* @return array the array with all parameters
*/
public function getParams()
{
public function getParams() {
return $this->parameters;
}
@ -250,8 +246,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* Returns the method of the request
* @return string the method of the request (POST, GET, etc)
*/
public function getMethod()
{
public function getMethod() {
return $this->method;
}
@ -260,8 +255,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $key the key that will be taken from the $_FILES array
* @return array the file in the $_FILES element
*/
public function getUploadedFile($key)
{
public function getUploadedFile($key) {
return isset($this->files[$key]) ? $this->files[$key] : null;
}
@ -270,28 +264,16 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @param string $key the key that will be taken from the $_ENV array
* @return array the value in the $_ENV element
*/
public function getEnv($key)
{
public function getEnv($key) {
return isset($this->env[$key]) ? $this->env[$key] : null;
}
/**
* Shortcut for getting session variables
* @param string $key the key that will be taken from the $_SESSION array
* @return array the value in the $_SESSION element
*/
function getSession($key)
{
return isset($this->session[$key]) ? $this->session[$key] : null;
}
/**
* Shortcut for getting cookie variables
* @param string $key the key that will be taken from the $_COOKIE array
* @return array the value in the $_COOKIE element
*/
function getCookie($key)
{
function getCookie($key) {
return isset($this->cookies[$key]) ? $this->cookies[$key] : null;
}
@ -304,8 +286,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
*
* @throws \LogicException
*/
function getContent($asResource = false)
{
function getContent($asResource = false) {
return null;
// if (false === $this->content || (true === $asResource && null !== $this->content)) {
// throw new \LogicException('getContent() can only be called once when using the resource return type.');

View File

@ -564,11 +564,13 @@ class OC {
if (OC_Config::getValue('installed', false)) { //don't try to do this before we are properly setup
// register cache cleanup jobs
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
\OCP\BackgroundJob::registerJob('OC_Cache_FileGlobalGC');
\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
} catch (Exception $e) {
}
OC_Hook::connect('OC_User', 'post_login', 'OC_Cache_File', 'loginListener');
// NOTE: This will be replaced to use OCP
$userSession = \OC_User::getUserSession();
$userSession->listen('postLogin', '\OC\Cache\File', 'loginListener');
}
}

View File

@ -6,34 +6,36 @@
* See the COPYING-README file.
*/
class OC_Cache {
namespace OC;
class Cache {
/**
* @var OC_Cache $user_cache
* @var Cache $user_cache
*/
static protected $user_cache;
/**
* @var OC_Cache $global_cache
* @var Cache $global_cache
*/
static protected $global_cache;
/**
* get the global cache
* @return OC_Cache
* @return Cache
*/
static public function getGlobalCache() {
if (!self::$global_cache) {
self::$global_cache = new OC_Cache_FileGlobal();
self::$global_cache = new Cache\FileGlobal();
}
return self::$global_cache;
}
/**
* get the user cache
* @return OC_Cache
* @return Cache
*/
static public function getUserCache() {
if (!self::$user_cache) {
self::$user_cache = new OC_Cache_File();
self::$user_cache = new Cache\File();
}
return self::$user_cache;
}
@ -85,7 +87,7 @@ class OC_Cache {
/**
* clear the user cache of all entries starting with a prefix
* @param string prefix (optional)
* @param string $prefix (optional)
* @return bool
*/
static public function clear($prefix='') {
@ -93,6 +95,11 @@ class OC_Cache {
return $user_cache->clear($prefix);
}
/**
* creates cache key based on the files given
* @param $files
* @return string
*/
static public function generateCacheKeyFromFiles($files) {
$key = '';
sort($files);

12
lib/cache/broker.php vendored
View File

@ -6,8 +6,18 @@
* See the COPYING-README file.
*/
class OC_Cache_Broker {
namespace OC\Cache;
class Broker {
/**
* @var \OC\Cache
*/
protected $fast_cache;
/**
* @var \OC\Cache
*/
protected $slow_cache;
public function __construct($fast_cache, $slow_cache) {

13
lib/cache/file.php vendored
View File

@ -6,24 +6,25 @@
* See the COPYING-README file.
*/
namespace OC\Cache;
class OC_Cache_File{
class File {
protected $storage;
protected function getStorage() {
if (isset($this->storage)) {
return $this->storage;
}
if(OC_User::isLoggedIn()) {
\OC\Files\Filesystem::initMountPoints(OC_User::getUser());
if(\OC_User::isLoggedIn()) {
\OC\Files\Filesystem::initMountPoints(\OC_User::getUser());
$subdir = 'cache';
$view = new \OC\Files\View('/'.OC_User::getUser());
$view = new \OC\Files\View('/' . \OC_User::getUser());
if(!$view->file_exists($subdir)) {
$view->mkdir($subdir);
}
$this->storage = new \OC\Files\View('/'.OC_User::getUser().'/'.$subdir);
$this->storage = new \OC\Files\View('/' . \OC_User::getUser().'/'.$subdir);
return $this->storage;
}else{
OC_Log::write('core', 'Can\'t get cache storage, user not logged in', OC_Log::ERROR);
\OC_Log::write('core', 'Can\'t get cache storage, user not logged in', \OC_Log::ERROR);
return false;
}
}

View File

@ -6,10 +6,11 @@
* See the COPYING-README file.
*/
namespace OC\Cache;
class OC_Cache_FileGlobal{
class FileGlobal {
static protected function getCacheDir() {
$cache_dir = get_temp_dir().'/owncloud-'.OC_Util::getInstanceId().'/';
$cache_dir = get_temp_dir().'/owncloud-' . \OC_Util::getInstanceId().'/';
if (!is_dir($cache_dir)) {
mkdir($cache_dir);
}
@ -80,13 +81,13 @@ class OC_Cache_FileGlobal{
}
static public function gc() {
$last_run = OC_AppConfig::getValue('core', 'global_cache_gc_lastrun', 0);
$last_run = \OC_AppConfig::getValue('core', 'global_cache_gc_lastrun', 0);
$now = time();
if (($now - $last_run) < 300) {
// only do cleanup every 5 minutes
return;
}
OC_AppConfig::setValue('core', 'global_cache_gc_lastrun', $now);
\OC_AppConfig::setValue('core', 'global_cache_gc_lastrun', $now);
$cache_dir = self::getCacheDir();
if($cache_dir and is_dir($cache_dir)) {
$dh=opendir($cache_dir);

View File

@ -1,8 +1,9 @@
<?php
namespace OC\Cache;
class OC_Cache_FileGlobalGC extends \OC\BackgroundJob\Job{
class FileGlobalGC extends \OC\BackgroundJob\Job{
public function run($argument){
OC_Cache_FileGlobal::gc();
FileGlobal::gc();
}
}

77
lib/cache/usercache.php vendored Normal file
View File

@ -0,0 +1,77 @@
<?php
/**
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Cache;
/**
* This interface defines method for accessing the file based user cache.
*/
class UserCache implements \OCP\ICache {
/**
* @var \OC\Cache\File $userCache
*/
protected $userCache;
public function __construct() {
$this->userCache = new File();
}
/**
* Get a value from the user cache
*
* @param string $key
* @return mixed
*/
public function get($key) {
return $this->userCache->get($key);
}
/**
* Set a value in the user cache
*
* @param string $key
* @param mixed $value
* @param int $ttl Time To Live in seconds. Defaults to 60*60*24
* @return bool
*/
public function set($key, $value, $ttl = 0) {
if (empty($key)) {
return false;
}
return $this->userCache->set($key, $value, $ttl);
}
/**
* Check if a value is set in the user cache
*
* @param string $key
* @return bool
*/
public function hasKey($key) {
return $this->userCache->hasKey($key);
}
/**
* Remove an item from the user cache
*
* @param string $key
* @return bool
*/
public function remove($key) {
return $this->userCache->remove($key);
}
/**
* clear the user cache of all entries starting with a prefix
* @param string $prefix (optional)
* @return bool
*/
public function clear($prefix = '') {
return $this->userCache->clear($prefix);
}
}

View File

@ -29,7 +29,7 @@ class OC_FileChunking {
protected function getCache() {
if (!isset($this->cache)) {
$this->cache = new OC_Cache_File();
$this->cache = new \OC\Cache\File();
}
return $this->cache;
}

10
lib/legacy/cache.php Normal file
View File

@ -0,0 +1,10 @@
<?php
/**
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
class OC_Cache extends \OC\Cache {
}

55
lib/public/icache.php Normal file
View File

@ -0,0 +1,55 @@
<?php
/**
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP;
/**
* This interface defines method for accessing the file based user cache.
*/
interface ICache {
/**
* Get a value from the user cache
*
* @param string $key
* @return mixed
*/
public function get($key);
/**
* Set a value in the user cache
*
* @param string $key
* @param mixed $value
* @param int $ttl Time To Live in seconds. Defaults to 60*60*24
* @return bool
*/
public function set($key, $value, $ttl = 0);
/**
* Check if a value is set in the user cache
*
* @param string $key
* @return bool
*/
public function hasKey($key);
/**
* Remove an item from the user cache
*
* @param string $key
* @return bool
*/
public function remove($key);
/**
* clear the user cache of all entries starting with a prefix
* @param string $prefix (optional)
* @return bool
*/
public function clear($prefix = '');
}

View File

@ -76,15 +76,6 @@ interface IRequest {
public function getEnv($key);
/**
* Shortcut for getting session variables
*
* @param string $key the key that will be taken from the $_SESSION array
* @return array the value in the $_SESSION element
*/
function getSession($key);
/**
* Shortcut for getting cookie variables
*

View File

@ -69,4 +69,18 @@ interface IServerContainer {
*/
function getRootFolder();
/**
* Returns an ICache instance
*
* @return \OCP\ICache
*/
function getCache();
/**
* Returns the current session
*
* @return \OCP\ISession
*/
function getSession();
}

56
lib/public/isession.php Normal file
View File

@ -0,0 +1,56 @@
<?php
/**
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
* @author Thomas Tanghus
* @author Robin Appelman
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP;
/**
* Interface ISession
*
* wrap PHP's internal session handling into the ISession interface
*/
interface ISession {
/**
* Set a value in the session
*
* @param string $key
* @param mixed $value
*/
public function set($key, $value);
/**
* Get a value from the session
*
* @param string $key
* @return mixed should return null if $key does not exist
*/
public function get($key);
/**
* Check if a named key exists in the session
*
* @param string $key
* @return bool
*/
public function exists($key);
/**
* Remove a $key/$value pair from the session
*
* @param string $key
*/
public function remove($key);
/**
* Reset and recreate the session
*/
public function clear();
}

View File

@ -4,6 +4,7 @@ namespace OC;
use OC\AppFramework\Http\Request;
use OC\AppFramework\Utility\SimpleContainer;
use OC\Cache\UserCache;
use OC\Files\Node\Root;
use OC\Files\View;
use OCP\IServerContainer;
@ -17,10 +18,10 @@ use OCP\IServerContainer;
class Server extends SimpleContainer implements IServerContainer {
function __construct() {
$this->registerService('ContactsManager', function($c){
$this->registerService('ContactsManager', function($c) {
return new ContactsManager();
});
$this->registerService('Request', function($c){
$this->registerService('Request', function($c) {
$params = array();
// we json decode the body only in case of content type json
@ -36,7 +37,6 @@ class Server extends SimpleContainer implements IServerContainer {
'files' => $_FILES,
'server' => $_SERVER,
'env' => $_ENV,
'session' => $_SESSION,
'cookies' => $_COOKIE,
'method' => (isset($_SERVER) && isset($_SERVER['REQUEST_METHOD']))
? $_SERVER['REQUEST_METHOD']
@ -46,13 +46,15 @@ class Server extends SimpleContainer implements IServerContainer {
)
);
});
$this->registerService('PreviewManager', function($c){
$this->registerService('PreviewManager', function($c) {
return new PreviewManager();
});
$this->registerService('TagManager', function($c){
return new Tags();
$this->registerService('TagManager', function($c) {
// TODO: get user and user manager from container as well
$user = \OC_User::getUser();
return new Tags($user);
});
$this->registerService('RootFolder', function($c){
$this->registerService('RootFolder', function($c) {
// TODO: get user and user manager from container as well
$user = \OC_User::getUser();
$user = \OC_User::getManager()->get($user);
@ -60,6 +62,9 @@ class Server extends SimpleContainer implements IServerContainer {
$view = new View();
return new Root($manager, $view, $user);
});
$this->registerService('UserCache', function($c) {
return new UserCache();
});
}
/**
@ -70,14 +75,13 @@ class Server extends SimpleContainer implements IServerContainer {
}
/**
* The current request object holding all information about the request currently being processed
* is returned from this method.
* The current request object holding all information about the request
* currently being processed is returned from this method.
* In case the current execution was not initiated by a web request null is returned
*
* @return \OCP\IRequest|null
*/
function getRequest()
{
function getRequest() {
return $this->query('Request');
}
@ -86,8 +90,7 @@ class Server extends SimpleContainer implements IServerContainer {
*
* @return \OCP\IPreview
*/
function getPreviewManager()
{
function getPreviewManager() {
return $this->query('PreviewManager');
}
@ -105,8 +108,26 @@ class Server extends SimpleContainer implements IServerContainer {
*
* @return \OCP\Files\Folder
*/
function getRootFolder()
{
function getRootFolder() {
return $this->query('RootFolder');
}
/**
* Returns an ICache instance
*
* @return \OCP\ICache
*/
function getCache() {
return $this->query('UserCache');
}
/**
* Returns the current session
*
* @return \OCP\ISession
*/
function getSession() {
return \OC::$session;
}
}

View File

@ -8,7 +8,7 @@
namespace OC\Session;
abstract class Session implements \ArrayAccess {
abstract class Session implements \ArrayAccess, \OCP\ISession {
/**
* $name serves as a namespace for the session keys
*

View File

@ -152,9 +152,4 @@ class ControllerTest extends \PHPUnit_Framework_TestCase {
$this->assertEquals('daheim', $this->controller->env('PATH'));
}
public function testGetSessionVariable(){
$this->assertEquals('kein', $this->controller->session('sezession'));
}
}

View File

@ -8,7 +8,7 @@
abstract class Test_Cache extends PHPUnit_Framework_TestCase {
/**
* @var OC_Cache cache;
* @var \OC\Cache cache;
*/
protected $instance;

View File

@ -20,7 +20,9 @@
*
*/
class Test_Cache_File extends Test_Cache {
namespace Test\Cache;
class FileCache extends \Test_Cache {
private $user;
private $datadir;
@ -30,8 +32,8 @@ class Test_Cache_File extends Test_Cache {
public function setUp() {
//clear all proxies and hooks so we can do clean testing
OC_FileProxy::clearProxies();
OC_Hook::clear('OC_Filesystem');
\OC_FileProxy::clearProxies();
\OC_Hook::clear('OC_Filesystem');
//disabled atm
//enable only the encryption hook if needed
@ -44,27 +46,27 @@ class Test_Cache_File extends Test_Cache {
$storage = new \OC\Files\Storage\Temporary(array());
\OC\Files\Filesystem::mount($storage,array(),'/');
$datadir = str_replace('local::', '', $storage->getId());
$this->datadir = OC_Config::getValue('datadirectory', OC::$SERVERROOT.'/data');
OC_Config::setValue('datadirectory', $datadir);
$this->datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT.'/data');
\OC_Config::setValue('datadirectory', $datadir);
OC_User::clearBackends();
OC_User::useBackend(new OC_User_Dummy());
\OC_User::clearBackends();
\OC_User::useBackend(new \OC_User_Dummy());
//login
OC_User::createUser('test', 'test');
\OC_User::createUser('test', 'test');
$this->user=OC_User::getUser();
OC_User::setUserId('test');
$this->user = \OC_User::getUser();
\OC_User::setUserId('test');
//set up the users dir
$rootView=new \OC\Files\View('');
$rootView = new \OC\Files\View('');
$rootView->mkdir('/test');
$this->instance=new OC_Cache_File();
$this->instance=new \OC\Cache\File();
}
public function tearDown() {
OC_User::setUserId($this->user);
OC_Config::setValue('datadirectory', $this->datadir);
\OC_User::setUserId($this->user);
\OC_Config::setValue('datadirectory', $this->datadir);
}
}

68
tests/lib/cache/usercache.php vendored Normal file
View File

@ -0,0 +1,68 @@
<?php
/**
* ownCloud
*
* @author Robin Appelman
* @copyright 2012 Robin Appelman icewind@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace Test\Cache;
class UserCache extends \Test_Cache {
private $user;
private $datadir;
public function setUp() {
//clear all proxies and hooks so we can do clean testing
\OC_FileProxy::clearProxies();
\OC_Hook::clear('OC_Filesystem');
//disabled atm
//enable only the encryption hook if needed
//if(OC_App::isEnabled('files_encryption')) {
// OC_FileProxy::register(new OC_FileProxy_Encryption());
//}
//set up temporary storage
\OC\Files\Filesystem::clearMounts();
$storage = new \OC\Files\Storage\Temporary(array());
\OC\Files\Filesystem::mount($storage,array(),'/');
$datadir = str_replace('local::', '', $storage->getId());
$this->datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT.'/data');
\OC_Config::setValue('datadirectory', $datadir);
\OC_User::clearBackends();
\OC_User::useBackend(new \OC_User_Dummy());
//login
\OC_User::createUser('test', 'test');
$this->user = \OC_User::getUser();
\OC_User::setUserId('test');
//set up the users dir
$rootView=new \OC\Files\View('');
$rootView->mkdir('/test');
$this->instance=new \OC\Cache\UserCache();
}
public function tearDown() {
\OC_User::setUserId($this->user);
\OC_Config::setValue('datadirectory', $this->datadir);
}
}