Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
5 / 5
CRAP
100.00% covered (success)
100.00%
28 / 28
DefaultDataModelValidator
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
5 / 5
10
100.00% covered (success)
100.00%
28 / 28
 validate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
5 / 5
 error
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 validateTableNamesUnique
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
8 / 8
 validateClassNamesUnique
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
8 / 8
 checkDuplicate
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
5 / 5
<?php
declare(strict_types = 1);
namespace Siesta\Validator;
use Siesta\Contract\DataModelValidator;
use Siesta\Model\DataModel;
use Siesta\Model\ValidationLogger;
use Siesta\Util\ArrayUtil;
/**
 * @author Gregor Müller
 */
class DefaultDataModelValidator implements DataModelValidator
{
    const ERROR_DUPLICATE_TABLE_NAME = "Table '%s' is used more than once.";
    const ERROR_DUPLICATE_TABLE_NAME_CODE = 1000;
    const ERROR_DUPLICATE_CLASS_NAME = "Class '%s' is used more than once.";
    const ERROR_DUPLICATE_CLASS_NAME_CODE = 1001;
    /**
     * @var DataModel
     */
    protected $datamodel;
    /**
     * @var ValidationLogger
     */
    protected $logger;
    /**
     * @param DataModel $dataModel
     * @param ValidationLogger $logger
     */
    public function validate(DataModel $dataModel, ValidationLogger $logger)
    {
        $this->datamodel = $dataModel;
        $this->logger = $logger;
        $this->validateTableNamesUnique();
        $this->validateClassNamesUnique();
    }
    /**
     * @param string $text
     * @param int $code
     */
    protected function error(string $text, int $code)
    {
        $this->logger->error($text, $code);
    }
    /**
     *
     */
    protected function validateTableNamesUnique()
    {
        $nameList = [];
        $duplicateNameList = [];
        foreach ($this->datamodel->getEntityList() as $entity) {
            $this->checkDuplicate($nameList, $duplicateNameList, $entity->getTableName());
        }
        foreach ($duplicateNameList as $duplicateName) {
            $error = sprintf(self::ERROR_DUPLICATE_TABLE_NAME, $duplicateName);
            $this->error($error, self::ERROR_DUPLICATE_TABLE_NAME_CODE);
        }
    }
    /**
     *
     */
    protected function validateClassNamesUnique()
    {
        $nameList = [];
        $duplicateNameList = [];
        foreach ($this->datamodel->getEntityList() as $entity) {
            $this->checkDuplicate($nameList, $duplicateNameList, $entity->getClassName());
        }
        foreach ($duplicateNameList as $duplicateName) {
            $error = sprintf(self::ERROR_DUPLICATE_CLASS_NAME, $duplicateName);
            $this->error($error, self::ERROR_DUPLICATE_CLASS_NAME_CODE);
        }
    }
    /**
     * @param array $nameList
     * @param array $duplicateNameList
     * @param $name
     */
    protected function checkDuplicate(array &$nameList, array &$duplicateNameList, $name)
    {
        $existing = ArrayUtil::getFromArray($nameList, $name);
        if ($existing) {
            $duplicateNameList[] = $name;
        }
        $nameList[$name] = true;
    }
}