summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2015-12-18 16:34:42 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2015-12-18 16:34:42 +0100
commit95a255b0d4dc4d188022fcd11f0c8c03a76041b7 (patch)
tree5b1f4249dc18f43101b0aaf0f5bfe83ff7ae0fd1 /lib
parent6cdaf754b22159ca3b53fc03ae83261c1eb89acc (diff)
parenta9935bd49042e3c4a35630a980bf7e1c6d56ff20 (diff)
downloadnextcloud-server-95a255b0d4dc4d188022fcd11f0c8c03a76041b7.tar.gz
nextcloud-server-95a255b0d4dc4d188022fcd11f0c8c03a76041b7.zip
Merge pull request #21281 from owncloud/allow-di-for-background-jobs
Allow background jobs to be service names for DI
Diffstat (limited to 'lib')
-rw-r--r--lib/private/appframework/dependencyinjection/dicontainer.php4
-rw-r--r--lib/private/backgroundjob/joblist.php24
-rw-r--r--lib/private/server.php2
-rw-r--r--lib/private/servercontainer.php89
-rw-r--r--lib/public/backgroundjob/ijob.php19
5 files changed, 127 insertions, 11 deletions
diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php
index ce6523cc8a8..88ffc1c6f98 100644
--- a/lib/private/appframework/dependencyinjection/dicontainer.php
+++ b/lib/private/appframework/dependencyinjection/dicontainer.php
@@ -62,6 +62,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
$this['AppName'] = $appName;
$this['urlParams'] = $urlParams;
+ /** @var \OC\ServerContainer $server */
+ $server = $this->getServer();
+ $server->registerAppContainer($appName, $this);
+
// aliases
$this->registerAlias('appName', 'AppName');
$this->registerAlias('webRoot', 'WebRoot');
diff --git a/lib/private/backgroundjob/joblist.php b/lib/private/backgroundjob/joblist.php
index 75c205833fe..446de2fa1a4 100644
--- a/lib/private/backgroundjob/joblist.php
+++ b/lib/private/backgroundjob/joblist.php
@@ -24,6 +24,7 @@
namespace OC\BackgroundJob;
+use OCP\AppFramework\QueryException;
use OCP\BackgroundJob\IJob;
use OCP\BackgroundJob\IJobList;
use OCP\AutoloadNotAllowedException;
@@ -232,24 +233,29 @@ class JobList implements IJobList {
* @return IJob|null
*/
private function buildJob($row) {
- $class = $row['class'];
- /**
- * @var Job $job
- */
try {
- if (!class_exists($class)) {
- // job from disabled app or old version of an app, no need to do anything
- return null;
+ try {
+ // Try to load the job as a service
+ /** @var IJob $job */
+ $job = \OC::$server->query($row['class']);
+ } catch (QueryException $e) {
+ if (class_exists($row['class'])) {
+ $class = $row['class'];
+ $job = new $class();
+ } else {
+ // job from disabled app or old version of an app, no need to do anything
+ return null;
+ }
}
- $job = new $class();
+
$job->setId($row['id']);
$job->setLastRun($row['last_run']);
$job->setArgument(json_decode($row['argument'], true));
return $job;
} catch (AutoloadNotAllowedException $e) {
// job is from a disabled app, ignore
+ return null;
}
- return null;
}
/**
diff --git a/lib/private/server.php b/lib/private/server.php
index 3e1af0310d1..7efe78b7c37 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -78,7 +78,7 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
*
* TODO: hookup all manager classes
*/
-class Server extends SimpleContainer implements IServerContainer {
+class Server extends ServerContainer implements IServerContainer {
/** @var string */
private $webRoot;
diff --git a/lib/private/servercontainer.php b/lib/private/servercontainer.php
new file mode 100644
index 00000000000..856e3f9b495
--- /dev/null
+++ b/lib/private/servercontainer.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC;
+
+
+use OC\AppFramework\DependencyInjection\DIContainer;
+use OC\AppFramework\Utility\SimpleContainer;
+use OCP\AppFramework\QueryException;
+
+/**
+ * Class ServerContainer
+ *
+ * @package OC
+ */
+class ServerContainer extends SimpleContainer {
+ /** @var DIContainer[] */
+ protected $appContainers;
+
+ /**
+ * ServerContainer constructor.
+ */
+ public function __construct() {
+ parent::__construct();
+ $this->appContainers = [];
+ }
+
+ /**
+ * @param string $appName
+ * @param DIContainer $container
+ */
+ public function registerAppContainer($appName, DIContainer $container) {
+ $this->appContainers[$appName] = $container;
+ }
+
+ /**
+ * @param string $appName
+ * @return DIContainer
+ */
+ public function getAppContainer($appName) {
+ if (isset($this->appContainers[$appName])) {
+ return $this->appContainers[$appName];
+ }
+
+ return new DIContainer($appName);
+ }
+
+ /**
+ * @param string $name name of the service to query for
+ * @return mixed registered service for the given $name
+ * @throws QueryException if the query could not be resolved
+ */
+ public function query($name) {
+ $name = $this->sanitizeName($name);
+
+ // In case the service starts with OCA\ we try to find the service in
+ // the apps container first.
+ if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) {
+ $segments = explode('\\', $name);
+ $appContainer = $this->getAppContainer(strtolower($segments[0]));
+ try {
+ return $appContainer->query($name);
+ } catch (QueryException $e) {
+ // Didn't find the service in the respective app container,
+ // ignore it and fall back to the core container.
+ }
+ }
+
+ return parent::query($name);
+ }
+}
diff --git a/lib/public/backgroundjob/ijob.php b/lib/public/backgroundjob/ijob.php
index a24a5434521..8d970dbe781 100644
--- a/lib/public/backgroundjob/ijob.php
+++ b/lib/public/backgroundjob/ijob.php
@@ -36,12 +36,29 @@ interface IJob {
*
* @param \OCP\BackgroundJob\IJobList $jobList The job list that manages the state of this job
* @param ILogger $logger
- * @return void
* @since 7.0.0
*/
public function execute($jobList, ILogger $logger = null);
/**
+ * @param int $id
+ * @since 7.0.0
+ */
+ public function setId($id);
+
+ /**
+ * @param int $lastRun
+ * @since 7.0.0
+ */
+ public function setLastRun($lastRun);
+
+ /**
+ * @param mixed $argument
+ * @since 7.0.0
+ */
+ public function setArgument($argument);
+
+ /**
* Get the id of the background job
* This id is determined by the job list when a job is added to the list
*