/** * Return services loaded from cache if enabled or from files merged previously * * @return array */ public function getServices() { if (null === $this->services) { $services = $this->cache->load(self::CACHE_ID); if ($services && is_string($services)) { $this->services = unserialize($services); } else { $this->services = $this->configReader->read(); $this->cache->save(serialize($this->services), self::CACHE_ID); } } return $this->services; }
/** * Generate WSDL file based on requested services (uses cache) * * @param array $requestedServices * @param string $endPointUrl * @return string * @throws \Exception */ public function generate($requestedServices, $endPointUrl) { /** Sort requested services by names to prevent caching of the same wsdl file more than once. */ ksort($requestedServices); $currentStore = $this->storeManager->getStore(); $cacheId = self::WSDL_CACHE_ID . hash('md5', serialize($requestedServices) . $currentStore->getCode()); $cachedWsdlContent = $this->_cache->load($cacheId); if ($cachedWsdlContent !== false) { return $cachedWsdlContent; } $services = []; foreach ($requestedServices as $serviceName) { $services[$serviceName] = $this->_apiConfig->getServiceMetadata($serviceName); } $wsdlContent = $this->_generate($services, $endPointUrl); $this->_cache->save($wsdlContent, $cacheId, [\Magento\Framework\App\Cache\Type\Webapi::CACHE_TAG]); return $wsdlContent; }
protected function setUp() { $this->_soapConfigMock = $this->getMockBuilder('Magento\\Webapi\\Model\\Soap\\Config')->disableOriginalConstructor()->getMock(); $_wsdlMock = $this->getMockBuilder('Magento\\Webapi\\Model\\Soap\\Wsdl')->disableOriginalConstructor()->setMethods(['addSchemaTypeSection', 'addService', 'addPortType', 'addBinding', 'addSoapBinding', 'addElement', 'addComplexType', 'addMessage', 'addPortOperation', 'addBindingOperation', 'addSoapOperation', 'toXML'])->getMock(); $this->_wsdlFactoryMock = $this->getMockBuilder('Magento\\Webapi\\Model\\Soap\\WsdlFactory')->setMethods(['create'])->disableOriginalConstructor()->getMock(); $this->_wsdlFactoryMock->expects($this->any())->method('create')->will($this->returnValue($_wsdlMock)); $this->_cacheMock = $this->getMockBuilder('Magento\\Framework\\App\\Cache\\Type\\Webapi')->disableOriginalConstructor()->getMock(); $this->_cacheMock->expects($this->any())->method('load')->will($this->returnValue(false)); $this->_cacheMock->expects($this->any())->method('save')->will($this->returnValue(true)); $this->_typeProcessor = $this->getMock('Magento\\Framework\\Reflection\\TypeProcessor', [], [], '', false); $this->storeManagerMock = $this->getMockBuilder('Magento\\Store\\Model\\StoreManagerInterface')->setMethods(['getStore'])->disableOriginalConstructor()->getMockForAbstractClass(); $storeMock = $this->getMockBuilder('Magento\\Store\\Model\\Store')->setMethods(['getCode', '__wakeup'])->disableOriginalConstructor()->getMock(); $this->storeManagerMock->expects($this->any())->method('getStore')->will($this->returnValue($storeMock)); $storeMock->expects($this->any())->method('getCode')->will($this->returnValue('store_code')); $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->customAttributeTypeLocator = $objectManager->getObject('Magento\\Eav\\Model\\EavCustomAttributeTypeLocator'); $this->_wsdlGenerator = $objectManager->getObject('Magento\\Webapi\\Model\\Soap\\Wsdl\\Generator', ['apiConfig' => $this->_soapConfigMock, 'wsdlFactory' => $this->_wsdlFactoryMock, 'cache' => $this->_cacheMock, 'typeProcessor' => $this->_typeProcessor, 'storeManagerMock' => $this->storeManagerMock, 'customAttributeTypeLocator' => $this->customAttributeTypeLocator]); parent::setUp(); }
/** * Generate schema based on requested services (uses cache) * * @param array $requestedServices * @param string $requestScheme * @param string $requestHost * @param string $endPointUrl * @return string */ public function generate($requestedServices, $requestScheme, $requestHost, $endPointUrl) { /** Sort requested services by names to prevent caching of the same schema file more than once. */ ksort($requestedServices); $currentStore = $this->storeManager->getStore(); $cacheId = get_class($this) . hash('md5', serialize($requestedServices) . $currentStore->getCode()); $cachedSchemaContent = $this->cache->load($cacheId); if ($cachedSchemaContent !== false) { return $cachedSchemaContent; } $requestedServiceMetadata = []; foreach ($requestedServices as $serviceName) { $requestedServiceMetadata[$serviceName] = $this->getServiceMetadata($serviceName); } $this->collectCallInfo($requestedServiceMetadata); $schemaContent = $this->generateSchema($requestedServiceMetadata, $requestScheme, $requestHost, $endPointUrl); $this->cache->save($schemaContent, $cacheId, [Webapi::CACHE_TAG]); return $schemaContent; }
protected function setUp() { $this->serviceMetadataMock = $this->getMockBuilder('Magento\\Webapi\\Model\\ServiceMetadata')->disableOriginalConstructor()->getMock(); $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $swagger = $this->objectManager->getObject('Magento\\Webapi\\Model\\Rest\\Swagger'); $this->swaggerFactoryMock = $this->getMockBuilder('Magento\\Webapi\\Model\\Rest\\SwaggerFactory')->setMethods(['create'])->disableOriginalConstructor()->getMock(); $this->swaggerFactoryMock->expects($this->any())->method('create')->will($this->returnValue($swagger)); $this->cacheMock = $this->getMockBuilder('Magento\\Framework\\App\\Cache\\Type\\Webapi')->disableOriginalConstructor()->getMock(); $this->cacheMock->expects($this->any())->method('load')->will($this->returnValue(false)); $this->cacheMock->expects($this->any())->method('save')->will($this->returnValue(true)); $this->typeProcessorMock = $this->getMockBuilder('Magento\\Framework\\Reflection\\TypeProcessor')->disableOriginalConstructor()->getMock(); $this->typeProcessorMock->expects($this->any())->method('getOperationName')->will($this->returnValue(self::OPERATION_NAME)); $this->customAttributeTypeLocatorMock = $this->getMockBuilder('Magento\\Framework\\Webapi\\CustomAttributeTypeLocatorInterface')->disableOriginalConstructor()->getMock(); $this->customAttributeTypeLocatorMock->expects($this->any())->method('getAllServiceDataInterfaces')->willReturn(['$customAttributeClass']); $this->storeManagerMock = $this->getMockBuilder('Magento\\Store\\Model\\StoreManagerInterface')->setMethods(['getStore'])->disableOriginalConstructor()->getMockForAbstractClass(); $storeMock = $this->getMockBuilder('Magento\\Store\\Model\\Store')->disableOriginalConstructor()->getMock(); $this->storeManagerMock->expects($this->any())->method('getStore')->will($this->returnValue($storeMock)); $storeMock->expects($this->any())->method('getCode')->will($this->returnValue('store_code')); $this->generator = $this->objectManager->getObject('Magento\\Webapi\\Model\\Rest\\Swagger\\Generator', ['swaggerFactory' => $this->swaggerFactoryMock, 'cache' => $this->cacheMock, 'typeProcessor' => $this->typeProcessorMock, 'storeManager' => $this->storeManagerMock, 'serviceMetadata' => $this->serviceMetadataMock, 'customAttributeTypeLocator' => $this->customAttributeTypeLocatorMock]); }
/** * Return services loaded from cache if enabled or from files merged previously * * @return array */ protected function getSoapServicesConfig() { if (null === $this->soapServices) { $soapServicesConfig = $this->cache->load(self::CACHE_ID); if ($soapServicesConfig && is_string($soapServicesConfig)) { $this->soapServices = unserialize($soapServicesConfig); } else { $this->soapServices = $this->initServicesMetadata(); $this->cache->save(serialize($this->soapServices), self::CACHE_ID); } } return $this->soapServices; }
/** * Return routes loaded from cache if enabled or from files merged previously * * @return array */ public function getRoutesConfig() { if (null === $this->routes) { $routesConfig = $this->cache->load(self::ROUTES_CONFIG_CACHE_ID); $typesData = $this->cache->load(self::REFLECTED_TYPES_CACHE_ID); if ($routesConfig && is_string($routesConfig) && $typesData && is_string($typesData)) { $this->routes = unserialize($routesConfig); $this->typeProcessor->setTypesData(unserialize($typesData)); } else { $this->routes = $this->initRoutesMetadata(); $this->cache->save(serialize($this->routes), self::ROUTES_CONFIG_CACHE_ID); $this->cache->save(serialize($this->typeProcessor->getTypesData()), self::REFLECTED_TYPES_CACHE_ID); } } return $this->routes; }
/** * Retrieve requested service method params metadata. * * @param string $serviceClassName * @param string $serviceMethodName * @return array */ protected function getMethodParams($serviceClassName, $serviceMethodName) { $cacheId = self::CACHE_ID_PREFIX . hash('md5', $serviceClassName . $serviceMethodName); $params = $this->cache->load($cacheId); if ($params !== false) { return unserialize($params); } $serviceClass = new ClassReflection($serviceClassName); /** @var MethodReflection $serviceMethod */ $serviceMethod = $serviceClass->getMethod($serviceMethodName); $params = []; /** @var ParameterReflection $paramReflection */ foreach ($serviceMethod->getParameters() as $paramReflection) { $isDefaultValueAvailable = $paramReflection->isDefaultValueAvailable(); $params[] = ['name' => $paramReflection->getName(), 'type' => $this->typeProcessor->getParamType($paramReflection), 'isDefaultValueAvailable' => $isDefaultValueAvailable, 'defaultValue' => $isDefaultValueAvailable ? $paramReflection->getDefaultValue() : null]; } $this->cache->save(serialize($params), $cacheId, [WebapiCache::CACHE_TAG]); return $params; }