rebase on develop + split new sort computation apart from modulediscovery

This commit is contained in:
odain
2025-09-09 23:12:18 +02:00
parent b194a0b17c
commit 6ed0f8ef3a
5 changed files with 187 additions and 41 deletions

View File

@@ -1,9 +1,13 @@
<?php
use Combodo\iTop\PhpParser\Evaluation\PhpExpressionEvaluator;
/**
* Class that handles a module dependency
*/
class iTopCoreModuleDependency {
private static PhpExpressionEvaluator $oPhpExpressionEvaluator;
private array $aPotentialPrerequisites;
private array $aParamsPerModuleId;
private string $sDepString;
@@ -43,6 +47,15 @@ class iTopCoreModuleDependency {
}
}
private static function GetPhpExpressionEvaluator(): PhpExpressionEvaluator
{
if (!isset(static::$oPhpExpressionEvaluator)) {
static::$oPhpExpressionEvaluator = new PhpExpressionEvaluator([], RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
}
return static::$oPhpExpressionEvaluator;
}
/**
* Return module names potentially required by current dependency
* @return array
@@ -107,10 +120,10 @@ class iTopCoreModuleDependency {
$bResult=false;
$sBooleanExpr = str_replace(array_keys($aReplacements), array_values($aReplacements), $this->sDepString);
$bOk = @eval('$bResult = '.$sBooleanExpr.'; return true;');
if ($bOk == false)
{
SetupLog::Warning("Eval of '$sBooleanExpr' returned false");
try{
$bResult = self::GetPhpExpressionEvaluator()->ParseAndEvaluateBooleanExpression($sBooleanExpr);
} catch(ModuleFileReaderException $e){
//logged already
echo "Failed to parse the boolean Expression = '$sBooleanExpr'<br/>";
}
return $bResult;

View File

@@ -85,12 +85,7 @@ class iTopCoreModule {
$this->aOngoingDependencies=$aNextDependencies;
if ($bDependenciesSolved)
{
return true;
}
return false;
return $bDependenciesSolved;
}
/**

View File

@@ -35,7 +35,7 @@ class iTopCoreModuleDependencySort {
*
* @return void
*/
public function SortModulesByCountOfDepencenciesDescending(array &$aUnresolvedDependencyModules) : void
public static function SortModulesByCountOfDepencenciesDescending(array &$aUnresolvedDependencyModules) : void
{
$aCountDepsByModuleId=[];
$aDependsOnModuleName=[];
@@ -125,7 +125,7 @@ class iTopCoreModuleDependencySort {
* @return array
* @throws \MissingDependencyException
*/
public function OrderModulesByDependencies($aModules, $bAbortOnMissingDependency = false, $aModulesToLoad = null, ?int &$iLoopCount=0)
public static function OrderModulesByDependencies($aModules, $bAbortOnMissingDependency = false, $aModulesToLoad = null, ?int &$iLoopCount=0)
{
$iLoopCount=0;

View File

@@ -97,6 +97,7 @@ class ModuleDiscovery
protected static $m_sModulePath = null;
private static PhpExpressionEvaluator $oPhpExpressionEvaluator;
private static mixed $bNewFeedback = false;
protected static function SetModulePath($sModulePath)
{
@@ -186,7 +187,7 @@ class ModuleDiscovery
$sDir = dirname($sFilePath);
$aDirs = [
$sDir => self::$m_sModulePath,
$sDir.'/dictionaries' => self::$m_sModulePath.'/dictionaries'
$sDir.'/dictionaries' => self::$m_sModulePath.'/dictionaries',
];
foreach ($aDirs as $sRootDir => $sPath)
{
@@ -221,6 +222,9 @@ class ModuleDiscovery
return self::OrderModulesByDependencies(self::$m_aModules, $bAbortOnMissingDependency, $aModulesToLoad);
}
public static function UseNewUiFeedback($bNewFeedback){
self::$bNewFeedback=$bNewFeedback;
}
/**
* Arrange an list of modules, based on their (inter) dependencies
* @param array $aModules The list of modules to process: 'id' => $aModuleInfo
@@ -246,7 +250,7 @@ class ModuleDiscovery
ksort($aDependencies);
$aOrderedModules = [];
$iLoopCount = 1;
while(($iLoopCount < count($aModules)) && (count($aDependencies) > 0) )
while(($iLoopCount < count($aModules)+1) && (count($aDependencies) > 0) )
{
foreach($aDependencies as $sId => $aRemainingDeps)
{
@@ -268,6 +272,10 @@ class ModuleDiscovery
}
if ($bAbortOnMissingDependency && count($aDependencies) > 0)
{
if (self::$bNewFeedback){
iTopCoreModuleDependencySort::OrderModulesByDependencies($aModules, $bAbortOnMissingDependency, $aModulesToLoad);
}
$aModulesInfo = [];
$aModuleDeps = [];
foreach($aDependencies as $sId => $aDeps)