<?php
namespace WebServiceCollectionBundle\Subscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use WebServiceCollectionBundle\Event\WebserviceRequestEvent;
use WebServiceCollectionBundle\Logger\WebServiceLogger;
use WebServiceCollectionBundle\Manager\ResponseParser;
use WebServiceCollectionBundle\Request\SoapRequest;
use WebServiceCollectionBundle\WebserviceEvents;
/**
* Class ParserSubscriber.
*
* @author Christophe Pyree <chpyr@smile.fr>
*/
class ParseResponseSubscriber implements EventSubscriberInterface
{
/**
* @var WebServiceLogger
*/
private $webServiceLogger;
/**
* @var ResponseParser
*/
private $parserManager;
/**
* ParseResponseSubscriber constructor.
*
* @param ResponseParser $parserManager
* @param WebServiceLogger $webServiceLogger
*/
public function __construct(ResponseParser $parserManager, WebServiceLogger $webServiceLogger)
{
$this->parserManager = $parserManager;
$this->webServiceLogger = $webServiceLogger;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
WebserviceEvents::REQUEST_NORMALIZE => ['normalizeOnPostSend', 1024],
];
}
private $webServiceResponseClassMap = [];
/**
* @param $serviceClass
* @param $info
*
* @return $this
*/
public function addMappingInfo($serviceClass, $info)
{
$this->webServiceResponseClassMap[$serviceClass] = $info;
return $this;
}
/**
* @param WebserviceRequestEvent $webserviceEvent
*/
public function normalizeOnPostSend(WebserviceRequestEvent $webserviceEvent)
{
$context = [];
$context['request'] = $webserviceEvent->getRequest();
$context['operation'] = $webserviceEvent->getRequest()->getUrl();
// $this->webServiceLogger->info(sprintf('%s postsend', $webserviceEvent->getRequest()->getRequesterClass()));
$targetClass = $this->classMap(
$webserviceEvent->getRequest()->getRequesterClass(),
$webserviceEvent->getRequest()->getUrl()
);
if (!$targetClass) {
$this->webServiceLogger->info(
sprintf('Target class for parsing \'%s\' is not specified from Request object', $webserviceEvent->getRequest()->getRequesterClass()),
[$webserviceEvent->getRequest()]
);
return;
}
$format = $this->getFormat($webserviceEvent);
$responseInterfaceObject = $this->parserManager->parse($webserviceEvent->getRawResponse(), $targetClass, $format, $context);
$webserviceEvent->setParsedResponse($responseInterfaceObject);
}
/**
* @param WebserviceRequestEvent $webserviceEvent
*
* @return string
*/
protected function getFormat(WebserviceRequestEvent $webserviceEvent)
{
$format = 'json';
if ($webserviceEvent->getRequest() instanceof SoapRequest) {
$format = 'soap';
}
return $format;
}
/**
* @param $requesterClass
* @param null $urlOrOperation
*
* @return mixed|string
*/
private function classMap($requesterClass, $urlOrOperation = null)
{
if (!isset($this->webServiceResponseClassMap[$requesterClass])) {
return '';
}
$responseClass = (array) $this->webServiceResponseClassMap[$requesterClass];
if ($urlOrOperation && \is_array($responseClass) && isset($responseClass[$urlOrOperation])) {
return $responseClass[$urlOrOperation];
}
return array_shift($responseClass);
}
/**
* @param $object
*
* @return string
*/
public function getBuildType($object)
{
if (\is_array($object)) {
return 'array';
}
if (\is_object($object)) {
return \get_class($object);
}
}
}