Example #1
0
 /**
  * @param Model $model
  * @param string $mode
  * @param array $internalSystemIds
  * @param array $highlights
  *
  * @return Graph
  */
 public function generate(Model $model, $mode = self::MODE_ALL, array $internalSystemIds = [], array $highlights = [])
 {
     $elementsNodes = [];
     $requiredElementsIds = [];
     $connections = [];
     $graph = Graph::create('model');
     // add internal systems with container view
     foreach ($model->getInternalSystems() as $internalSystem) {
         if (self::MODE_SELECTIVE === $mode && !in_array($internalSystem->getId(), $internalSystemIds)) {
             continue;
         }
         $internalSystemGraph = $this->createInternalSystemGraph($internalSystem);
         $graph->addGraph($internalSystemGraph);
         foreach ($internalSystem->getContainers() as $container) {
             $highlight = false;
             if (in_array($container->getId(), $highlights)) {
                 $highlight = true;
             }
             $containerNode = $this->createContainerNode($container, $highlight);
             $elementsNodes[$container->getId()] = $containerNode;
             $internalSystemGraph->setNode($containerNode);
             foreach ($container->getUsages() as $usage) {
                 $connections[$container->getId()][$usage->getTarget()->getId()][] = $usage;
             }
         }
     }
     // collect connections from external systems
     foreach ($model->getExternalSystems() as $externalSystem) {
         foreach ($externalSystem->getUsages() as $usage) {
             if (in_array($usage->getTarget()->getId(), array_keys($elementsNodes))) {
                 $connections[$externalSystem->getId()][$usage->getTarget()->getId()][] = $usage;
             }
         }
     }
     // collect connections from internal systems
     foreach ($model->getInternalSystems() as $internalSystem) {
         foreach ($internalSystem->getContainers() as $container) {
             if (in_array($container->getId(), array_keys($elementsNodes))) {
                 continue;
             }
             foreach ($container->getUsages() as $usage) {
                 if (in_array($usage->getTarget()->getId(), array_keys($elementsNodes))) {
                     $connections[$container->getId()][$usage->getTarget()->getId()][] = $usage;
                 }
             }
         }
     }
     // collect connections from external users
     foreach ($model->getExternalUsers() as $externalUser) {
         foreach ($externalUser->getUsages() as $usage) {
             if (in_array($usage->getTarget()->getId(), array_keys($elementsNodes))) {
                 $connections[$externalUser->getId()][$usage->getTarget()->getId()][] = $usage;
             }
         }
     }
     // collect connections from internal users
     foreach ($model->getInternalUsers() as $internalUser) {
         foreach ($internalUser->getUsages() as $usage) {
             if (in_array($usage->getTarget()->getId(), array_keys($elementsNodes))) {
                 $connections[$internalUser->getId()][$usage->getTarget()->getId()][] = $usage;
             }
         }
     }
     // summarise required elements
     foreach ($connections as $elementId => $usages) {
         $requiredElementsIds = array_merge($requiredElementsIds, [$elementId], array_keys($usages));
     }
     // add nodes for internal users
     foreach ($model->getInternalUsers() as $internalUser) {
         if (in_array($internalUser->getId(), $requiredElementsIds)) {
             $highlight = false;
             if (in_array($internalUser->getId(), $highlights)) {
                 $highlight = true;
             }
             $internalUserNode = $this->createInternalUserNode($internalUser, $highlight);
             $graph->setNode($internalUserNode);
             $elementsNodes[$internalUser->getId()] = $internalUserNode;
         }
     }
     // add nodes for external users
     foreach ($model->getExternalUsers() as $externalUser) {
         if (in_array($externalUser->getId(), $requiredElementsIds)) {
             $highlight = false;
             if (in_array($externalUser->getId(), $highlights)) {
                 $highlight = true;
             }
             $externalUserNode = $this->createExternalUserNode($externalUser, $highlight);
             $graph->setNode($externalUserNode);
             $elementsNodes[$externalUser->getId()] = $externalUserNode;
         }
     }
     // add nodes for external systems
     foreach ($model->getExternalSystems() as $externalSystem) {
         if (in_array($externalSystem->getId(), $requiredElementsIds)) {
             $highlight = false;
             if (in_array($externalSystem->getId(), $highlights)) {
                 $highlight = true;
             }
             $externalSystemNode = $this->createExternalSystemNode($externalSystem, $highlight);
             $graph->setNode($externalSystemNode);
             $elementsNodes[$externalSystem->getId()] = $externalSystemNode;
         }
     }
     // add nodes for internal systems
     foreach ($model->getInternalSystems() as $internalSystem) {
         $createInternalSystemNode = null;
         $highlight = false;
         foreach ($internalSystem->getContainers() as $container) {
             if (in_array($container->getId(), array_keys($elementsNodes))) {
                 continue;
             }
             if (in_array($container->getId(), $requiredElementsIds)) {
                 $createInternalSystemNode = true;
                 if (in_array($container->getId(), $highlights)) {
                     $highlight = true;
                 }
             }
             if (true === $createInternalSystemNode) {
                 $internalSystemNode = $this->createInternalSystemNode($internalSystem, $highlight);
                 $graph->setNode($internalSystemNode);
                 $elementsNodes[$container->getId()] = $internalSystemNode;
             }
         }
     }
     // create edges
     foreach ($connections as $sourceElementId => $targetElements) {
         foreach ($targetElements as $targetElementId => $usages) {
             $highlight = false;
             if (in_array($sourceElementId, $highlights) || in_array($targetElementId, $highlights)) {
                 $highlight = true;
             }
             $edge = $this->createConnectionEdge($elementsNodes[$sourceElementId], $elementsNodes[$targetElementId], $usages, $highlight);
             $graph->link($edge);
         }
     }
     return $graph;
 }