Files
iTop/setup/moduledependency/validation/xmlmodule.php
2025-09-19 16:57:58 +02:00

110 lines
3.6 KiB
PHP

<?php
namespace Combodo\iTop\Setup\ModuleDependency\Validation;
use Combodo\iTop\Setup\ModuleDependency\ModuleDependency;
class XmlModule {
public string $sModuleName;
public array $aDependencyModulesNames=[];
public array $aExpandedDependencyModulesNames=[];
public array $aAllDependencyModulesNames=[];
public array $aXMlMetaInfosByModuleNames=[];
public function __construct(string $sModuleName)
{
$this->sModuleName = $sModuleName;
}
public function AddDependency(string $sXmlMetaInfoUID, array $aDefiningModuleNames, array $aModules)
{
$aRemainingModules=[];
foreach ($aDefiningModuleNames as $sDefiningModuleName) {
if ($sDefiningModuleName === $this->sModuleName) {
continue;
}
if ($sDefiningModuleName === "core" || $sDefiningModuleName === "application") {
continue;
}
$aRemainingModules[]=$sDefiningModuleName;
}
if (count($aRemainingModules)==0){
return;
}
/*$aLog = ['itop-bridge-datacenter-mgmt-services', 'itop-datacenter-mgmt'];
if (in_array($sDefiningModuleName, $aLog) && in_array($this->sModuleName, $aLog)){
echo $this->sModuleName . " => $sDefiningModuleName === " . $sXmlMetaInfoUID . "\n";
}*/
$sKey=implode(' || ', $aRemainingModules);
if (! array_key_exists($sKey, $this->aXMlMetaInfosByModuleNames)){
$this->aXMlMetaInfosByModuleNames[$sKey]=[$sXmlMetaInfoUID];
} else {
if (! in_array($sXmlMetaInfoUID, $this->aXMlMetaInfosByModuleNames[$sKey])){
$this->aXMlMetaInfosByModuleNames[$sKey][]=$sXmlMetaInfoUID;
}
}
if (! array_key_exists($sKey, $this->aDependencyModulesNames)){
$aCurrentModules=[];
foreach ($aRemainingModules as $sDefiningModuleName) {
/** @var XmlModule $oXmlModule */
$oXmlModule = $aModules[$sDefiningModuleName];
$aCurrentModules[]=$oXmlModule;
}
$this->aDependencyModulesNames[$sKey]=$aCurrentModules;
}
}
public function Depends(string $sModuleName) : bool
{
return array_key_exists($sModuleName, $this->aDependencyModulesNames) || array_key_exists($sModuleName, $this->aAllDependencyModulesNames);
}
public function __toString(): string
{
return sprintf("%s (%s)", $this->sModuleName, implode(' & ', array_keys($this->aDependencyModulesNames)));
}
public function CompleteModuleDependencies(array $aAllModules) : void
{
foreach ($this->aDependencyModulesNames as $sDirectDependency => $oXmlModules){
/** @var XmlModule $oDirectDepXmlModule */
$oDirectDepXmlModule = $aAllModules[$sDirectDependency] ?? null;
if (! is_null($oDirectDepXmlModule)) {
foreach ($oDirectDepXmlModule->aDependencyModulesNames as $sDirectDependency2 => $oXmlModules2) {
if (!array_key_exists($sDirectDependency2, $this->aDependencyModulesNames) && !in_array($sDirectDependency2, $this->aAllDependencyModulesNames)) {
$this->aAllDependencyModulesNames[] = $sDirectDependency2;
}
}
}
}
}
private bool $bExpandedModuleNamesComputed=false;
public function GetExpandedModuleNames(array $aModules) : array {
if ($this->bExpandedModuleNamesComputed){
return $this->aExpandedDependencyModulesNames;
}
$this->bExpandedModuleNamesComputed = true;
$aRes= [];
foreach ($this->aDependencyModulesNames as $sDependency => $oXmlModules){
$oiTopCoreModuleDependency = new ModuleDependency($sDependency);
foreach ($oiTopCoreModuleDependency->GetPotentialPrerequisiteModuleNames() as $sName){
$oDependencyModule = $aModules[$sName] ?? null;
$aRes[]=$sName;
$aRes = array_merge($aRes, $oDependencyModule->GetExpandedModuleNames($aModules));
}
}
$this->aExpandedDependencyModulesNames = array_unique($aRes);
return $this->aExpandedDependencyModulesNames;
}
}