1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-10 08:52:39 +01:00

Allow third-party code to extend upstream datasources via EngineExtension

Summary: Depends on D19089. Fixes T13079. This is likely not the final form of this, but creates a defensible extension point.

Test Plan: See T13079 for discussion.

Maniphest Tasks: T13079

Differential Revision: https://secure.phabricator.com/D19090
This commit is contained in:
epriestley 2018-02-14 17:41:43 -08:00
parent d6edc3f4cc
commit fe294d4034
3 changed files with 33 additions and 1 deletions

View file

@ -34,4 +34,22 @@ final class PhabricatorDatasourceEngine extends Phobject {
return null;
}
public function newDatasourcesForCompositeDatasource(
PhabricatorTypeaheadCompositeDatasource $datasource) {
$viewer = $this->getViewer();
$extensions = PhabricatorDatasourceEngineExtension::getAllExtensions();
$sources = array();
foreach ($extensions as $extension) {
$extension_sources = id(clone $extension)
->setViewer($viewer)
->newDatasourcesForCompositeDatasource($datasource);
foreach ($extension_sources as $extension_source) {
$sources[] = $extension_source;
}
}
return $sources;
}
}

View file

@ -21,6 +21,11 @@ abstract class PhabricatorDatasourceEngineExtension extends Phobject {
return null;
}
public function newDatasourcesForCompositeDatasource(
PhabricatorTypeaheadCompositeDatasource $datasource) {
return array();
}
final public static function getAllExtensions() {
return id(new PhutilClassMapQuery())
->setAncestorClass(__CLASS__)

View file

@ -223,8 +223,17 @@ abstract class PhabricatorTypeaheadCompositeDatasource
private function getUsableDatasources() {
if ($this->usable === null) {
$viewer = $this->getViewer();
$sources = $this->getComponentDatasources();
$extension_sources = id(new PhabricatorDatasourceEngine())
->setViewer($viewer)
->newDatasourcesForCompositeDatasource($this);
foreach ($extension_sources as $extension_source) {
$sources[] = $extension_source;
}
$usable = array();
foreach ($sources as $source) {
$application_class = $source->getDatasourceApplicationClass();
@ -239,7 +248,7 @@ abstract class PhabricatorTypeaheadCompositeDatasource
}
}
$source->setViewer($this->getViewer());
$source->setViewer($viewer);
$usable[] = $source;
}
$this->usable = $usable;