diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -71,6 +71,7 @@ 'AlmanacNetworkTransaction' => 'applications/almanac/storage/AlmanacNetworkTransaction.php', 'AlmanacNetworkTransactionQuery' => 'applications/almanac/query/AlmanacNetworkTransactionQuery.php', 'AlmanacNetworkViewController' => 'applications/almanac/controller/AlmanacNetworkViewController.php', + 'AlmanacPropertiesDestructionEngineExtension' => 'applications/almanac/engineextension/AlmanacPropertiesDestructionEngineExtension.php', 'AlmanacProperty' => 'applications/almanac/storage/AlmanacProperty.php', 'AlmanacPropertyController' => 'applications/almanac/controller/AlmanacPropertyController.php', 'AlmanacPropertyDeleteController' => 'applications/almanac/controller/AlmanacPropertyDeleteController.php', @@ -2125,6 +2126,8 @@ 'PhabricatorDesktopNotificationsSettingsPanel' => 'applications/settings/panel/PhabricatorDesktopNotificationsSettingsPanel.php', 'PhabricatorDestructibleInterface' => 'applications/system/interface/PhabricatorDestructibleInterface.php', 'PhabricatorDestructionEngine' => 'applications/system/engine/PhabricatorDestructionEngine.php', + 'PhabricatorDestructionEngineExtension' => 'applications/system/engine/PhabricatorDestructionEngineExtension.php', + 'PhabricatorDestructionEngineExtensionModule' => 'applications/system/engine/PhabricatorDestructionEngineExtensionModule.php', 'PhabricatorDeveloperConfigOptions' => 'applications/config/option/PhabricatorDeveloperConfigOptions.php', 'PhabricatorDeveloperPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDeveloperPreferencesSettingsPanel.php', 'PhabricatorDiffInlineCommentQuery' => 'infrastructure/diff/query/PhabricatorDiffInlineCommentQuery.php', @@ -3922,6 +3925,7 @@ 'AlmanacNetworkTransaction' => 'PhabricatorApplicationTransaction', 'AlmanacNetworkTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'AlmanacNetworkViewController' => 'AlmanacNetworkController', + 'AlmanacPropertiesDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 'AlmanacProperty' => array( 'PhabricatorCustomFieldStorage', 'PhabricatorPolicyInterface', @@ -6292,6 +6296,8 @@ 'PhabricatorDefaultRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler', 'PhabricatorDesktopNotificationsSettingsPanel' => 'PhabricatorSettingsPanel', 'PhabricatorDestructionEngine' => 'Phobject', + 'PhabricatorDestructionEngineExtension' => 'Phobject', + 'PhabricatorDestructionEngineExtensionModule' => 'PhabricatorConfigModule', 'PhabricatorDeveloperConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorDeveloperPreferencesSettingsPanel' => 'PhabricatorSettingsPanel', 'PhabricatorDiffInlineCommentQuery' => 'PhabricatorApplicationTransactionCommentQuery', diff --git a/src/applications/almanac/engineextension/AlmanacPropertiesDestructionEngineExtension.php b/src/applications/almanac/engineextension/AlmanacPropertiesDestructionEngineExtension.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/engineextension/AlmanacPropertiesDestructionEngineExtension.php @@ -0,0 +1,32 @@ +establishConnection('w'); + + queryfx( + $conn_w, + 'DELETE FROM %T WHERE objectPHID = %s', + $table->getTableName(), + $object->getPHID()); + } + +} diff --git a/src/applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php b/src/applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php --- a/src/applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php +++ b/src/applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php @@ -8,7 +8,7 @@ } public function getModuleName() { - return pht('SearchEngine Extensions'); + return pht('Engine: Search'); } public function renderModuleStatus(AphrontRequest $request) { diff --git a/src/applications/system/engine/PhabricatorDestructionEngine.php b/src/applications/system/engine/PhabricatorDestructionEngine.php --- a/src/applications/system/engine/PhabricatorDestructionEngine.php +++ b/src/applications/system/engine/PhabricatorDestructionEngine.php @@ -17,14 +17,9 @@ $log->setRootLogID($this->rootLogID); } - $object_phid = null; - if (method_exists($object, 'getPHID')) { - try { - $object_phid = $object->getPHID(); - $log->setObjectPHID($object_phid); - } catch (Exception $ex) { - // Ignore. - } + $object_phid = $this->getObjectPHID($object); + if ($object_phid) { + $log->setObjectPHID($object_phid); } if (method_exists($object, 'getMonogram')) { @@ -43,6 +38,18 @@ $object->destroyObjectPermanently($this); + $extensions = PhabricatorDestructionEngineExtension::getAllExtensions(); + foreach ($extensions as $key => $extension) { + if (!$extension->canDestroyObject($this, $object)) { + unset($extensions[$key]); + continue; + } + } + + foreach ($extensions as $key => $extension) { + $extension->destroyObject($this, $object); + } + if ($object_phid) { $this->destroyEdges($object_phid); @@ -92,10 +99,6 @@ $token->delete(); } } - - if ($object instanceof AlmanacPropertyInterface) { - $this->destroyAlmanacProperties($object_phid); - } } private function destroyEdges($src_phid) { @@ -152,15 +155,22 @@ $object_phid); } - private function destroyAlmanacProperties($object_phid) { - $table = new AlmanacProperty(); - $conn_w = $table->establishConnection('w'); + private function destroyAlmanacProperties($object_phid) {} - queryfx( - $conn_w, - 'DELETE FROM %T WHERE objectPHID = %s', - $table->getTableName(), - $object_phid); + public function getObjectPHID($object) { + if (!is_object($object)) { + return null; + } + + if (!method_exists($object, 'getPHID')) { + return null; + } + + try { + return $object->getPHID(); + } catch (Exception $ex) { + return null; + } } } diff --git a/src/applications/system/engine/PhabricatorDestructionEngineExtension.php b/src/applications/system/engine/PhabricatorDestructionEngineExtension.php new file mode 100644 --- /dev/null +++ b/src/applications/system/engine/PhabricatorDestructionEngineExtension.php @@ -0,0 +1,24 @@ +getPhobjectClassConstant('EXTENSIONKEY'); + } + + abstract public function getExtensionName(); + abstract public function canDestroyObject( + PhabricatorDestructionEngine $engine, + $object); + abstract public function destroyObject( + PhabricatorDestructionEngine $engine, + $object); + + final public static function getAllExtensions() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getExtensionKey') + ->execute(); + } + +} diff --git a/src/applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php b/src/applications/system/engine/PhabricatorDestructionEngineExtensionModule.php copy from src/applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php copy to src/applications/system/engine/PhabricatorDestructionEngineExtensionModule.php --- a/src/applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php +++ b/src/applications/system/engine/PhabricatorDestructionEngineExtensionModule.php @@ -1,51 +1,43 @@ getViewer(); - $extensions = PhabricatorEditEngineExtension::getAllExtensions(); + $extensions = PhabricatorDestructionEngineExtension::getAllExtensions(); $rows = array(); foreach ($extensions as $extension) { $rows[] = array( - $extension->getExtensionPriority(), get_class($extension), $extension->getExtensionName(), - $extension->isExtensionEnabled() - ? pht('Yes') - : pht('No'), ); } $table = id(new AphrontTableView($rows)) ->setHeaders( array( - pht('Priority'), pht('Class'), pht('Name'), - pht('Enabled'), )) ->setColumnClasses( array( null, - null, 'wide pri', - null, )); return id(new PHUIObjectBoxView()) - ->setHeaderText(pht('EditEngine Extensions')) + ->setHeaderText(pht('DestructionEngine Extensions')) ->setTable($table); } diff --git a/src/applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php b/src/applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php --- a/src/applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php +++ b/src/applications/transactions/editengineextension/PhabricatorEditEngineExtensionModule.php @@ -8,7 +8,7 @@ } public function getModuleName() { - return pht('EditEngine Extensions'); + return pht('Engine: Edit'); } public function renderModuleStatus(AphrontRequest $request) {