Example #1
0
 /**
  * Write in specific format 
  * 
  * @param IService $service
  * @param RequestDescription $request the OData request
  * @param mixed $entityModel OData model instance
  * @param String $responseContentType Content type of the response
  * 
  */
 public static function write(IService $service, RequestDescription $request, $entityModel, $responseContentType)
 {
     $responseBody = null;
     $dataServiceVersion = $request->getResponseVersion();
     $targetKind = $request->getTargetKind();
     if ($targetKind == TargetKind::METADATA()) {
         // /$metadata
         $writer = new MetadataWriter($service->getProvidersWrapper());
         $responseBody = $writer->writeMetadata();
         $dataServiceVersion = $writer->getDataServiceVersion();
     } else {
         if ($targetKind == TargetKind::PRIMITIVE_VALUE() && $responseContentType != MimeTypes::MIME_APPLICATION_OCTETSTREAM) {
             //This second part is to exclude binary properties
             // /Customer('ALFKI')/CompanyName/$value
             // /Customers/$count
             $responseBody = utf8_encode($request->getTargetResult());
         } else {
             if ($responseContentType == MimeTypes::MIME_APPLICATION_OCTETSTREAM || $targetKind == TargetKind::MEDIA_RESOURCE()) {
                 // Binary property or media resource
                 if ($request->getTargetKind() == TargetKind::MEDIA_RESOURCE()) {
                     $result = $request->getTargetResult();
                     $streamInfo = $request->getResourceStreamInfo();
                     $provider = $service->getStreamProviderWrapper();
                     $eTag = $provider->getStreamETag($result, $streamInfo);
                     $service->getHost()->setResponseETag($eTag);
                     $responseBody = $provider->getReadStream($result, $streamInfo);
                 } else {
                     $responseBody = $request->getTargetResult();
                 }
                 if (is_null($responseContentType)) {
                     $responseContentType = MimeTypes::MIME_APPLICATION_OCTETSTREAM;
                 }
             } else {
                 $writer = $service->getODataWriterRegistry()->getWriter($request->getResponseVersion(), $responseContentType);
                 //TODO: move ot Messages
                 if (is_null($writer)) {
                     throw new \Exception("no writer can handle the request");
                 }
                 if (is_null($entityModel)) {
                     //TODO: this seems like a weird way to know that the request is for a service document..i'd think we know this some other way
                     $responseBody = $writer->writeServiceDocument($service->getProvidersWrapper())->getOutput();
                 } else {
                     $responseBody = $writer->write($entityModel)->getOutput();
                 }
             }
         }
     }
     $service->getHost()->setResponseStatusCode(HttpStatus::CODE_OK);
     $service->getHost()->setResponseContentType($responseContentType);
     $service->getHost()->setResponseVersion($dataServiceVersion->toString() . ';');
     $service->getHost()->setResponseCacheControl(ODataConstants::HTTPRESPONSE_HEADER_CACHECONTROL_NOCACHE);
     $service->getHost()->getOperationContext()->outgoingResponse()->setStream($responseBody);
 }
Example #2
0
 public function testWriteMetadata()
 {
     $northWindMetadata = NorthWindMetadata::Create();
     $configuration = new ServiceConfiguration($northWindMetadata);
     $configuration->setEntitySetAccessRule("*", EntitySetRights::ALL);
     $configuration->setMaxDataServiceVersion(ProtocolVersion::V3());
     $providersWrapper = new ProvidersWrapper($northWindMetadata, $this->mockQueryProvider, $configuration, false);
     $metadataWriter = new MetadataWriter($providersWrapper);
     $metadata = $metadataWriter->writeMetadata();
     $this->assertNotNull($metadata);
     $this->assertEquals($providersWrapper->getContainerName(), 'NorthWindEntities');
     $this->assertEquals($providersWrapper->getContainerNamespace(), 'NorthWind');
     $this->assertStringStartsWith('<edmx:Edmx Version="1.0"', $metadata);
     $customerResourceSet = $providersWrapper->resolveResourceSet('Customers');
     $this->assertEquals($customerResourceSet->getName(), 'Customers');
     $this->assertEquals($customerResourceSet->getResourceType()->getName(), 'Customer');
     $customerEntityType = $providersWrapper->resolveResourceType('Customer');
     $this->assertEquals($customerEntityType->getResourceTypeKind(), ResourceTypeKind::ENTITY);
 }