/**
     * call the WS and log if an error occured
     *
     * @param string $commandName
     * @param array $params
     * @throws Exception
     * @throws ezcLogWriterException
     * @return array
     */
    public static function call($commandName, $params)
    {
        // $params = DbTool::escapeRecursiveArray($params);
        $result = '';
        
        WSHelper::instance()->logger->log(var_export($params, true), ezcLog::INFO );

        WSHelper::instance()->logger->log( str_pad('', 77, '*'), ezcLog::INFO);
        try
        {
            $command = WSHelper::instance()->client->getCommand($commandName, $params);
            $command->prepare();
            $httpRequest = $command->getRequest();
            $httpRequest->setHeader('Content-Type','application/json');
            $httpRequest->setHeader('Pragma', 'no-cache');
            $httpRequest->setHeader('Content-cache', 'no-cache');
            WSHelper::instance()->logger->log("[Guzzle - Request] ".$httpRequest, ezcLog::INFO);
            eZDB::instance()->close();                              // explicitely close the db connection to let it free in case of timeout
            MMDB::resetInstance();
            $httpResponse = $command->getResponse();
            $forceDBOpen = eZDB::instance(false, false, true);      // force connection reopen
            eZDB::setInstance( $forceDBOpen );
            WSHelper::instance()->logger->log("[Guzzle - Response] ".$httpResponse, ezcLog::INFO);
            $result = $httpResponse->json();

            // log error (header != 200 OK AND login fail)
            if ( $httpResponse->isError()
                    || ( (isset($result['Login']) && $result['Login'] == "no" ) ))
            {
                $logMessage = !empty($result['Msg']) ? $result['Msg'] : "Unkwown";
                $logLevel = ezcLog::WARNING;
            }
            else
            {
                $logLevel = ezcLog::INFO;
                if ( isset($result['Login']) && $result['Login'] == "yes") $logMessage = "Login success";
                else $logMessage = $commandName . ' successful';
            }
            WSHelper::instance()->logger->log($logMessage, $logLevel );
            return $result;

        }
        catch( Guzzle\Http\Exception\CurlException $e )
        {
            $curlError = self::getCurlError( $e->getMessage() );
            $logMessage = "[Guzzle] CurlException #{$curlError['code']}: {$curlError['message']}";
            WSHelper::instance()->logger->log($logMessage, ezcLog::ERROR);
            self::logError($commandName, $params, $result, $logMessage);

            return array(
                'Data' => array(
                    'Status' => 'Error',
                    'ErrorCode' => 10,
                    'Msg' => "#{$curlError['code']}: {$curlError['message']}"
                )
            );
        }
        catch(Guzzle\Common\Exception\BadMethodCallException $e)
        {
            $logMessage = '[Guzzle] BadMethodCallException #'.$e->getCode().':'.$e->getMessage();
            WSHelper::instance()->logger->log($logMessage, ezcLog::ERROR);
            self::logError($commandName, $params, $result, $logMessage);
        }
        catch(Guzzle\Common\Exception\InvalidArgumentException $e)
        {
            $logMessage = '[Guzzle] InvalidArgumentException #'.$e->getCode().':'.$e->getMessage();
            WSHelper::instance()->logger->log($logMessage, ezcLog::ERROR);
            self::logError($commandName, $params, $result, $logMessage);
        }
        catch(Guzzle\Common\Exception\RuntimeException $e)
        {
            $logMessage = '[Guzzle] RuntimeException #'.$e->getCode().':'.$e->getMessage();
            WSHelper::instance()->logger->log($logMessage, ezcLog::ERROR);
            self::logError($commandName, $params, $result, $logMessage);
        }
        catch(Guzzle\Common\Exception\UnexpectedValueException $e)
        {
            $logMessage = '[Guzzle] UnexpectedValueException #'.$e->getCode().':'.$e->getMessage();
            WSHelper::instance()->logger->log($logMessage, ezcLog::ERROR);
            self::logError($commandName, $params, $result, $logMessage);
        }
        catch(Exception $e)
        {
            $logMessage = "[Exception] #".$e->getCode().':'.$e->getMessage();
            WSHelper::instance()->logger->log($logMessage, ezcLog::ERROR);
            self::logError($commandName, $params, $result, $logMessage);
        }

        return null;
    }