mirror of
https://github.com/kevinveenbirkenbach/infinito.git
synced 2024-12-04 23:17:19 +01:00
Optimized dom management
This commit is contained in:
parent
0b50b1df9a
commit
be9e22577c
@ -4,6 +4,8 @@ namespace Infinito\Attribut;
|
||||
|
||||
/**
|
||||
* @author kevinfrantz
|
||||
*
|
||||
* @see GrantAttributInterface
|
||||
*/
|
||||
trait GrantAttribut
|
||||
{
|
||||
@ -12,11 +14,17 @@ trait GrantAttribut
|
||||
*/
|
||||
protected $grant;
|
||||
|
||||
/**
|
||||
* @param bool $grant
|
||||
*/
|
||||
public function setGrant(bool $grant): void
|
||||
{
|
||||
$this->grant = $grant;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function getGrant(): bool
|
||||
{
|
||||
return $this->grant;
|
||||
|
@ -7,7 +7,18 @@ namespace Infinito\Attribut;
|
||||
*/
|
||||
interface GrantAttributInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
const GRANT_ATTRIBUT_NAME = 'grant';
|
||||
|
||||
/**
|
||||
* @param bool $grant
|
||||
*/
|
||||
public function setGrant(bool $grant): void;
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function getGrant(): bool;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
namespace Infinito\Attribut;
|
||||
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Infinito\Entity\Meta\RightInterface;
|
||||
|
||||
/**
|
||||
* @author kevinfrantz
|
||||
@ -16,11 +17,17 @@ trait RightsAttribut
|
||||
*/
|
||||
protected $rights;
|
||||
|
||||
/**
|
||||
* @param Collection|RightInterface[] $rights
|
||||
*/
|
||||
public function setRights(Collection $rights): void
|
||||
{
|
||||
$this->rights = $rights;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection|RightInterface[]
|
||||
*/
|
||||
public function getRights(): Collection
|
||||
{
|
||||
return $this->rights;
|
||||
|
@ -10,6 +10,9 @@ use Infinito\Entity\Meta\RightInterface;
|
||||
*/
|
||||
interface RightsAttributInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
const RIGHTS_ATTRIBUT_NAME = 'rights';
|
||||
|
||||
/**
|
||||
|
@ -6,6 +6,8 @@ use Infinito\Entity\Source\SourceInterface;
|
||||
|
||||
/**
|
||||
* @author kevinfrantz
|
||||
*
|
||||
* @see SourceAttributInterface
|
||||
*/
|
||||
trait SourceAttribut
|
||||
{
|
||||
@ -14,11 +16,17 @@ trait SourceAttribut
|
||||
*/
|
||||
protected $source;
|
||||
|
||||
/**
|
||||
* @return SourceInterface
|
||||
*/
|
||||
public function getSource(): SourceInterface
|
||||
{
|
||||
return $this->source;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param SourceInterface $source
|
||||
*/
|
||||
public function setSource(SourceInterface $source): void
|
||||
{
|
||||
$this->source = $source;
|
||||
|
@ -9,7 +9,18 @@ use Infinito\Entity\Source\SourceInterface;
|
||||
*/
|
||||
interface SourceAttributInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
const SOURCE_ATTRIBUT_NAME = 'source';
|
||||
|
||||
/**
|
||||
* @return SourceInterface
|
||||
*/
|
||||
public function getSource(): SourceInterface;
|
||||
|
||||
/**
|
||||
* @param SourceInterface $source
|
||||
*/
|
||||
public function setSource(SourceInterface $source): void;
|
||||
}
|
||||
|
@ -3,12 +3,12 @@
|
||||
namespace Infinito\Domain\DomManagement;
|
||||
|
||||
use Infinito\Entity\EntityInterface;
|
||||
use Infinito\Domain\LayerManagement\LayerClassMap;
|
||||
use Infinito\Domain\RightManagement\RightTransformerService;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Infinito\Domain\RequestManagement\Entity\RequestedEntityServiceInterface;
|
||||
use Infinito\Exception\NotCorrectInstanceException;
|
||||
use Infinito\DBAL\Types\Meta\Right\LayerType;
|
||||
use Infinito\Domain\LayerManagement\LayerInterfaceMap;
|
||||
|
||||
/**
|
||||
* This class is not ready and not tested!
|
||||
@ -112,13 +112,13 @@ final class EntityDomService implements EntityDomServiceInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value
|
||||
* @param \DOMElement $domElement
|
||||
* @param mixed|EntityInterface $value
|
||||
* @param \DOMElement $domElement
|
||||
*/
|
||||
private function mappValue($value, \DOMElement $domElement): void
|
||||
{
|
||||
foreach (LayerClassMap::LAYER_CLASS_MAP as $layer => $class) {
|
||||
if ($value instanceof $class) {
|
||||
foreach (LayerInterfaceMap::getAllInterfaces() as $layer => $interface) {
|
||||
if ($value instanceof $interface) {
|
||||
$domElement->setAttribute('layer', $layer);
|
||||
$domElement->setAttribute('id', $value->getId());
|
||||
$domElement->setAttribute('name', LayerType::getReadableValue($layer));
|
||||
@ -129,6 +129,7 @@ final class EntityDomService implements EntityDomServiceInterface
|
||||
if (is_object($value)) {
|
||||
throw new NotCorrectInstanceException('The instance '.get_class($value).' is not supported!');
|
||||
}
|
||||
$domElement->setAttribute('type', gettype($value));
|
||||
$domElement->setAttribute('value', $value);
|
||||
|
||||
return;
|
||||
@ -176,7 +177,7 @@ final class EntityDomService implements EntityDomServiceInterface
|
||||
$value = $this->getPropertyValue($propertyName);
|
||||
if ($value instanceof Collection) {
|
||||
foreach ($value as $valueElement) {
|
||||
$domSubElement = $domElement->createElement('list-element');
|
||||
$domSubElement = $this->domDocument->createElement('list-element');
|
||||
$domElement->setAttribute('name', $propertyName);
|
||||
$this->mappValue($valueElement, $domSubElement);
|
||||
$domElement->appendChild($domSubElement);
|
||||
|
@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
namespace Infinito\Domain\LayerManagement;
|
||||
|
||||
use Infinito\DBAL\Types\Meta\Right\LayerType;
|
||||
|
||||
/**
|
||||
* @author kevinfrantz
|
||||
*
|
||||
* @todo for performance reasons it could be helpfull to implement lazy loading in the future
|
||||
*/
|
||||
final class LayerInterfaceMap implements LayerInterfaceMapInterface
|
||||
{
|
||||
/**
|
||||
* @var string The abstract class prefix, which will be removed from the interface name
|
||||
*/
|
||||
const ABSTRACT_CLASS_PREFIX = 'Abstract';
|
||||
|
||||
/**
|
||||
* @var string The suffix which will be added to the interface name
|
||||
*/
|
||||
const INTERFACE_SUFFIX = 'Interface';
|
||||
|
||||
/**
|
||||
* @param string $shortClass
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function filterAbstractClassName(string $shortClass): string
|
||||
{
|
||||
if (self::ABSTRACT_CLASS_PREFIX === substr($shortClass, 0, strlen(self::ABSTRACT_CLASS_PREFIX))) {
|
||||
return substr($shortClass, strlen(self::ABSTRACT_CLASS_PREFIX));
|
||||
}
|
||||
|
||||
return $shortClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $class
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function addInterfaceSuffix(string $class): string
|
||||
{
|
||||
return $class.self::INTERFACE_SUFFIX;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $layer
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getInterface(string $layer): string
|
||||
{
|
||||
$className = LayerClassMap::getClass($layer);
|
||||
$elements = explode('\\', $className);
|
||||
$shortClass = $elements[count($elements) - 1];
|
||||
$filteredAbstractClass = self::filterAbstractClassName($shortClass);
|
||||
$elements[count($elements) - 1] = self::addInterfaceSuffix($filteredAbstractClass);
|
||||
$interfaceName = implode('\\', $elements);
|
||||
|
||||
return $interfaceName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public static function getAllInterfaces(): array
|
||||
{
|
||||
$allInterfaces = [];
|
||||
foreach (LayerType::getValues() as $layer) {
|
||||
$allInterfaces[$layer] = self::getInterface($layer);
|
||||
}
|
||||
|
||||
return $allInterfaces;
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Infinito\Domain\LayerManagement;
|
||||
|
||||
/**
|
||||
* @author kevinfrantz
|
||||
*/
|
||||
interface LayerInterfaceMapInterface
|
||||
{
|
||||
/**
|
||||
* @return array|string[] All layer interfaces
|
||||
*/
|
||||
public static function getAllInterfaces(): array;
|
||||
|
||||
/**
|
||||
* @param string $layer
|
||||
*
|
||||
* @return string The interface which belongs to an Layer
|
||||
*/
|
||||
public static function getInterface(string $layer): string;
|
||||
}
|
@ -5,7 +5,6 @@ namespace Infinito\Entity\Meta;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Infinito\Attribut\RightsAttribut;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Infinito\Attribut\RelationAttribut;
|
||||
use Infinito\Entity\Source\SourceInterface;
|
||||
use Infinito\Attribut\GrantAttribut;
|
||||
|
||||
@ -16,7 +15,7 @@ use Infinito\Attribut\GrantAttribut;
|
||||
*/
|
||||
class Law extends AbstractMeta implements LawInterface
|
||||
{
|
||||
use RightsAttribut, RelationAttribut, GrantAttribut;
|
||||
use RightsAttribut, GrantAttribut;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="boolean",name="`grant`")
|
||||
|
@ -14,7 +14,7 @@
|
||||
{% if id and layer %}
|
||||
<a href="{{ path('infinito_api_rest_layer_read',{'identity':id,'layer':layer,'_format':'html'}) }}">
|
||||
<i class="fas fa-link"></i>
|
||||
{% if id == content %}#{% endif %}{{ content }}
|
||||
#{{ id }}
|
||||
</a>
|
||||
{% else %}
|
||||
{{ content }}
|
||||
|
@ -11,6 +11,16 @@ use Infinito\Attribut\SlugAttributInterface;
|
||||
use Infinito\Attribut\IdAttributInterface;
|
||||
use Infinito\DBAL\Types\Meta\Right\LayerType;
|
||||
use Infinito\Attribut\VersionAttributInterface;
|
||||
use Infinito\Entity\Meta\Law;
|
||||
use Infinito\Entity\Source\SourceInterface;
|
||||
use Infinito\Entity\Meta\RightInterface;
|
||||
use Infinito\Attribut\SourceAttributInterface;
|
||||
use Infinito\Attribut\GrantAttributInterface;
|
||||
use Infinito\Attribut\RightsAttributInterface;
|
||||
use Infinito\Entity\EntityInterface;
|
||||
use Infinito\Attribut\VersionAttribut;
|
||||
use Infinito\Attribut\IdAttribut;
|
||||
use Infinito\Exception\NotCorrectInstanceException;
|
||||
|
||||
/**
|
||||
* @author kevinfrantz
|
||||
@ -33,6 +43,29 @@ class EntityDomServiceTest extends TestCase
|
||||
$this->entityDomService = new EntityDomService($this->requestedEntityService);
|
||||
}
|
||||
|
||||
public function testNotCorrectInstanceException(): void
|
||||
{
|
||||
$entity = new class() implements EntityInterface {
|
||||
use VersionAttribut,IdAttribut;
|
||||
private $test;
|
||||
|
||||
public function setTest($test): void
|
||||
{
|
||||
$this->test = $test;
|
||||
}
|
||||
|
||||
public function getTest()
|
||||
{
|
||||
return $this->test;
|
||||
}
|
||||
};
|
||||
$entity->setTest(new class() {
|
||||
});
|
||||
$this->requestedEntityService->method('getEntity')->willReturn($entity);
|
||||
$this->expectException(NotCorrectInstanceException::class);
|
||||
$this->entityDomService->getDomDocument();
|
||||
}
|
||||
|
||||
public function testAbstractSource(): void
|
||||
{
|
||||
$slug = 'test';
|
||||
@ -66,4 +99,56 @@ class EntityDomServiceTest extends TestCase
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function testLaw(): void
|
||||
{
|
||||
$source = $this->createMock(SourceInterface::class);
|
||||
$source->method('getId')->willReturn(123);
|
||||
$source->method('hasId')->willReturn(true);
|
||||
$right = $this->createMock(RightInterface::class);
|
||||
$right->method('getId')->willReturn(124);
|
||||
$right->method('hasId')->willReturn(true);
|
||||
$id = 12345;
|
||||
$law = new Law();
|
||||
$law->setId($id);
|
||||
$law->setSource($source);
|
||||
$law->getRights()->add($right);
|
||||
$law->getRights()->add(clone $right);
|
||||
$law->getRights()->add(clone $right);
|
||||
$this->requestedEntityService->method('getEntity')->willReturn($law);
|
||||
$result = $this->entityDomService->getDomDocument();
|
||||
foreach ($result->childNodes as $attribut) {
|
||||
$name = $attribut->getAttribute('name');
|
||||
$value = $attribut->getAttribute('value');
|
||||
$id = $attribut->getAttribute('id');
|
||||
$layer = $attribut->getAttribute('layer');
|
||||
$type = $attribut->getAttribute('type');
|
||||
switch ($name) {
|
||||
case IdAttributInterface::ID_ATTRIBUT_NAME:
|
||||
$this->assertGreaterThan(0, $value);
|
||||
break;
|
||||
case VersionAttributInterface::VERSION_ATTRIBUT_NAME:
|
||||
$this->assertGreaterThan(-1, $value);
|
||||
break;
|
||||
case SourceAttributInterface::SOURCE_ATTRIBUT_NAME:
|
||||
$this->assertGreaterThan(0, $id);
|
||||
$this->assertEquals(LayerType::SOURCE, $layer);
|
||||
break;
|
||||
case GrantAttributInterface::GRANT_ATTRIBUT_NAME:
|
||||
$this->assertEquals('', $value);
|
||||
$this->assertEquals('boolean', $type);
|
||||
break;
|
||||
case RightsAttributInterface::RIGHTS_ATTRIBUT_NAME:
|
||||
$rights = $attribut->childNodes;
|
||||
$this->assertCount(3, $rights);
|
||||
foreach ($rights as $rightAttribut) {
|
||||
$this->assertEquals(LayerType::RIGHT, $rightAttribut->getAttribute('layer'));
|
||||
$this->assertGreaterThan(0, $rightAttribut->getAttribute('id'));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new \Exception("No assert was defined for attribut with name <<$name>>!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace tests\Unit\Domain\LayerManagement;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Infinito\Domain\LayerManagement\LayerInterfaceMap;
|
||||
|
||||
/**
|
||||
* @author kevinfrantz
|
||||
*/
|
||||
class LayerInterfaceMapTest extends TestCase
|
||||
{
|
||||
public function testIfInterfaceForEachLayerExist(): void
|
||||
{
|
||||
foreach (LayerInterfaceMap::getAllInterfaces() as $interface) {
|
||||
$this->assertTrue(interface_exists($interface));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user