Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00%
0 / 1
50.00%
1 / 2
CRAP
90.10%
91 / 101
XmlConfigReader
0.00%
0 / 1
50.00%
1 / 2
26.66
90.10%
91 / 101
 getConfigData($location)
0.00%
0 / 1
25.62
90.00%
90 / 100
 getDocument()
100.00%
1 / 1
1
100.00%
1 / 1
<?php
namespace Environaut\Config\Reader;
use Environaut\Config\Reader\IConfigReader;
/**
 * Reads configuration data from XML formatters.
 */
class XmlConfigReader implements IConfigReader
{
    /**
     * @var Environaut\Config\Reader\Dom\DomDocument
     */
    protected $doc;
    /**
     * Reads the config from the given location and
     * returns the data as an associative array.
     *
     * @param mixed $location location to read config data from (usually file/directory path)
     *
     * @return array config data as associative array
     *
     * @throws \InvalidArgumentException in case of problems handling the given location
     * @throws \DomException in case of schema validation errors
     */
    public function getConfigData($location)
    {
        if (is_dir($location)) {
            $location = $location . DIRECTORY_SEPARATOR . 'environaut.xml';
        }
        $this->doc = $doc = new Dom\DomDocument();
        $doc->load($location, LIBXML_NOCDATA);
        $doc->xinclude(LIBXML_NOCDATA);
        $doc->schemaValidate(__DIR__ . '/Schema/environaut.xsd');
        $config_data = array();
        $value = $doc->getElementValue('name');
        if (null !== $value) {
            $config_data['name'] = $value;
        }
        $value = $doc->getElementValue('description');
        if (null !== $value) {
            $config_data['description'] = $value;
        }
        $value = $doc->getElementValue('introduction');
        if (null !== $value) {
            $config_data['introduction'] = $value;
        }
        $keywords_element = $doc->getElement('keywords');
        if (null !== $keywords_element) {
            $keywords = array();
            foreach ($keywords_element->getChildren('keyword') as $keyword) {
                $keywords[] = (string) $keyword;
            }
            if (!empty($keywords)) {
                $config_data['keywords'] = $keywords;
            }
        }
        $element = $doc->getElement('cache');
        if (null !== $element) {
            $config_data['cache'] = $element->getParameters();
            $value = $element->getAttributeValue('class');
            if (null !== $value) {
                $config_data['cache']['__class'] = $value;
            }
        }
        $element = $doc->getElement('report');
        if (null !== $element) {
            $config_data['report'] = $element->getParameters();
            $value = $element->getAttributeValue('class');
            if (null !== $value) {
                $config_data['report']['__class'] = $value;
            }
        }
        $element = $doc->getElement('runner');
        if (null !== $element) {
            $config_data['runner'] = $element->getParameters();
            $value = $element->getAttributeValue('class');
            if (null !== $value) {
                $config_data['runner']['__class'] = $value;
            }
        }
        $element = $doc->getElement('export');
        if (null !== $element) {
            $config_data['export'] = $element->getParameters();
            $formatter_nodes = $element->get('formatters');
            $formatters = array();
            foreach ($formatter_nodes as $formatter_node) {
                $attributes = $formatter_node->getAttributes();
                foreach ($attributes as $name => $value) {
                    if ($name === 'class') {
                        $attributes['__class'] = $value;
                    }
                }
                unset($attributes['class']);
                $parameters = $formatter_node->getParameters();
                $formatters[] = array_merge($parameters, $attributes);
            }
            $config_data['export']['formatters'] = $formatters;
            $value = $element->getAttributeValue('class');
            if (null !== $value) {
                $config_data['export']['__class'] = $value;
            }
        }
        $element = $doc->getElement('checks');
        if (null !== $element) {
            $checks = array();
            $check_nodes = $element->get('check');
            foreach ($check_nodes as $check) {
                $attributes = $check->getAttributes();
                foreach ($attributes as $name => $value) {
                    if ($name === 'class') {
                        $attributes['__class'] = $value;
                    } elseif ($name === 'name') {
                        $attributes['__name'] = $value;
                    } elseif ($name === 'group') {
                        $attributes['__group'] = $value;
                    }
                }
                unset($attributes['class']);
                unset($attributes['name']);
                unset($attributes['group']);
                $parameters = $check->getParameters();
                $checks[] = array_merge($parameters, $attributes);
            }
            $config_data['checks'] = $checks;
        }
        return $config_data;
    }
    /**
     * Returns the DomDocument instance that was used for reading the config file.
     *
     * @return Environaut\Config\Reader\Dom\DomDocument or null
     */
    public function getDocument()
    {
        return $this->doc;
    }
}