ReadRemovedExtensions(); $this->AddAnalyzeParams(); $aParams['sTransactionId'] = utils::GetNewTransactionId(); $aParams['aExtensions'] = $this->GetExtensionsTable(); $aParams['aExtensionsCode'] = $this->aSelectedExtensionsForCheck; $aParams['aAnalysisDataTable'] = $this->aAnalysisDataTable; $aParams['aClasses'] = array_keys($this->aCountClassesToCleanup); $aParams['bHasData'] = $this->iCount > 0; $aParams['sSetupUrl'] = utils::GetAbsoluteUrlAppRoot().'setup'; $aParams['iCount'] = $this->iCount; $aParams['DataFeatureRemovalErrorMessage'] = $sErrorMessage; $aParams['bAnalysisOk'] = (count($this->aCountClassesToCleanup) > 0) && ($this->iCount === 0); $this->AddLinkedStylesheet(utils::GetAbsoluteUrlModulesRoot().DataFeatureRemovalHelper::MODULE_NAME.'/assets/css/DataFeatureRemoval.css'); $this->AddLinkedScript(utils::GetAbsoluteUrlModulesRoot().DataFeatureRemovalHelper::MODULE_NAME.'/assets/js/DataFeatureRemoval.js'); $this->m_sOperation = "Main"; $this->DisplayPage($aParams); } public function AddAnalyzeParams(): void { $aData = []; $aColumns = []; $this->iCount = 0; foreach ($this->aCountClassesToCleanup as $sClass => $iCount) { $sModuleName = MetaModel::GetModuleName($sClass); $aExtensions = DataFeatureRemoverExtensionService::GetInstance()->GetIncludingExtensions($sModuleName); $sExtensions = implode(' ', $aExtensions); $aColumns = ['ClassName','FeatureName','Module','Occurrence']; $aData[] = [$sClass,$sExtensions,$sModuleName,$iCount]; $this->iCount += $iCount; } $this->aAnalysisDataTable = $this->GetTableData('Analysis', $aColumns, $aData); } public function OperationAnalyze(): void { $this->ReadRemovedExtensions(); $this->m_sOperation = 'Main'; try { if (count($this->aSelectedExtensionsForCheck) > 0) { $this->Analyze(); } $this->OperationMain(); } catch (Exception $e) { IssueLog::Error(__METHOD__, null, ['stack' => $e->getTraceAsString(), 'exception' => $e->getMessage()]); $this->OperationMain($e->getMessage()); } } private function Analyze(): void { $sSourceEnv = MetaModel::GetEnvironment(); $oDryRemovalRuntimeEnvironment = new DryRemovalRuntimeEnvironment(); $oDryRemovalRuntimeEnvironment->Prepare($sSourceEnv, $this->aSelectedExtensionsForCheck); $oDryRemovalRuntimeEnvironment->CompileFrom($sSourceEnv); $oSetupAudit = new SetupAudit($sSourceEnv, DryRemovalRuntimeEnvironment::DRY_REMOVAL_AUDIT_ENV); $aGetRemovedClasses = $oSetupAudit->GetIssues(); IssueLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]); $this->aCountClassesToCleanup = $aGetRemovedClasses; } public function OperationDeletionPlan(): void { $aParams = []; $this->ValidateTransactionId(); $aClasses = utils::ReadPostedParam('classes', null, utils::ENUM_SANITIZATION_FILTER_CLASS); $aDeletionPlanSummaryEntities = DeletionPlanService::GetInstance()->GetDeletionPlanSummary($aClasses); $aColumns = ['Class', 'DeleteCount' , 'UpdateCount', 'Issue']; $aRows = []; foreach ($aDeletionPlanSummaryEntities as $oDeletionPlanSummaryEntity) { $aRows[] = [ $oDeletionPlanSummaryEntity->sClass, $oDeletionPlanSummaryEntity->iDeleteCount, $oDeletionPlanSummaryEntity->iUpdateCount, $oDeletionPlanSummaryEntity->sIssue ?? '', ]; } $aParams['sTransactionId'] = utils::GetNewTransactionId(); $aParams['aDeletionPlanSummary'] = $this->GetTableData('Extensions', $aColumns, $aRows); $aParams['aClasses'] = $aClasses; $aParams['aExtensionsCode'] = utils::ReadPostedParam('aExtensionsCode', []); $this->DisplayPage($aParams); } public function OperationDoDeletion(): void { $aParams = []; $this->ValidateTransactionId(); $aClasses = utils::ReadPostedParam('classes', null, utils::ENUM_SANITIZATION_FILTER_CLASS); $sDeletionButtonValue = utils::ReadPostedParam('btn_deletion', null); $bAsynchronous = ('async_deletion' === $sDeletionButtonValue); if ($bAsynchronous) { BackgroundOperationService::GetInstance()->CreateOperation(utils::ReadPostedParam('aExtensionsCode', []), $aClasses); $this->OperationMain(); return; } $aDeletionExecutionSummary = DeletionPlanService::GetInstance()->ExecuteDeletionPlan($aClasses); $aColumns = ['Class', 'DeletedCount' , 'UpdatedCount']; $aRows = []; foreach ($aDeletionExecutionSummary as $oDeletionExecutionSummaryEntity) { $aRows[] = [ $oDeletionExecutionSummaryEntity->sClass, $oDeletionExecutionSummaryEntity->iDeleteCount, $oDeletionExecutionSummaryEntity->iUpdateCount, ]; } $aParams['sTransactionId'] = utils::GetNewTransactionId(); $aParams['aDeletionExecutionSummary'] = $this->GetTableData('Extensions', $aColumns, $aRows); $this->DisplayPage($aParams); } /** * Get installed extensions from disk * * @return array structure for twig datatable */ private function GetExtensionsTable(): array { $aExtensions = []; $aColumns = ['', 'Version', 'Name', 'Code']; foreach (DataFeatureRemoverExtensionService::GetInstance()->ReadItopExtensions() as $sCode => $oExtension) { /** @var \iTopExtension $oExtension */ $bCleanupOngoing = BackgroundOperationService::GetInstance()->IsExtensionBeingCleaned($sCode); $sChecked = ''; $sDisabledHtml = ''; $sLabel = $oExtension->sLabel; if ($bCleanupOngoing) { $sDisabledHtml = 'disabled=""'; $sLabel .= <<