public function __construct($loggerClass, \FACTFinder\Core\ConfigurationInterface $configuration, \FACTFinder\Core\Client\RequestParser $requestParser, \FACTFinder\Core\AbstractEncodingConverter $encodingConverter = null) { $this->log = $loggerClass::getLogger(__CLASS__); $this->parametersConverter = FF::getInstance('Core\\ParametersConverter', $loggerClass, $configuration); $this->requestParser = $requestParser; $this->encodingConverter = $encodingConverter; }
private function createSuggestions() { $suggestions = array(); $this->useJsonResponseContentProcessor(); if (isset($this->parameters['format'])) { $oldFormat = $this->parameters['format']; } $this->parameters['format'] = 'json'; $suggestData = $this->getResponseContent(); if (!empty($suggestData)) { foreach ($suggestData as $suggestQueryData) { $suggestLink = $this->convertServerQueryToClientUrl($suggestQueryData['searchParams']); if (isset($suggestQueryData['attributes']) && is_array($suggestQueryData['attributes'])) { $suggestAttributes = $suggestQueryData['attributes']; } else { $suggestAttributes = array(); } $suggestions[] = FF::getInstance('Data\\SuggestQuery', $suggestQueryData['name'], $suggestLink, $suggestQueryData['hitCount'], $suggestQueryData['type'], $suggestQueryData['image'], $suggestQueryData['refKey'], $suggestAttributes); } } if (isset($oldFormat)) { $this->parameters['format'] = $oldFormat; } return $suggestions; }
public function testConstructionFromParameters() { $parameters = FF::getInstance('Util\\Parameters'); $parameters['query'] = 'bmx'; $parameters['seoPath'] = '/bmx-bike/q'; $parameters['channel'] = 'de'; $parameters['advisorStatus'] = '2-_0_0'; $parameters['productsPerPage'] = 12; $parameters['filterBrand'] = 'KHE'; $parameters['filterColor'] = 'green'; $parameters['sortPrice'] = 'asc'; $parameters['catalog'] = 'true'; $parameters['followSearch'] = '9832'; $searchParameters = FF::getInstance('Data\\SearchParameters', $parameters); $this->assertEquals('bmx', $searchParameters->getQuery()); $this->assertEquals('/bmx-bike/q', $searchParameters->getSeoPath()); $this->assertEquals('de', $searchParameters->getChannel()); $this->assertEquals('2-_0_0', $searchParameters->getAdvisorStatus()); $this->assertEquals(12, $searchParameters->getProductsPerPage()); $this->assertEquals(1, $searchParameters->getCurrentPage()); $this->assertEquals(9832, $searchParameters->getFollowSearch()); $this->assertEquals(array('Brand' => 'KHE', 'Color' => 'green'), $searchParameters->getFilters()); $this->assertEquals(array('Price' => 'asc'), $searchParameters->getSortings()); $this->assertTrue($searchParameters->isNavigationEnabled()); }
public function setUp() { parent::setUp(); $this->requestParser = FF::getInstance('Core\\Client\\RequestParser', self::$dic['loggerClass'], self::$dic['configuration'], self::$dic['encodingConverter']); $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); }
public function setUp() { parent::setUp(); $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); $this->adapter = FF::getInstance('Adapter\\Recommendation', self::$dic['loggerClass'], self::$dic['configuration'], self::$dic['request'], self::$dic['clientUrlBuilder']); }
public function loadResponse($id) { if (!isset($this->connectionData[$id])) { throw new \InvalidArgumentException('Tried to get response for invalid ID $id.'); } $connectionData = $this->connectionData[$id]; $action = $connectionData->getAction(); if (empty($action)) { $this->log->error('Request type missing.'); $connectionData->setNullResponse(); return; } $fileNamePrefix = $this->getFileNamePrefix($connectionData); $fileExtension = $this->getFileExtension($connectionData); $queryString = $this->getQueryString($connectionData); $fileName = $this->getFileName($fileNamePrefix, md5($queryString), $fileExtension); if (!$this->hasFileNameChanged($id, $fileName)) { return; } $this->log->info("Trying to load file: {$fileName}"); $fileContent = null; if (!($fileContent = @file_get_contents($fileName))) { throw new \Exception('File "' . $fileName . ' (original: ' . $fileNamePrefix . $queryString . $fileExtension . '" not found'); } $response = FF::getInstance('Core\\Server\\Response', $fileContent, 200, 0, ''); $connectionData->setResponse($response, $fileName); }
/** * Converts data from $inCharset to $outCharset. * @param mixed $data If a string is given, it's encoding will be converted. * If an associative array is given, keys and values will be * converted recursively. All other data types will be returned * unchanged. * @return mixed */ protected function convert($inCharset, $outCharset, $data) { if ($data instanceof Parameters) { if (count($data->getArray()) == 1 && current(array_keys($data->getArray())) == '') { $result = $data->getArray(); } else { $result = FF::getInstance('Util\\Parameters', $this->convert($inCharset, $outCharset, $data->getArray())); } } else { if (is_array($data)) { $result = array(); foreach ($data as $k => $v) { $k = $this->convert($inCharset, $outCharset, $k); $result[$k] = $this->convert($inCharset, $outCharset, $v); } } else { if (is_string($data)) { $result = $this->convertString($inCharset, $outCharset, $data); } else { $result = $data; } } } return $result; }
public function testServerToClientConversion() { $serverParameters = FF::getInstance('Util\\Parameters', array('query' => 'test', 'username' => 'admin', 'format' => 'xml', 'xml' => 'true', 'timestamp' => '123456789', 'password' => 'test', 'channel' => 'de', 'productsPerPage' => '12')); $expectedClientParameters = array('keywords' => 'test', 'productsPerPage' => '12'); $actualClientParameters = $this->parametersConverter->convertServerToClientParameters($serverParameters); $this->assertEquals($expectedClientParameters, $actualClientParameters->getArray()); }
public static function setUpBeforeClass() { $logClass = FF::getClassName('Util\\Log4PhpLogger'); $logClass::configure(RESOURCES_DIR . DS . 'log4php.xml'); // Set up dependency injection container (Pimple) self::$dic = FF::getInstance('Util\\Pimple'); self::$dic['loggerClass'] = $logClass; if (strpos(static::class, 'ArrayConfiguration')) { self::$dic['configuration'] = function ($c) { $config = (include RESOURCES_DIR . DS . 'config.php'); return FF::getInstance('Core\\ArrayConfiguration', $config, 'test'); }; } else { self::$dic['configuration'] = function ($c) { return FF::getInstance('Core\\XmlConfiguration', RESOURCES_DIR . DS . 'config.xml', 'test'); }; } // $this cannot be passed into closures before PHP 5.4 //$that = $this; self::$dic['encodingConverter'] = function ($c) { if (extension_loaded('iconv')) { $type = 'Core\\IConvEncodingConverter'; } else { if (function_exists('utf8_encode') && function_exists('utf8_decode')) { $type = 'Core\\Utf8EncodingConverter'; } else { return; } } //TODO: Skip test if no conversion method is available. // $that->markTestSkipped('No encoding conversion available.'); return FF::getInstance($type, $c['loggerClass'], $c['configuration']); }; self::$dic['serverUrlBuilder'] = function ($c) { return FF::getInstance('Core\\Server\\UrlBuilder', $c['loggerClass'], $c['configuration']); }; self::$dic['clientUrlBuilder'] = function ($c) { return FF::getInstance('Core\\Client\\UrlBuilder', $c['loggerClass'], $c['configuration'], $c['requestParser'], $c['encodingConverter']); }; self::$dic['curlStub'] = function ($c) { return FF::getInstance('Util\\CurlStub'); }; self::$dic['dataProvider'] = function ($c) { $dataProvider = FF::getInstance('Core\\Server\\FileSystemDataProvider', $c['loggerClass'], $c['configuration']); $dataProvider->setFileLocation(RESOURCES_DIR . DS . 'responses'); return $dataProvider; }; self::$dic['requestFactory'] = function ($c) { $requestFactory = FF::getInstance('Core\\Server\\FileSystemRequestFactory', $c['loggerClass'], $c['configuration'], $c['requestParser']->getRequestParameters()); $requestFactory->setFileLocation(RESOURCES_DIR . DS . 'responses'); return $requestFactory; }; self::$dic['request'] = self::$dic->factory(function ($c) { return $c['requestFactory']->getRequest(); }); self::$dic['requestParser'] = function ($c) { return FF::getInstance('Core\\Client\\RequestParser', $c['loggerClass'], $c['configuration'], $c['encodingConverter']); }; }
public function testResponse() { $response = FF::getInstance('Core\\Server\\NullResponse'); $this->assertEquals('', $response->getContent()); $this->assertEquals(0, $response->getHttpCode()); $this->assertEquals(0, $response->getConnectionErrorCode()); $this->assertEquals('', $response->getConnectionError()); }
public function testResponse() { $response = FF::getInstance('Core\\Server\\Response', 'response content', 200, CURLE_OK, 'CURLE_OK'); $this->assertEquals('response content', $response->getContent()); $this->assertEquals(200, $response->getHttpCode()); $this->assertEquals(CURLE_OK, $response->getConnectionErrorCode()); $this->assertEquals('CURLE_OK', $response->getConnectionError()); }
public function setUp() { parent::setUp(); $this->factory = FF::getInstance('Core\\Server\\FileSystemRequestFactory', self::$dic['loggerClass'], self::$dic['configuration'], FF::getInstance('Util\\Parameters')); $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); $this->configuration = self::$dic['configuration']; }
public function setUp() { parent::setUp(); // For the request parser to retrieve $_SERVER['REQUEST_URI'] = '/index.php'; $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); $this->adapter = FF::getInstance('Adapter\\TagCloud', self::$dic['loggerClass'], self::$dic['configuration'], self::$dic['request'], self::$dic['clientUrlBuilder']); }
public function setUp() { parent::setUp(); // For the request parser to retrieve $_SERVER['QUERY_STRING'] = 'event=cart&id=1&masterId=2&title=product&sid=mysid&cookieId=mycid&count=5&price=6&userId=7&query=query'; $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); $this->adapter = FF::getInstance('Adapter\\Tracking', self::$dic['loggerClass'], self::$dic['configuration'], self::$dic['request'], self::$dic['clientUrlBuilder']); }
public function setUp() { parent::setUp(); $this->urlBuilder = FF::getInstance('Core\\Server\\UrlBuilder', self::$dic['loggerClass'], self::$dic['configuration']); $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); $this->configuration = self::$dic['configuration']; $this->parameters = FF::getInstance('Util\\Parameters'); }
public function setUp() { parent::setUp(); // For the request parser to retrieve $_SERVER['QUERY_STRING'] = 'event=cart&id=1&price=4&count=3&sid=mysid&userid=5'; $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); $this->adapter = FF::getInstance('Adapter\\ScicTracking', self::$dic['loggerClass'], self::$dic['configuration'], self::$dic['request'], self::$dic['clientUrlBuilder']); }
public function setUp() { parent::setUp(); $this->curlStub = self::$dic['curlStub']; $this->factory = FF::getInstance('Core\\Server\\MultiCurlRequestFactory', self::$dic['loggerClass'], self::$dic['configuration'], FF::getInstance('Util\\Parameters', array('query' => 'bmx')), self::$dic['curlStub']); $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); $this->configuration = self::$dic['configuration']; }
public function setUp() { parent::setUp(); $dataProvider = FF::getInstance('Core\\Server\\FileSystemDataProvider', self::$dic['loggerClass'], self::$dic['configuration']); $dataProvider->setFileLocation(RESOURCES_DIR . DS . 'responses'); $this->request = FF::getInstance('Core\\Server\\Request', self::$dic['loggerClass'], FF::getInstance('Core\\Server\\ConnectionData'), $dataProvider); $loggerClass = self::$dic['loggerClass']; $this->log = $loggerClass::getLogger(__CLASS__); $this->configuration = self::$dic['configuration']; }
public function testSetResponse() { $response = FF::getInstance('Core\\Server\\Response', 'response content', 200, 0, CURLE_OK); $this->connectionData->setResponse($response, 'http://test.com'); $this->assertSame($response, $this->connectionData->getResponse()); $this->assertEquals('http://test.com', $this->connectionData->getPreviousUrl()); $this->connectionData->setNullResponse(); $response = $this->connectionData->getResponse(); $this->assertEquals('', $response->getContent()); $this->assertEquals(0, $response->getHttpCode()); $this->assertEquals(0, $response->getConnectionErrorCode()); $this->assertEquals('', $response->getConnectionError()); $this->assertNull($this->connectionData->getPreviousUrl()); }
private function createTagCloud($requestQuery = null) { $tagCloud = array(); $tagCloudData = $this->getResponseContent(); if (!empty($tagCloudData)) { foreach ($tagCloudData as $tagQueryData) { $query = $tagQueryData['query']; // TODO: Once JIRA issue FF-5328 is fixed, retrieve the // parameters from searchParams, like all other adapters // do. $parameters = FF::getInstance('Util\\Parameters'); $parameters['query'] = $query; $tagCloud[] = FF::getInstance('Data\\TagQuery', $query, $this->urlBuilder->generateUrl($parameters), $requestQuery == $query, $tagQueryData['weight'], $tagQueryData['searchCount']); } } return $tagCloud; }
public function testLoadResponse() { $this->dataProvider->setFileLocation(RESOURCES_DIR . DS . 'responses'); $this->configuration->makeHttpAuthenticationType(); $connectionData = FF::getInstance('Core\\Server\\ConnectionData'); $id = $this->dataProvider->register($connectionData); $parameters = $connectionData->getParameters(); $parameters['format'] = 'json'; $parameters['do'] = 'getTagCloud'; $connectionData->setAction('TagCloud.ff'); $this->dataProvider->loadResponse($id); $response = $connectionData->getResponse(); $expectedContent = file_get_contents(RESOURCES_DIR . DS . 'responses' . DS . 'TagCloud.86b6b33590e092674009abfe3d7fc170.json'); $this->assertEquals(0, $response->getConnectionErrorCode()); $this->assertEquals('', $response->getConnectionError()); $this->assertEquals(200, $response->getHttpCode()); $this->assertEquals($expectedContent, $response->getContent()); }
public function loadResponse($id) { if (!isset($this->connectionData[$id])) { throw new \InvalidArgumentException('Tried to get response for invalid ID $id.'); } $connectionData = $this->connectionData[$id]; $action = $connectionData->getAction(); if (empty($action)) { $this->log->error('Request type missing.'); $connectionData->setNullResponse(); return; } $fileName = $this->getFileName($connectionData); if (!$this->hasFileNameChanged($id, $fileName)) { return; } $this->log->info("Trying to load file: {$fileName}"); $response = FF::getInstance('Core\\Server\\Response', file_get_contents($fileName), 200, 0, ''); $connectionData->setResponse($response, $fileName); }
public function testLoadResponse() { $this->configuration->makeHttpAuthenticationType(); $requiredOptions = array(CURLOPT_URL => 'http://*****:*****@demoshop.fact-finder.de:80/FACT-Finder/TagCloud.ff?format=json&do=getTagCloud&verbose=true&channel=de'); $responseContent = 'test response'; $info = array(CURLINFO_HTTP_CODE => '200'); $this->curlStub->setResponse($responseContent, $requiredOptions); $this->curlStub->setInformation($info, $requiredOptions); $connectionData = FF::getInstance('Core\\Server\\ConnectionData'); $id = $this->dataProvider->register($connectionData); $parameters = $connectionData->getParameters(); $parameters['format'] = 'json'; $parameters['do'] = 'getTagCloud'; $connectionData->setAction('TagCloud.ff'); $this->dataProvider->loadResponse($id); $response = $connectionData->getResponse(); $this->assertEquals(0, $response->getConnectionErrorCode()); $this->assertEquals('CURLE_OK', $response->getConnectionError()); $this->assertEquals(200, $response->getHttpCode()); $this->assertEquals($responseContent, $response->getContent()); }
/** * Converts data from $inCharset to $outCharset. * @param mixed $data If a string is given, it's encoding will be converted. * If an associative array is given, keys and values will be * converted recursively. All other data types will be returned * unchanged. * @return mixed */ protected function convert_recursive($inCharset, $outCharset, $data) { if (FF::isInstanceOf($data, 'Util\\Parameters')) { $result = FF::getInstance('Util\\Parameters', $this->convert($inCharset, $outCharset, $data->getArray())); } else { if (is_array($data)) { $result = array(); foreach ($data as $k => $v) { $k = $this->convert_recursive($inCharset, $outCharset, $k); $result[$k] = $this->convert_recursive($inCharset, $outCharset, $v); } } else { if (is_string($data)) { $result = $this->convertString($inCharset, $outCharset, $data); } else { $result = $data; } } } return $result; }
/** * Returns a request object all wired up and ready for use. * @return Request */ public function getRequest() { $connectionData = FF::getInstance('Core\\Server\\ConnectionData', clone $this->requestParameters); return FF::getInstance('Core\\Server\\Request', $this->loggerClass, $connectionData, $this->dataProvider); }
private function retrieveResponse($connectionData) { $curlHandle = $this->curl->init(); if ($curlHandle === false) { $this->log->error("curl_init() did not return a handle for ID {$id}. " . 'Setting an empty response...'); return FF::getInstance('Core\\Server\\NullResponse'); } // We cannot use array_merge() here, because that does not preserve // numeric keys. So we use array union instead. However, as opposed to // array_merge(), the left-hand operator's keys will be preserved. $curlOptions = $this->necessaryCurlOptions + $connectionData->getConnectionOptions() + $this->defaultCurlOptions; $this->curl->setopt_array($curlHandle, $curlOptions); $responseText = $this->curl->exec($curlHandle); $httpCode = (int) $this->curl->getinfo($curlHandle, CURLINFO_HTTP_CODE); $curlErrorNumber = $this->curl->errno($curlHandle); $curlError = $this->curl->error($curlHandle); $this->curl->close($curlHandle); return FF::getInstance('Core\\Server\\Response', $responseText, $httpCode, $curlErrorNumber, $curlError); }
/** * Value for parameter "followSearch" for followups on initial search like filters, pagination, ... * Either from search results searchParams, request parameters or from search results "simiFirstRecord". * Returns 0 if no parameter "followSearch" could be acquired. * * @return int */ public function getFollowSearchValue() { $jsonData = $this->getResponseContent(); //use searchParams of result if available if ($this->isValidResponse($jsonData) && isset($jsonData['searchResult']['searchParams'])) { $parameters = FF::getInstance('Util\\Parameters', $jsonData['searchResult']['searchParams']); //fallback to current request } else { $parameters = $this->parameters; } $searchParameters = FF::getInstance('Data\\SearchParameters', $parameters); $sorting = $searchParameters->getSortings(); // check if followSearch was set in request data or sent by FF in result searchParams if ($searchParameters->getFollowSearch() !== 0) { $followSearch = $searchParameters->getFollowSearch(); // use simiFirstRecord only if result was not sorted } elseif (empty($sorting)) { $jsonData = $this->getResponseContent(); if ($jsonData && $jsonData['searchResult'] && isset($jsonData['searchResult']['simiFirstRecord'])) { $followSearch = $jsonData['searchResult']['simiFirstRecord']; } //mark as not valid } else { $followSearch = 0; } return $followSearch; }
/** * Multi interface */ public function multi_init() { $mh = ++$this->lastHandle; $handle = FF::getInstance('Util\\CurlMultiHandle'); $this->multiHandles[$mh] = $handle; return $mh; }
private function createRecord($recordData, $position) { return FF::getInstance('Data\\Record', (string) $recordData['id'], $recordData['record'], 100.0, $position); }
/** * Value for parameter "followSearch" for followups on initial search like filters, pagination, ... * Either from request parameters or from search results "simiFirstRecord". * Returns 0 if no valid value for followSearch exists. * @return int */ public function getFollowSearchValue() { $searchParameters = FF::getInstance('Data\\SearchParameters', $this->parameters); $sorting = $searchParameters->getSortings(); // check if followSearch was set in request data if ($searchParameters->getFollowSearch() !== 10000) { $followSearch = $searchParameters->getFollowSearch(); // use simiFirstRecord only if result was not sorted } elseif (empty($sorting)) { $jsonData = $this->getResponseContent(); if ($jsonData && $jsonData['searchResult'] && isset($jsonData['searchResult']['simiFirstRecord'])) { $followSearch = $jsonData['searchResult']['simiFirstRecord']; } // mark as no followSearch } else { $followSearch = 0; } return $followSearch; }