diff --git a/datamodels/2.x/itop-core-update/src/Service/CoreUpdater.php b/datamodels/2.x/itop-core-update/src/Service/CoreUpdater.php index 05a1f43a7..3fac3040d 100644 --- a/datamodels/2.x/itop-core-update/src/Service/CoreUpdater.php +++ b/datamodels/2.x/itop-core-update/src/Service/CoreUpdater.php @@ -92,7 +92,7 @@ final class CoreUpdater $sFinalEnv = 'production'; $oRuntimeEnv = new RunTimeEnvironmentCoreUpdater($sFinalEnv, false); $oRuntimeEnv->CheckDirectories($sFinalEnv); - $oRuntimeEnv->CompileFrom('production'); + $oRuntimeEnv->CompileFrom($sFinalEnv); $oRuntimeEnv->Rollback(); @@ -156,20 +156,13 @@ final class CoreUpdater ]; $aAvailableModules = $oRuntimeEnv->AnalyzeInstallation($oConfig, $aDirsToScanForModules); $aSelectedModules = []; - foreach ($aAvailableModules as $sModuleId => $aModule) { - if (($sModuleId == ROOT_MODULE) || ($sModuleId == DATAMODEL_MODULE)) { - continue; - } else { - $aSelectedModules[] = $sModuleId; - } - } - $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'BeforeDatabaseCreation'); + $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, 'BeforeDatabaseCreation'); $oRuntimeEnv->CreateDatabaseStructure($oConfig, 'upgrade'); - $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDatabaseCreation'); + $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, 'AfterDatabaseCreation'); $oRuntimeEnv->UpdatePredefinedObjects(); - $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDatabaseSetup'); - $oRuntimeEnv->LoadData($aAvailableModules, $aSelectedModules, false /* no sample data*/); - $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDataLoad'); + $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, 'AfterDatabaseSetup'); + $oRuntimeEnv->LoadData($aAvailableModules, false /* no sample data*/); + $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, 'AfterDataLoad'); $sDataModelVersion = $oRuntimeEnv->GetCurrentDataModelVersion(); $oExtensionsMap = new iTopExtensionsMap(); // Default choices = as before diff --git a/datamodels/2.x/itop-hub-connector/ajax.php b/datamodels/2.x/itop-hub-connector/ajax.php index 33ac5940b..b7fe109b7 100644 --- a/datamodels/2.x/itop-hub-connector/ajax.php +++ b/datamodels/2.x/itop-hub-connector/ajax.php @@ -293,28 +293,19 @@ try { $aAvailableModules = $oRuntimeEnv->AnalyzeInstallation($oConfig, $oRuntimeEnv->GetBuildDir(), true); - $aSelectedModules = []; - foreach ($aAvailableModules as $sModuleId => $aModule) { - if (($sModuleId == ROOT_MODULE) || ($sModuleId == DATAMODEL_MODULE)) { - continue; - } else { - $aSelectedModules[] = $sModuleId; - } - } - - $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'BeforeDatabaseCreation'); + $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, 'BeforeDatabaseCreation'); $oRuntimeEnv->CreateDatabaseStructure($oConfig, 'upgrade'); - $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDatabaseCreation'); + $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, 'AfterDatabaseCreation'); $oRuntimeEnv->UpdatePredefinedObjects(); - $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDatabaseSetup'); + $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, 'AfterDatabaseSetup'); - $oRuntimeEnv->LoadData($aAvailableModules, $aSelectedModules, false /* no sample data*/); + $oRuntimeEnv->LoadData($aAvailableModules, false /* no sample data*/); - $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDataLoad'); + $oRuntimeEnv->CallInstallerHandlers($aAvailableModules, 'AfterDataLoad'); // Record the installation so that the "about box" knows about the installed modules $sDataModelVersion = $oRuntimeEnv->GetCurrentDataModelVersion(); @@ -334,7 +325,7 @@ try { $aSelectedExtensionCodes[] = $oExtension->sCode; } $aSelectedExtensions = $oExtensionsMap->GetChoices(); - $oRuntimeEnv->RecordInstallation($oConfig, $sDataModelVersion, $aSelectedModules, $aSelectedExtensionCodes, 'Done by the iTop Hub Connector'); + $oRuntimeEnv->RecordInstallation($oConfig, $sDataModelVersion, $aAvailableModules, $aSelectedExtensionCodes, 'Done by the iTop Hub Connector'); // Report the success in a way that will be detected by the ajax caller SetupLog::Info('Deployment successfully completed.'); diff --git a/setup/applicationinstaller.class.inc.php b/setup/applicationinstaller.class.inc.php index ca6293565..bb9b9de62 100644 --- a/setup/applicationinstaller.class.inc.php +++ b/setup/applicationinstaller.class.inc.php @@ -743,7 +743,7 @@ class ApplicationInstaller // Module specific actions (migrate the data) // $aAvailableModules = $oProductionEnv->AnalyzeInstallation(MetaModel::GetConfig(), APPROOT.$sModulesDir); - $oProductionEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'BeforeDatabaseCreation'); + $oProductionEnv->CallInstallerHandlers($aAvailableModules, 'BeforeDatabaseCreation', $aSelectedModules); if (!$oProductionEnv->CreateDatabaseStructure(MetaModel::GetConfig(), $sMode)) { throw new Exception("Failed to create/upgrade the database structure for environment '$sTargetEnvironment'"); @@ -873,7 +873,7 @@ class ApplicationInstaller // Perform here additional DB setup... profiles, etc... // $aAvailableModules = $oProductionEnv->AnalyzeInstallation(MetaModel::GetConfig(), APPROOT.$sModulesDir); - $oProductionEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDatabaseCreation'); + $oProductionEnv->CallInstallerHandlers($aAvailableModules, 'AfterDatabaseCreation', $aSelectedModules); $oProductionEnv->UpdatePredefinedObjects(); @@ -887,7 +887,7 @@ class ApplicationInstaller // Perform final setup tasks here // - $oProductionEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDatabaseSetup'); + $oProductionEnv->CallInstallerHandlers($aAvailableModules, 'AfterDatabaseSetup', $aSelectedModules); } /** @@ -937,11 +937,11 @@ class ApplicationInstaller } $aAvailableModules = $oProductionEnv->AnalyzeInstallation($oConfig, APPROOT.$sModulesDir); - $oProductionEnv->LoadData($aAvailableModules, $aSelectedModules, $bSampleData); + $oProductionEnv->LoadData($aAvailableModules, $bSampleData, $aSelectedModules); // Perform after dbload setup tasks here // - $oProductionEnv->CallInstallerHandlers($aAvailableModules, $aSelectedModules, 'AfterDataLoad'); + $oProductionEnv->CallInstallerHandlers($aAvailableModules, 'AfterDataLoad', $aSelectedModules); } /** diff --git a/setup/runtimeenv.class.inc.php b/setup/runtimeenv.class.inc.php index 2dd8a66d3..3b857dbd1 100644 --- a/setup/runtimeenv.class.inc.php +++ b/setup/runtimeenv.class.inc.php @@ -548,10 +548,15 @@ class RunTimeEnvironment // Record installed modules and extensions // $aAvailableModules = $this->AnalyzeInstallation($oConfig, $this->GetBuildDir()); - foreach ($aSelectedModuleCodes as $sModuleId) { + foreach ($aSelectedModuleCodes as $sModuleId => $aData) { + if (($sModuleId == ROOT_MODULE) || ($sModuleId == DATAMODEL_MODULE)) { + continue; + } + if (!array_key_exists($sModuleId, $aAvailableModules)) { continue; } + $aModuleData = $aAvailableModules[$sModuleId]; $sName = $sModuleId; $sVersion = $aModuleData['available_version']; @@ -851,14 +856,18 @@ class RunTimeEnvironment /** * Call the given handler method for all selected modules having an installation handler * @param array[] $aAvailableModules - * @param string[] $aSelectedModules * @param string $sHandlerName + * @param string[]|null $aSelectedModules * @throws CoreException */ - public function CallInstallerHandlers($aAvailableModules, $aSelectedModules, $sHandlerName) + public function CallInstallerHandlers($aAvailableModules, $sHandlerName, $aSelectedModules = null) { foreach ($aAvailableModules as $sModuleId => $aModule) { - if (($sModuleId != ROOT_MODULE) && in_array($sModuleId, $aSelectedModules)) { + if (($sModuleId == ROOT_MODULE) || ($sModuleId == DATAMODEL_MODULE)) { + continue; + } + + if (is_null($aSelectedModules) || in_array($sModuleId, $aSelectedModules)) { $aArgs = [MetaModel::GetConfig(), $aModule['installed_version'], $aModule['available_version']]; RunTimeEnvironment::CallInstallerHandler($aAvailableModules[$sModuleId], $sHandlerName, $aArgs); } @@ -903,10 +912,10 @@ class RunTimeEnvironment /** * Load data from XML files for the selected modules (structural data and/or sample data) * @param array[] $aAvailableModules All available modules and their definition - * @param string[] $aSelectedModules List of selected modules * @param bool $bSampleData Wether or not to load sample data + * @param null|string[] $aSelectedModules List of selected modules */ - public function LoadData($aAvailableModules, $aSelectedModules, $bSampleData) + public function LoadData($aAvailableModules, $bSampleData, $aSelectedModules=null) { $oDataLoader = new XMLDataLoader(); @@ -919,30 +928,33 @@ class RunTimeEnvironment $aFiles = []; $aPreviouslyLoadedFiles = []; foreach ($aAvailableModules as $sModuleId => $aModule) { - if (($sModuleId != ROOT_MODULE)) { - $sRelativePath = 'env-'.$this->sTargetEnv.'/'.basename($aModule['root_dir']); - // Load data only for selected AND newly installed modules - if (in_array($sModuleId, $aSelectedModules)) { - if ($aModule['installed_version'] != '') { - // Simulate the load of the previously loaded XML files to get the mapping of the keys - if ($bSampleData) { - $aPreviouslyLoadedFiles = static::MergeWithRelativeDir($aPreviouslyLoadedFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.struct']); - $aPreviouslyLoadedFiles = static::MergeWithRelativeDir($aPreviouslyLoadedFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.sample']); - } else { - // Load only structural data - $aPreviouslyLoadedFiles = static::MergeWithRelativeDir($aPreviouslyLoadedFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.struct']); - } + if (($sModuleId == ROOT_MODULE) || ($sModuleId == DATAMODEL_MODULE)) { + continue; + } + + $sRelativePath = 'env-'.$this->sTargetEnv.'/'.basename($aModule['root_dir']); + // Load data only for selected AND newly installed modules + if (is_null($aSelectedModules) || in_array($sModuleId, $aSelectedModules)) { + if ($aModule['installed_version'] != '') { + // Simulate the load of the previously loaded XML files to get the mapping of the keys + if ($bSampleData) { + $aPreviouslyLoadedFiles = static::MergeWithRelativeDir($aPreviouslyLoadedFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.struct']); + $aPreviouslyLoadedFiles = static::MergeWithRelativeDir($aPreviouslyLoadedFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.sample']); } else { - if ($bSampleData) { - $aFiles = static::MergeWithRelativeDir($aFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.struct']); - $aFiles = static::MergeWithRelativeDir($aFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.sample']); - } else { - // Load only structural data - $aFiles = static::MergeWithRelativeDir($aFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.struct']); - } + // Load only structural data + $aPreviouslyLoadedFiles = static::MergeWithRelativeDir($aPreviouslyLoadedFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.struct']); + } + } else { + if ($bSampleData) { + $aFiles = static::MergeWithRelativeDir($aFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.struct']); + $aFiles = static::MergeWithRelativeDir($aFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.sample']); + } else { + // Load only structural data + $aFiles = static::MergeWithRelativeDir($aFiles, $sRelativePath, $aAvailableModules[$sModuleId]['data.struct']); } } } + } // Simulate the load of the previously loaded files, in order to initialize