123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\MessageQueue\Topology\Config\Xml;
- use Magento\Framework\Stdlib\BooleanUtils;
- use Magento\Framework\Data\Argument\InterpreterInterface;
- use Magento\Framework\Config\Converter\Dom\Flat as FlatConverter;
- use Magento\Framework\Config\Dom\ArrayNodeConfig;
- use Magento\Framework\Config\Dom\NodePathMatcher;
- use Magento\Framework\MessageQueue\DefaultValueProvider;
- /**
- * Converts MessageQueue topology config from \DOMDocument to array
- */
- class Converter implements \Magento\Framework\Config\ConverterInterface
- {
- /**
- * @var FlatConverter
- */
- private $converter;
- /**
- * Boolean value converter.
- *
- * @var BooleanUtils
- */
- private $booleanUtils;
- /**
- * Argument interpreter.
- *
- * @var InterpreterInterface
- */
- private $argumentInterpreter;
- /**
- * @var DefaultValueProvider
- */
- private $defaultValue;
- /**
- * Initialize dependencies.
- *
- * @param BooleanUtils $booleanUtils
- * @param InterpreterInterface $argumentInterpreter
- * @param DefaultValueProvider $defaultValueProvider
- */
- public function __construct(
- BooleanUtils $booleanUtils,
- InterpreterInterface $argumentInterpreter,
- DefaultValueProvider $defaultValueProvider
- ) {
- $this->booleanUtils = $booleanUtils;
- $this->argumentInterpreter = $argumentInterpreter;
- $this->defaultValue = $defaultValueProvider;
- }
- /**
- * {@inheritdoc}
- */
- public function convert($source)
- {
- $result = [];
- /** @var $exchange \DOMElement */
- foreach ($source->getElementsByTagName('exchange') as $exchange) {
- $name = $this->getAttributeValue($exchange, 'name');
- $connection = $this->getAttributeValue($exchange, 'connection');
- $bindings = [];
- $exchangeArguments = [];
- /** @var \DOMNode $node */
- foreach ($exchange->childNodes as $node) {
- if (!in_array($node->nodeName, ['binding', 'arguments']) || $node->nodeType != XML_ELEMENT_NODE) {
- continue;
- }
- switch ($node->nodeName) {
- case 'binding':
- $bindings = $this->processBindings($node, $bindings);
- break;
- case 'arguments':
- $exchangeArguments = $this->processArguments($node);
- break;
- }
- }
- $autoDelete = $this->getAttributeValue($exchange, 'autoDelete', false);
- $result[$name . '--' . $connection] = [
- 'name' => $name,
- 'type' => $this->getAttributeValue($exchange, 'type'),
- 'connection' => $connection,
- 'durable' => $this->booleanUtils->toBoolean($this->getAttributeValue($exchange, 'durable', true)),
- 'autoDelete' => $this->booleanUtils->toBoolean($autoDelete),
- 'internal' => $this->booleanUtils->toBoolean($this->getAttributeValue($exchange, 'internal', false)),
- 'bindings' => $bindings,
- 'arguments' => $exchangeArguments,
- ];
- }
- return $result;
- }
- /**
- * Retrieve instance of XML converter
- *
- * @return FlatConverter
- */
- private function getConverter()
- {
- if (!$this->converter) {
- $arrayNodeConfig = new ArrayNodeConfig(new NodePathMatcher(), ['argument(/item)+' => 'name']);
- $this->converter = new FlatConverter($arrayNodeConfig);
- }
- return $this->converter;
- }
- /**
- * Process arguments.
- *
- * @param \DOMNode $node
- * @return array
- */
- private function processArguments(\DOMNode $node)
- {
- $output = [];
- /** @var \DOMNode $argumentNode */
- foreach ($node->childNodes as $argumentNode) {
- if ($argumentNode->nodeType != XML_ELEMENT_NODE || $argumentNode->nodeName != 'argument') {
- continue;
- }
- $argumentName = $argumentNode->attributes->getNamedItem('name')->nodeValue;
- $argumentData = $this->getConverter()->convert($argumentNode, 'argument');
- $output[$argumentName] = $this->argumentInterpreter->evaluate($argumentData);
- }
- return $output;
- }
- /**
- * Get attribute value of the given node
- *
- * @param \DOMNode $node
- * @param string $attributeName
- * @param mixed $default
- * @return string|null
- */
- private function getAttributeValue(\DOMNode $node, $attributeName, $default = null)
- {
- $item = $node->attributes->getNamedItem($attributeName);
- return $item ? $item->nodeValue : $default;
- }
- /**
- * Parse bindings.
- *
- * @param \DOMNode $node
- * @param array $bindings
- * @return array
- */
- private function processBindings($node, $bindings)
- {
- $bindingArguments = [];
- $id = $this->getAttributeValue($node, 'id');
- $isDisabled = $this->booleanUtils->toBoolean(
- $this->getAttributeValue($node, 'disabled', false)
- );
- foreach ($node->childNodes as $arguments) {
- if ($arguments->nodeName != 'arguments' || $arguments->nodeType != XML_ELEMENT_NODE) {
- continue;
- }
- $bindingArguments = $this->processArguments($arguments);
- }
- $bindings[$id] = [
- 'id' => $id,
- 'destinationType' => $this->getAttributeValue($node, 'destinationType'),
- 'destination' => $this->getAttributeValue($node, 'destination'),
- 'disabled' => $isDisabled,
- 'topic' => $this->getAttributeValue($node, 'topic'),
- 'arguments' => $bindingArguments
- ];
- return $bindings;
- }
- }
|