/**
  * @param Response $response
  * @param ResponseStatus $responseStatus
  * @return string JSON or JSONP output
  */
 public function render(Response $response, ResponseStatus $responseStatus = null)
 {
     $output = '';
     $request = $response->getRequest();
     $outputTypeCode = $request->getOutputType()->getCode();
     $isJsonP = $outputTypeCode === OutputType::JSONP;
     if ($isJsonP) {
         $responseHandler = $request->getParameters()->getParameter(RequestParameters::RESPONSE_HANDLER_PARAMETER);
         $output .= $responseHandler . '(';
     }
     $dataTable = $response->getDataTable();
     $output .= "{\"version\":\"0.6\"";
     $reqId = $request->getRequestId();
     if ($reqId !== false) {
         $output .= ",\"reqId\":" . json_encode($reqId);
     }
     if ($responseStatus === null) {
         $sig = $request->getSignature();
         if ($sig !== false && $sig === $this->getSignature($dataTable)) {
             $responseStatus = new ResponseStatus(new StatusType(StatusType::ERROR), new ReasonType(ReasonType::NOT_MODIFIED));
         } else {
             $responseStatus = new ResponseStatus(new StatusType(StatusType::OK));
         }
     }
     $statusTypeCode = $responseStatus->getStatusType()->getCode();
     $output .= ",\"status\":" . json_encode($statusTypeCode);
     if ($statusTypeCode != StatusType::OK) {
         if ($statusTypeCode == StatusType::WARNING) {
             $warnings = $dataTable->getWarnings();
             $warningStrings = array();
             foreach ($warnings as $warning) {
                 $warningStrings[] = $this->getFaultString($warning->getReasonType(), $warning->getMessage());
             }
             $output .= ",\"warnings\":[" . implode(",", $warningStrings) . "]";
         } else {
             $errorsOutput = $this->getFaultString($responseStatus->getReasonType(), $responseStatus->getDescription());
             $output .= ",\"errors\":[" . $errorsOutput . "]";
         }
     }
     if ($statusTypeCode != StatusType::ERROR && $dataTable !== null) {
         $output .= ",\"sig\":" . json_encode($this->getSignature($dataTable));
         $output .= ",\"table\":" . $this->renderDataTable($dataTable, true, true, $isJsonP);
     }
     $output .= "}";
     if ($isJsonP) {
         $output .= ");";
     }
     return $output;
 }
 /**
  * @param Response $response
  * @throws Exception\NotImplementedException
  * @throws Exception
  */
 protected function prepare(Response $response)
 {
     $request = $response->getRequest();
     $requestParams = $request->getParameters();
     $outputTypeCode = $requestParams->getParameter(RequestParameters::OUTPUT_TYPE_PARAMETER);
     switch ($outputTypeCode) {
         case OutputType::TSV_EXCEL:
             throw new NotImplementedException($outputTypeCode . " output is not implemented");
             break;
         case OutputType::CSV:
             $this->headers['Content-Type'] = 'text/csv; charset=UTF-8';
             $outFilename = $requestParams->getParameter(RequestParameters::OUTPUT_FILE_NAME_PARAMETER);
             if ($outFilename === false) {
                 $outFilename = 'results.csv';
             }
             // For security reasons, make sure this filename ends with .csv
             if (substr($outFilename, -4) !== '.csv') {
                 $outFilename .= '.csv';
             }
             $this->headers['Content-Disposition'] = 'attachment; filename=' . $outFilename;
             break;
         case OutputType::HTML:
             $this->headers['Content-Type'] = 'text/html; charset=UTF-8';
             break;
         case OutputType::JSONP:
             $this->headers['Content-Type'] = 'text/javascript; charset=UTF-8';
             break;
         case OutputType::JSON:
             $this->headers['Content-Type'] = 'application/json; charset=UTF-8';
             break;
         default:
             throw new Exception("Unknown Output Type: " . $outputTypeCode);
             break;
     }
     $this->output = $response->__toString();
 }
 public function testRequestOutputTypeJsonpAffectsResponse()
 {
     $request = new Request(array(Request::DATASOURCE_REQUEST_PARAMETER => RequestParameters::OUTPUT_TYPE_PARAMETER . ':' . OutputType::JSONP));
     $response = new Response($request);
     $response->setDataTable($this->dataTable);
     $renderer = new JsonRenderer();
     $json_p = $renderer->render($response);
     $prefix = "google.visualization.Query.setResponse(";
     $suffix = ");";
     $this->assertSame($prefix, substr($json_p, 0, strlen($prefix)), "JSONP output must be prefixed with 'callbackFn('");
     $this->assertSame($suffix, substr($json_p, -1 * strlen($suffix)), "JSONP output must be suffixed with ');'");
     $newDateIndex = strpos($json_p, '"v":new Date(');
     // JSONP style date
     $stringDateIndex = strpos($json_p, '"v":"Date(');
     // JSON style date
     $this->assertTrue($newDateIndex > 0, "Expect JSONP date format to be present");
     $this->assertFalse($stringDateIndex, "Expect JSON date format to NOT be found");
 }
 public function testGetRendererJsonp()
 {
     // A request asking for JSONP OutputType
     $request = $this->getMock('\\Vube\\GoogleVisualization\\DataSource\\Request', array('getOutputType'));
     $request->expects($this->any())->method('getOutputType')->will($this->returnValue(new OutputType(OutputType::JSONP)));
     $response = new Response($request);
     $renderer = $response->getRenderer();
     $this->assertTrue($renderer instanceof JsonRenderer, "JsonRenderer used for JSONP output");
 }
Exemplo n.º 5
0
 /**
  * @param Response &$response [required] [IN] [OUT]
  */
 protected function executeTrue(Response &$response)
 {
     $request = $response->getRequest();
     // Verify that the user is granted access to the data
     if ($this->isRestrictedAccessMode()) {
         $this->verifyAccessAllowed($request->getOutputType());
     }
     // Populate the data
     $data =& $this->getDataTable($request);
     // Apply query, if any
     $query = Query::constructFromString($request->getQuery());
     if (!$query->isEmpty()) {
         $data =& QueryEngine::execute($query, $data);
     }
     $response->setDataTable($data);
 }