Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
47 / 47
Extractor
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
6 / 6
9
100.00% covered (success)
100.00%
47 / 47
 __construct( ReaderInterface $reader, LoggerInterface $logger )
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 extract($object)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 processExtraction($object)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
13 / 13
 adaptException(\Exception $exception)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
10 / 10
 checkClass($class)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
9 / 9
 logExtractedResult(ExtractorResult $extractorResult, $object)
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
8 / 8
<?php
/**
 * @author Krzysztof Gzocha <krzysztof.gzocha@xsolve.pl>
 */
namespace Team3\PayU\PropertyExtractor;
use Psr\Log\LoggerInterface;
use ReflectionClass;
use ReflectionException;
use Team3\PayU\PropertyExtractor\Reader\ReaderInterface;
/**
 * {@inheritdoc}
 *
 * Class Extractor
 * @package Team3\PayU\PropertyExtractor
 */
class Extractor implements ExtractorInterface
{
    /**
     * @var ReaderInterface
     */
    protected $reader;
    /**
     * @var LoggerInterface
     */
    protected $logger;
    /**
     * @param ReaderInterface $reader
     * @param LoggerInterface $logger
     */
    public function __construct(
        ReaderInterface $reader,
        LoggerInterface $logger
    ) {
        $this->reader = $reader;
        $this->logger = $logger;
    }
    /**
     * @param object $object
     *
     * @return ExtractorResult[]
     * @throws ExtractorException
     */
    public function extract($object)
    {
        $this->checkClass($object);
        try {
            return $this->processExtraction($object);
        } catch (ReflectionException $exception) {
            throw $this->adaptException($exception);
        }
    }
    /**
     * @param $object
     *
     * @return ExtractorResult[]
     */
    private function processExtraction($object)
    {
        $extracted = [];
        $reflectionClass = new ReflectionClass($object);
        foreach ($this->reader->read($object) as $readerResult) {
            $reflectionMethod = $reflectionClass->getMethod($readerResult->getMethodName());
            $reflectionMethod->setAccessible(true);
            $extractorResult = new ExtractorResult(
                $readerResult->getPropertyName(),
                $reflectionMethod->invoke($object)
            );
            $extracted[] = $extractorResult;
            $this->logExtractedResult($extractorResult, $object);
        }
        return $extracted;
    }
    /**
     * @param \Exception $exception
     *
     * @return ExtractorException
     */
    private function adaptException(\Exception $exception)
    {
        $this
            ->logger
            ->error(sprintf(
                'Exception %s was throw during extracting properties. Message: "%s"',
                get_class($exception),
                $exception->getMessage()
            ));
        return new ExtractorException(
            $exception->getMessage(),
            $exception->getCode(),
            $exception
        );
    }
    /**
     * @param $class
     *
     * @throws ExtractorException
     */
    private function checkClass($class)
    {
        if (!is_object($class)) {
            $message = sprintf(
                'Given argument should be on object, but "%s" given',
                gettype($class)
            );
            $this
                ->logger
                ->error($message);
            throw new ExtractorException($message);
        }
    }
    /**
     * @param ExtractorResult $extractorResult
     * @param object          $object
     */
    private function logExtractedResult(ExtractorResult $extractorResult, $object)
    {
        $this
            ->logger
            ->debug(sprintf(
                'Successfully extracted parameter %s with value "%s" from object %s',
                $extractorResult->getPropertyName(),
                print_r($extractorResult->getValue(), true),
                get_class($object)
            ));
    }
}