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;
 }