Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
269 changes: 94 additions & 175 deletions src/Classes/Controllers/IndexController.php

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions src/Classes/DependencyManager/CombinationSatisfyer.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public function satisfiesCominationsFromModuleTrees(

foreach ($combinations as $testCombination) {
$foundCombination = new Combination();
$result = $this->satisfiesCominationFromModuleTrees(
$result = $this->satisfiesCombinationFromModuleTrees(
$moduleTrees,
$testCombination,
$foundCombination,
Expand Down Expand Up @@ -85,7 +85,7 @@ public function satisfiesCominationsFromModuleTree(
$failLog = new FailLog();

foreach ($combinations as $testCombination) {
$result = $this->satisfiesCominationFromModuleTree(
$result = $this->satisfiesCombinationFromModuleTree(
$moduleTree,
$testCombination,
$foundCombination,
Expand Down Expand Up @@ -113,15 +113,15 @@ public function satisfiesCominationsFromModuleTree(
return $combinationSatisfyerResult;
}

public function satisfiesCominationsFromModuleWithIterator(
public function satisfiesCombinationsFromModuleWithIterator(
ModuleTree $moduleTree,
CombinationIterator $combinationIterator
): CombinationSatisfyerResult {
while (true) {
$foundCombination = new Combination();
$failLog = new FailLog();
$testCombination = $combinationIterator->current();
$result = $this->satisfiesCominationFromModuleTree(
$result = $this->satisfiesCombinationFromModuleTree(
$moduleTree,
$testCombination,
$foundCombination,
Expand Down Expand Up @@ -160,7 +160,7 @@ public function satisfiesCominationsFromModuleWithIterator(
*
* @return bool
*/
public function satisfiesCominationFromModuleTree(
public function satisfiesCombinationFromModuleTree(
ModuleTree $moduleTree,
Combination $combination,
Combination &$foundCombination,
Expand Down Expand Up @@ -198,7 +198,7 @@ public function satisfiesCominationFromModuleTree(
$moduleTree->versionConstraint
);

return $this->satisfiesCominationFromModuleTrees(
return $this->satisfiesCombinationFromModuleTrees(
$moduleVersion->require,
$combination,
$foundCombination,
Expand All @@ -222,7 +222,7 @@ public function satisfiesCominationFromModuleTree(
*
* @return bool
*/
public function satisfiesCominationFromModuleTrees(
public function satisfiesCombinationFromModuleTrees(
array $moduleTrees,
Combination $combination,
Combination &$foundCombination,
Expand All @@ -232,7 +232,7 @@ public function satisfiesCominationFromModuleTrees(
// Context: Expanded
$moduleResult = true;
foreach ($moduleTrees as $moduleTree) {
$result = $this->satisfiesCominationFromModuleTree(
$result = $this->satisfiesCombinationFromModuleTree(
$moduleTree,
$combination,
$foundCombination,
Expand Down
15 changes: 13 additions & 2 deletions src/Classes/DependencyManager/CombinationSatisfyerResult.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@

namespace RobinTheHood\ModifiedModuleLoaderClient\DependencyManager;

/**
* Das CombinationSatisfyerResult Objekt liefert Information zum Ergebnis des CombinationStisfyer.
*/
class CombinationSatisfyerResult
{
public const RESULT_COMBINATION_NOT_FOUND = 0;
Expand All @@ -21,10 +24,18 @@ class CombinationSatisfyerResult
/** @var int */
public $result = -1;

/** @var ?Combination */
/**
* @var ?Combination $testCombination Beinhaltet eine Kombination an allen Modulen und PHP, MMLC und modified
* Versionen die durch ein SystemSet als Auswahl standen. Welche Kombination verwendet wird hängt vom
* CombinationStisfyer ab. Oft ist es die letzte Kombination die probiert wurde.
*/
public $testCombination = null;

/** @var ?Combination */
/**
* @var ?Combination $foundCombination Enthält nur die Elemente (Module, PHP, MMLC und modified Version) aus
* $testCombination die nötig sind, um die Voraussetung für ein Modul zu erfüllen. Ist das Ergbnis
* RESULT_COMBINATION_NOT_FOUND, fehlen in $foundCombination Elemente.
*/
public $foundCombination = null;

/** @var ?FailLog */
Expand Down
193 changes: 87 additions & 106 deletions src/Classes/DependencyManager/DependencyBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
use RobinTheHood\ModifiedModuleLoaderClient\Config;
use RobinTheHood\ModifiedModuleLoaderClient\Loader\ModuleLoader;
use RobinTheHood\ModifiedModuleLoaderClient\Module;
use RobinTheHood\ModifiedModuleLoaderClient\Semver\Comparator;
use RobinTheHood\ModifiedModuleLoaderClient\Semver\Constraint;

class DependencyBuilder
Expand All @@ -40,60 +39,104 @@ public function __construct(ModuleTreeBuilder $moduleTreeBuilder, ModuleLoader $
$this->moduleLoader = $moduleLoader;
}

private function logFile($value, $file)
/**
* Testet, ob alle Bedingungen für ein Modul erfüllt sind. Als Ergbnis gibt die Methode ein
* CombinationSatisfyerResult zurück. Als $constraint kann eine konkrete Version oder ein Constraint wie z. B.
* ^1.0.0 angegeben werden. Die Methode versucht eine Kombination mit den neusten Versionen zu finden. Wenn eine
* Kombination gefunden wurde, befindet sich diese in CombinationSatisfyerResult::foundCombination. Das Modul auf
* das mit $archiveName getestet wurde befindet sich ebenfalls in CombinationSatisfyerResult::foundCombination
*
* @param string $archiveName
* @param string $constraint
* @param SystemSet $systemSet Mit $systemSet kann festgelegt werden, welche Module bereits installiert sind,
* welche PHP, MMLC und modified Version vorhanden ist.
*
* @return CombinationSatisfyerResult
*/
public function satisfies(string $archiveName, string $constraint, SystemSet $systemSet): CombinationSatisfyerResult
{
if (!Config::getLogging()) {
return;
$systemSet->remove($archiveName);
$constraint = $this->createConstraint($archiveName, $constraint, $systemSet);

$moduleTree = $this->moduleTreeBuilder->buildByConstraints($archiveName, $constraint);
$this->logFile($moduleTree, '3-moduleTrees.json');

$flatEntryBuilder = new FlatEntryBuilder();
$flatEntries = $flatEntryBuilder->buildListFromModuleTree($moduleTree);
$this->logFile($flatEntries, '3-flatEntries.json');

$flatEntries = $flatEntryBuilder->fitSystemSet($flatEntries, $systemSet);
$this->logFile($flatEntries, '3-flatEntries-fit.json');

$combinationIterator = new CombinationIterator($flatEntries);
$combinationSatisfyer = new CombinationSatisfyer();
$combinationSatisfyerResult = $combinationSatisfyer->satisfiesCombinationsFromModuleWithIterator(
$moduleTree,
$combinationIterator
);

return $combinationSatisfyerResult;
}

/**
* Gehe alle Module durch, die in $systemSet sind und gleichzeitig das Modul $archiveName benötigen.
* Gibt ein $constraint zurück, sodass die Anforderungenden der Module in $systemSet erhaltenbleiben.
*/
private function createConstraint(string $archiveName, string $constraint, SystemSet $systemSet): string
{
/** @var string[] */
$requiredConstraints = [$constraint];

$archives = $systemSet->getArchives();
foreach ($archives as $archiveNameB => $version) {
$installedModule = $this->getModuleByArchiveNameAndVersion($archiveNameB, $version);
if (!$installedModule) {
continue;
}

$requiredConstraint = $this->getRequiredConstraint($installedModule, $archiveName);
if (!$requiredConstraint) {
continue;
}

$requiredConstraints[] = $requiredConstraint;
}

$logsRootPath = App::getLogsRoot();
$constraint = Constraint::createConstraintFromConstraints($requiredConstraints);

@mkdir($logsRootPath);
@mkdir($logsRootPath . '/debug');
@mkdir($logsRootPath . '/debug/DependencyMananger/');
$path = $logsRootPath . '/debug/DependencyMananger/' . $file;
file_put_contents($path, json_encode($value, JSON_PRETTY_PRINT));
return $constraint;
}

public function log($var)
private function getModuleByArchiveNameAndVersion(string $archiveName, string $version): ?Module
{
print_r($var);
return $this->moduleLoader->loadByArchiveNameAndVersion($archiveName, $version);
}

public function test()
private function getRequiredConstraint(Module $installedModule, string $archiveName): string
{
$moduleLoader = ModuleLoader::create(Comparator::CARET_MODE_STRICT);
$module = $moduleLoader->loadLatestVersionByArchiveName('firstweb/multi-order');
$required = $installedModule->getRequire();
return $required[$archiveName] ?? '';
}

if (!$module) {
die('Can not find base module');
private function logFile($value, $file)
{
if (!Config::getLogging()) {
return;
}

$systemSet = new SystemSet();
$systemSet->set([
"modified" => '2.0.4.2',
"php" => '7.4.0',
"mmlc" => '1.19.0',
"composer/autoload" => '1.3.0',
"robinthehood/modified-std-module" => '0.9.0',
"robinthehood/modified-orm" => '1.8.1',
"robinthehood/pdf-bill" => '0.17.0'
]);

$this->log('TEST: satisfiesContraints1');
$combinationSatisfyerResult = $this->satisfiesContraints1($module, $systemSet);
$this->log($combinationSatisfyerResult);

$this->log('TEST: satisfiesContraints2');
$combinationSatisfyerResult = $this->satisfiesContraints2('firstweb/multi-order', '^1.0.0', $systemSet);
$this->log($combinationSatisfyerResult);

// var_dump('TEST: satisfiesContraints3');
$combinationSatisfyerResult = $this->satisfies('firstweb/multi-order', '^1.0.0', $systemSet);
$this->log($combinationSatisfyerResult);
$logsRootPath = App::getLogsRoot();

@mkdir($logsRootPath);
@mkdir($logsRootPath . '/debug');
@mkdir($logsRootPath . '/debug/DependencyMananger/');
$path = $logsRootPath . '/debug/DependencyMananger/' . $file;
file_put_contents($path, json_encode($value, JSON_PRETTY_PRINT));
}

public function satisfiesContraints1(Module $module, SystemSet $systemSet): CombinationSatisfyerResult
/**
* Diese Methode wird zurzeit nicht verwednet und wurde deswegen auf private gestellt.
*/
private function satisfiesContraints1(Module $module, SystemSet $systemSet): CombinationSatisfyerResult
{
$moduleTrees = $this->moduleTreeBuilder->buildListByConstraints($module);
$this->logFile($moduleTrees, '1-moduleTrees.json');
Expand All @@ -118,8 +161,10 @@ public function satisfiesContraints1(Module $module, SystemSet $systemSet): Comb
return $combinationSatisfyerResult;
}


public function satisfiesContraints2(
/**
* Diese Methode wird zurzeit nicht verwednet und wurde deswegen auf private gestellt.
*/
private function satisfiesContraints2(
string $archiveName,
string $constraint,
SystemSet $systemSet
Expand All @@ -146,68 +191,4 @@ public function satisfiesContraints2(

return $combinationSatisfyerResult;
}

public function satisfies(string $archiveName, string $constraint, SystemSet $systemSet): CombinationSatisfyerResult
{
$systemSet->remove($archiveName);
$constraint = $this->createConstraint($archiveName, $constraint, $systemSet);

$moduleTree = $this->moduleTreeBuilder->buildByConstraints($archiveName, $constraint);
$this->logFile($moduleTree, '3-moduleTrees.json');

$flatEntryBuilder = new FlatEntryBuilder();
$flatEntries = $flatEntryBuilder->buildListFromModuleTree($moduleTree);
$this->logFile($flatEntries, '3-flatEntries.json');

$flatEntries = $flatEntryBuilder->fitSystemSet($flatEntries, $systemSet);
$this->logFile($flatEntries, '3-flatEntries-fit.json');

$combinationIterator = new CombinationIterator($flatEntries);
$combinationSatisfyer = new CombinationSatisfyer();
$combinationSatisfyerResult = $combinationSatisfyer->satisfiesCominationsFromModuleWithIterator(
$moduleTree,
$combinationIterator
);
return $combinationSatisfyerResult;
}

/**
* Gehe alle Module durch, die in $systemSet sind und das gleichzeitig Modul $archiveName benötigen.
* Gibt ein $constraint zurück, sodass die Anforderungenden der Module in $systemSet erhaltenbleiben.
*/
private function createConstraint(string $archiveName, string $constraint, SystemSet $systemSet): string
{
/** @var string[] */
$requiredConstraints = [$constraint];

$archives = $systemSet->getArchives();
foreach ($archives as $archiveNameB => $version) {
$installedModule = $this->getModuleByArchiveNameAndVersion($archiveNameB, $version);
if (!$installedModule) {
continue;
}

$requiredConstraint = $this->getRequiredConstraint($installedModule, $archiveName);
if (!$requiredConstraint) {
continue;
}

$requiredConstraints[] = $requiredConstraint;
}

$constraint = Constraint::createConstraintFromConstraints($requiredConstraints);

return $constraint;
}

private function getModuleByArchiveNameAndVersion(string $archiveName, string $version): ?Module
{
return $this->moduleLoader->loadByArchiveNameAndVersion($archiveName, $version);
}

private function getRequiredConstraint(Module $installedModule, string $archiveName): string
{
$required = $installedModule->getRequire();
return $required[$archiveName] ?? '';
}
}
Loading