diff --git a/Command/EntitySchemaCommand.php b/Command/EntitySchemaCommand.php index 2e86adf347863fd6749dd4753a9c6b01de03c238..e290e0a5e9e1c903242cdd30c645bae9314231ae 100644 --- a/Command/EntitySchemaCommand.php +++ b/Command/EntitySchemaCommand.php @@ -8,6 +8,7 @@ namespace Irstea\PlantUmlBundle\Command; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Mapping\ClassMetadata; +use Irstea\PlantUmlBundle\Model\Filter\Whitelist; use Irstea\PlantUmlBundle\Model\Namespace_; use Irstea\PlantUmlBundle\Model\Orm\EntityVisitor; use Irstea\PlantUmlBundle\Writer\OutputWriter; @@ -46,11 +47,13 @@ class EntitySchemaCommand extends ContainerAwareCommand $allMetadata = $factory->getAllMetadata(); + $classes = array_map( + function(ClassMetadata $metadata) { return $metadata->getName(); }, + $allMetadata + ); + $visitor = new EntityVisitor($allMetadata); - foreach($allMetadata as $metadata) { - /* @var $metadata ClassMetadata */ - $visitor->visitClass($metadata->getName()); - } + array_walk($classes, [$visitor, 'visitClass']); $writer = new OutputWriter($output); $writer->write("@startuml\n"); diff --git a/Model/ClassFilterInterface.php b/Model/ClassFilterInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..6c8ac88b073d525f4739bf60f608cf3766966cb4 --- /dev/null +++ b/Model/ClassFilterInterface.php @@ -0,0 +1,22 @@ +<?php + +/* + * © 2016 IRSTEA + * Guillaume Perréal <guillaume.perreal@irstea.fr> + * Tous droits réservés. + */ + +namespace Irstea\PlantUmlBundle\Model; + +/** + * + * @author Guillaume Perréal <guillaume.perreal@irstea.fr> + */ +interface ClassFilterInterface +{ + /** + * @param type $className + * @return bool + */ + public function accept($className); +} diff --git a/Model/ClassVisitor.php b/Model/ClassVisitor.php index f3017f588de2b748adad95f2b4bc3bbdc4704d0c..ae2e925a4d15e0913fbf27336b3105e834c1cdc0 100644 --- a/Model/ClassVisitor.php +++ b/Model/ClassVisitor.php @@ -28,9 +28,25 @@ class ClassVisitor implements ClassVisitorInterface, WritableInterface */ protected $rootNamespace; - public function __construct() + /** + * @var ClassFilterInterface + */ + protected $filter; + + public function __construct(ClassFilterInterface $filter = null) { $this->rootNamespace = new RootNamespace(); + $this->filter = $filter ?: Filter\AcceptAllFilter::instance(); + } + + /** + * @param \Irstea\PlantUmlBundle\Model\ClassFilterInterface $filter + * @return self + */ + public function setClassFilter(ClassFilterInterface $filter) + { + $this->filter = $filter; + return $this; } public function visitClass($className) @@ -39,6 +55,9 @@ class ClassVisitor implements ClassVisitorInterface, WritableInterface if (isset($this->nodes[$className])) { return $this->nodes[$className]; } + if (!$this->filter->accept($className)) { + return $this->nodes[$className] = false; + } return $this->doVisitClass($className); } @@ -104,7 +123,9 @@ class ClassVisitor implements ClassVisitorInterface, WritableInterface { foreach ($classNames as $className) { $target = $this->visitClass($className); - $namespace->addArrow(new $relationClass($source, $target)); + if ($target) { + $namespace->addArrow(new $relationClass($source, $target)); + } } } diff --git a/Model/Filter/AcceptAllFilter.php b/Model/Filter/AcceptAllFilter.php new file mode 100644 index 0000000000000000000000000000000000000000..287052de9556c791a80d93c087b0b0d0dedccd86 --- /dev/null +++ b/Model/Filter/AcceptAllFilter.php @@ -0,0 +1,40 @@ +<?php + +/* + * © 2016 IRSTEA + * Guillaume Perréal <guillaume.perreal@irstea.fr> + * Tous droits réservés. + */ + +namespace Irstea\PlantUmlBundle\Model\Filter; + +use Irstea\PlantUmlBundle\Model\ClassFilterInterface; + +/** + * Description of AcceptAllFilter + * + * @author Guillaume Perréal <guillaume.perreal@irstea.fr> + */ +class AcceptAllFilter implements ClassFilterInterface +{ + public function accept($className) + { + return true; + } + + /** + * @var self + */ + static private $instance; + + /** + * @return self + */ + static public function instance() + { + if (!static::$instance) { + static::$instance = new static(); + } + return static::$instance; + } +} diff --git a/Model/Filter/Whitelist.php b/Model/Filter/Whitelist.php new file mode 100644 index 0000000000000000000000000000000000000000..ecbd66381a5bb119778b987bd1c95a08aa6cdfca --- /dev/null +++ b/Model/Filter/Whitelist.php @@ -0,0 +1,34 @@ +<?php + +/* + * © 2016 IRSTEA + * Guillaume Perréal <guillaume.perreal@irstea.fr> + * Tous droits réservés. + */ + +namespace Irstea\PlantUmlBundle\Model\Filter; + +use Irstea\PlantUmlBundle\Model\ClassFilterInterface; + +/** + * Description of Whiltelist + * + * @author Guillaume Perréal <guillaume.perreal@irstea.fr> + */ +class Whitelist implements ClassFilterInterface +{ + /** + * @var string[] + */ + private $accepted; + + public function __construct(array $classNames) + { + $this->accepted = array_fill_keys($classNames, true); + } + + public function accept($className) + { + return isset($this->accepted[$className]); + } +} diff --git a/Model/Orm/EntityVisitor.php b/Model/Orm/EntityVisitor.php index 9830995a04d1067ae39bd56550a4bc53dfa496e1..48342e1104d742281cd6348f137601c56879f9df 100644 --- a/Model/Orm/EntityVisitor.php +++ b/Model/Orm/EntityVisitor.php @@ -23,9 +23,9 @@ class EntityVisitor extends ClassVisitor */ protected $metadata = []; - public function __construct(array $metadata) + public function __construct(array $metadata, \Irstea\PlantUmlBundle\Model\ClassFilterInterface $filter = null) { - parent::__construct(); + parent::__construct($filter); foreach($metadata as $md) { /* @var $md ClassMetadata */