diff --git a/lib/private/ServerContainer.php b/lib/private/ServerContainer.php index 3391dd83a0..97a3b99d53 100644 --- a/lib/private/ServerContainer.php +++ b/lib/private/ServerContainer.php @@ -37,6 +37,9 @@ class ServerContainer extends SimpleContainer { /** @var DIContainer[] */ protected $appContainers; + /** @var string[] */ + protected $hasNoAppContainer; + /** @var string[] */ protected $namespaces; @@ -47,6 +50,7 @@ class ServerContainer extends SimpleContainer { parent::__construct(); $this->appContainers = []; $this->namespaces = []; + $this->hasNoAppContainer = []; } /** @@ -69,15 +73,27 @@ class ServerContainer extends SimpleContainer { /** * @param string $namespace + * @param string $sensitiveNamespace * @return DIContainer * @throws QueryException */ - protected function getAppContainer($namespace) { + protected function getAppContainer($namespace, $sensitiveNamespace) { if (isset($this->appContainers[$namespace])) { return $this->appContainers[$namespace]; } if (isset($this->namespaces[$namespace])) { + if (!isset($this->hasNoAppContainer[$namespace])) { + $applicationClassName = 'OCA\\' . $sensitiveNamespace . '\\AppInfo\\Application'; + if (class_exists($applicationClassName)) { + new $applicationClassName(); + if (isset($this->appContainers[$namespace])) { + return $this->appContainers[$namespace]; + } + } + $this->hasNoAppContainer[$namespace] = true; + } + return new DIContainer($this->namespaces[$namespace]); } throw new QueryException(); @@ -96,7 +112,7 @@ class ServerContainer extends SimpleContainer { if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) { $segments = explode('\\', $name); try { - $appContainer = $this->getAppContainer(strtolower($segments[1])); + $appContainer = $this->getAppContainer(strtolower($segments[1]), $segments[1]); return $appContainer->queryNoFallback($name); } catch (QueryException $e) { // Didn't find the service or the respective app container,