ResponseWriter   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 67
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 10
eloc 36
c 4
b 0
f 0
dl 0
loc 67
ccs 0
cts 33
cp 0
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B write() 0 56 10
1
<?php
2
3
namespace POData\Writers;
4
5
use POData\Common\HttpStatus;
6
use POData\Common\ODataConstants;
7
use POData\Common\MimeTypes;
8
use POData\IService;
9
use POData\UriProcessor\RequestDescription;
10
use POData\UriProcessor\ResourcePathProcessor\SegmentParser\TargetKind;
11
use POData\Writers\Metadata\MetadataWriter;
12
13
14
15
16
/**
17
 * Class ResponseWriter
18
 * @package POData\Writers
19
 */
20
class ResponseWriter
21
{
22
    /**
23
     * Write in specific format
24
     *
25
     * @param IService $service
26
     * @param RequestDescription $request the OData request
27
     * @param mixed $entityModel OData model instance
28
     * @param String $responseContentType Content type of the response
29
     *
30
     */
31
    public static function write(
32
        IService $service,
33
        RequestDescription $request,
34
        $entityModel,
35
        $responseContentType
36
    ) {
37
        $responseBody = null;
38
        $dataServiceVersion = $request->getResponseVersion();
39
        $targetKind = $request->getTargetKind();
40
41
        if ($targetKind == TargetKind::METADATA) {
42
            // /$metadata
43
            $writer = new MetadataWriter($service->getProvidersWrapper());
44
            $responseBody = $writer->writeMetadata();
45
            $dataServiceVersion = $writer->getDataServiceVersion();
46
        } else if ($targetKind == TargetKind::PRIMITIVE_VALUE && $responseContentType != MimeTypes::MIME_APPLICATION_OCTETSTREAM) {
47
            //This second part is to exclude binary properties
48
            // /Customer('ALFKI')/CompanyName/$value
49
            // /Customers/$count
50
            $responseBody = mb_convert_encoding($request->getTargetResult(), 'UTF-8');
51
        } else if ($responseContentType == MimeTypes::MIME_APPLICATION_OCTETSTREAM || $targetKind == TargetKind::MEDIA_RESOURCE) {
52
            // Binary property or media resource
53
            if ($request->getTargetKind() == TargetKind::MEDIA_RESOURCE) {
54
                $result = $request->getTargetResult();
55
                $streamInfo = $request->getResourceStreamInfo();
56
                $provider = $service->getStreamProviderWrapper();
57
                $eTag = $provider->getStreamETag($result, $streamInfo);
0 ignored issues
show
Bug introduced by
It seems like $result can also be of type array and array; however, parameter $entity of POData\Providers\Stream\...rapper::getStreamETag() does only seem to accept object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

57
                $eTag = $provider->getStreamETag(/** @scrutinizer ignore-type */ $result, $streamInfo);
Loading history...
58
                $service->getHost()->setResponseETag($eTag);
59
                $responseBody = $provider->getReadStream($result, $streamInfo);
0 ignored issues
show
Bug introduced by
It seems like $result can also be of type array and array; however, parameter $entity of POData\Providers\Stream\...rapper::getReadStream() does only seem to accept object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

59
                $responseBody = $provider->getReadStream(/** @scrutinizer ignore-type */ $result, $streamInfo);
Loading history...
60
            } else {
61
                $responseBody = $request->getTargetResult();
62
            }
63
64
            if (is_null($responseContentType)) {
0 ignored issues
show
introduced by
The condition is_null($responseContentType) is always false.
Loading history...
65
                $responseContentType = MimeTypes::MIME_APPLICATION_OCTETSTREAM;
66
            }
67
        } else {
68
            $writer = $service->getODataWriterRegistry()->getWriter($request->getResponseVersion(), $responseContentType);
69
            $writer->clear();
0 ignored issues
show
Bug introduced by
The method clear() does not exist on POData\Writers\IODataWriter. Since it exists in all sub-types, consider adding an abstract or default implementation to POData\Writers\IODataWriter. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

69
            $writer->/** @scrutinizer ignore-call */ 
70
                     clear();
Loading history...
70
            //TODO: move ot Messages
71
            if (is_null($writer)) {
72
                throw new \Exception("no writer can handle the request");
73
            }
74
75
            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
76
                $responseBody = $writer->writeServiceDocument($service->getProvidersWrapper())->getOutput();
77
            } else {
78
                $responseBody = $writer->write($entityModel)->getOutput();
79
            }
80
        }
81
82
        $service->getHost()->setResponseStatusCode(HttpStatus::CODE_OK);
83
        $service->getHost()->setResponseContentType($responseContentType);
84
        $service->getHost()->setResponseVersion($dataServiceVersion->toString() . ';');
85
        $service->getHost()->setResponseCacheControl(ODataConstants::HTTPRESPONSE_HEADER_CACHECONTROL_NOCACHE);
86
        $service->getHost()->getOperationContext()->outgoingResponse()->setStream($responseBody);
0 ignored issues
show
Bug introduced by
It seems like $responseBody can also be of type array and array and array; however, parameter $value of POData\OperationContext\...ngResponse::setStream() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

86
        $service->getHost()->getOperationContext()->outgoingResponse()->setStream(/** @scrutinizer ignore-type */ $responseBody);
Loading history...
87
    }
88
}
89