AtomODataWriter::preWriteProperties()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 40
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 23
CRAP Score 2.1883

Importance

Changes 0
Metric Value
eloc 29
c 0
b 0
f 0
dl 0
loc 40
ccs 23
cts 36
cp 0.6389
rs 9.456
cc 2
nc 2
nop 1
crap 2.1883
1
<?php
2
3
namespace POData\Writers\Atom;
4
5
use POData\Common\Version;
6
use POData\ObjectModel\ODataFeed;
7
use POData\ObjectModel\ODataEntry;
8
use POData\ObjectModel\ODataURLCollection;
9
use POData\ObjectModel\ODataURL;
10
use POData\ObjectModel\ODataLink;
11
use POData\ObjectModel\ODataPropertyContent;
12
use POData\ObjectModel\ODataBagContent;
13
use POData\ObjectModel\ODataProperty;
14
use POData\Writers\IODataWriter;
15
use POData\Common\ODataConstants;
16
use POData\Common\MimeTypes;
17
use POData\Common\ODataException;
18
use POData\Providers\ProvidersWrapper;
19
20
/**
21
 * Class AtomODataWriter
22
 * @package POData\Writers\Atom
23
 */
24
class AtomODataWriter implements IODataWriter
25
{
26
    /**
27
     * Writer to which output (CSDL Document) is sent
28
     *
29
     * @var \XMLWriter
30
     */
31
    public $xmlWriter;
32
33
    /**
34
     *
35
     * The service base uri
36
     * @var string
37
     */
38
    protected $baseUri;
39
40
    /**
41
     * Construct a new instance of AtomODataWriter.
42
     *
43
     * @param string  $absoluteServiceUri The absolute service Uri.
44
     */
45 106
    public function __construct($absoluteServiceUri)
46
    {
47 106
        $this->baseUri = $absoluteServiceUri;
48
49 106
        $this->xmlWriter = new \XMLWriter();
50 106
        $this->xmlWriter->openMemory();
51 106
        $this->xmlWriter->startDocument('1.0', 'utf-8', 'yes');
52 106
        $this->xmlWriter->setIndent(true);
53
    }
54
55
    /**
56
     * Determines if the given writer is capable of writing the response or not
57
     * @param Version $responseVersion the OData version of the response
58
     * @param string $contentType the Content Type of the response
59
     * @return boolean true if the writer can handle the response, false otherwise
60
     */
61 9
    public function canHandle(Version $responseVersion, $contentType)
62
    {
63
64 9
        $parts = explode(";", $contentType);
65
66
        //first 2 parts are for service documents, second part is for Resources
67
        //TODO: i'm not sold about this first part not being constrained to v1 (or maybe v2)..but it's how WS DS works. See #94
68 9
        return in_array(MimeTypes::MIME_APPLICATION_XML, $parts) || in_array(MimeTypes::MIME_APPLICATION_ATOMSERVICE, $parts) || in_array(MimeTypes::MIME_APPLICATION_ATOM, $parts);
69
    }
70
71
    /**
72
     * Write the given OData model in a specific response format
73
     *
74
     * @param  ODataURL|ODataURLCollection|ODataPropertyContent|ODataFeed|ODataEntry $model Object of requested content.
75
     *
76
     * @return AtomODataWriter
77
     */
78 8
    public function write($model)
79
    {
80 8
        if ($model instanceof ODataURL) {
81 1
            return $this->writeURL($model);
82
        }
83
84 7
        if ($model instanceof ODataURLCollection) {
85 1
            return $this->writeURLCollection($model);
86
        }
87
88 6
        if ($model instanceof ODataPropertyContent) {
89 3
            return $this->writeProperties($model, true);
90
        }
91
92 3
        if ($model instanceof ODataFeed) {
93 1
            return $this->writeFeed($model, true);
94
        }
95
96 2
        if ($model instanceof ODataEntry) {
0 ignored issues
show
introduced by
$model is always a sub-type of POData\ObjectModel\ODataEntry.
Loading history...
97 2
            return $this->writeEntry($model, true);
98
        }
99
100
        return $this;
101
    }
102
103
    /**
104
     * @param ODataURL $url the url to write.
105
     *
106
     * @return AtomODataWriter
107
     */
108 1
    protected function writeURL(ODataURL $url)
109
    {
110 1
        $this->xmlWriter->startElement(ODataConstants::ATOM_URI_ELEMENT_NAME);
111 1
        $this->xmlWriter->writeAttribute(ODataConstants::XMLNS_NAMESPACE_PREFIX, ODataConstants::ODATA_NAMESPACE);
112 1
        $this->xmlWriter->text($url->url);
113 1
        $this->xmlWriter->endElement();
114
115 1
        return $this;
116
    }
117
118
    /**
119
     * Begin write odata links
120
     *
121
     * @param ODataURLCollection $urls Object of ODataUrlCollection to start writing collection of url.
122
     *
123
     *
124
     * @return AtomODataWriter
125
     */
126 1
    public function writeUrlCollection(ODataURLCollection $urls)
127
    {
128 1
        $this->xmlWriter->startElement(ODataConstants::ATOM_LINKS_ELEMENT_NAME);
129 1
        $this->xmlWriter->writeAttribute(
130 1
            ODataConstants::XMLNS_NAMESPACE_PREFIX, ODataConstants::ODATA_NAMESPACE
131 1
        );
132 1
        $this->xmlWriter->endAttribute();
133 1
        if ($urls->count != null) {
134 1
            $this->xmlWriter->writeAttributeNs(
135 1
                ODataConstants::XMLNS_NAMESPACE_PREFIX,
136 1
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
137 1
                null,
138 1
                ODataConstants::ODATA_METADATA_NAMESPACE
139 1
            );
140 1
            $this->xmlWriter->endAttribute();
141 1
            $this->xmlWriter->startElementNs(
142 1
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
143 1
                ODataConstants::ROWCOUNT_ELEMENT,
144 1
                null
145 1
            );
146 1
            $this->xmlWriter->text($urls->count);
147 1
            $this->xmlWriter->endElement();
148
        }
149 1
        foreach ($urls->urls as $url) {
150 1
            $this->writeNodeValue(ODataConstants::ATOM_URI_ELEMENT_NAME, $url->url);
151
        }
152
153
154 1
        if ($urls->nextPageLink != null) {
155 1
            $this->writeLinkNode($urls->nextPageLink, false);
156
        }
157 1
        $this->xmlWriter->endElement();
158
159 1
        return $this;
160
161
    }
162
163
    /**
164
     * Begin write OData Feed
165
     *
166
     * @param ODataFeed $feed Object of OData feed to start writing feed
167
     * @param boolean $isTopLevel indicates if this is the top level feed in the response
168
     *
169
     * @return AtomODataWriter
170
     */
171 1
    protected function writeFeed(ODataFeed $feed, $isTopLevel = false)
172
    {
173 1
        $this->xmlWriter->startElement(ODataConstants::ATOM_FEED_ELEMENT_NAME);
174 1
        if ($isTopLevel) {
175 1
            $this->writeBaseUriAndDefaultNamespaces();
176
        }
177
178 1
        $this
179 1
            ->writeNodeAttributeValue(
180 1
                ODataConstants::ATOM_TITLE_ELELMET_NAME,
181 1
                ODataConstants::ATOM_TYPE_ATTRIBUTE_NAME,
182 1
                MimeTypes::MIME_TEXTTYPE,
183 1
                $feed->title
184 1
            )
185 1
            ->writeNodeValue(ODataConstants::ATOM_ID_ELEMENT_NAME, $feed->id)
186 1
            ->writeNodeValue(ODataConstants::ATOM_UPDATED_ELEMENT_NAME, date(DATE_ATOM))
187 1
            ->writeLinkNode($feed->selfLink, false);
188
189 1
        if ($feed->rowCount !== null) {
190 1
            $this->xmlWriter->startElementNs(
191 1
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
192 1
                ODataConstants::ROWCOUNT_ELEMENT, null
193 1
            );
194 1
            $this->xmlWriter->text($feed->rowCount);
195 1
            $this->xmlWriter->endElement();
196
        }
197
198 1
        foreach ($feed->entries as $entry) {
199 1
            $this->writeEntry($entry);
200
        }
201
202 1
        if ($feed->nextPageLink != null) {
203 1
            $this->writeLinkNode($feed->nextPageLink, false);
204
        }
205 1
        $this->xmlWriter->endElement();
206
207
208 1
        return $this;
209
    }
210
211
212
    /**
213
     * Write top level entry
214
     *
215
     * @param ODataEntry $entry Object of ODataEntry
216
     * @param boolean $isTopLevel
217
     *
218
     * @return AtomODataWriter
219
     */
220 3
    protected function writeEntry(ODataEntry $entry, $isTopLevel = false)
221
    {
222 3
        $this->writeBeginEntry($entry, $isTopLevel);
223 3
        foreach ($entry->links as $link) {
224 1
            $this->writeLink($link);
225
        }
226
227 3
        $this
228 3
            ->preWriteProperties($entry)
229 3
            ->writeProperties($entry->propertyContent)
230 3
            ->postWriteProperties($entry);
231
232 3
        $this->xmlWriter->endElement();
233
234
235 3
        return $this;
236
    }
237
238
239
    /**
240
     * Start writing a entry
241
     *
242
     * @param ODataEntry $entry Entry to write
243
     * @param boolean $isTopLevel
244
     *
245
     * @return AtomODataWriter
246
     */
247 3
    protected function writeBeginEntry(ODataEntry $entry, $isTopLevel)
248
    {
249 3
        $this->xmlWriter->startElement(ODataConstants::ATOM_ENTRY_ELEMENT_NAME);
250 3
        if ($isTopLevel) {
251 2
            $this->writeBaseUriAndDefaultNamespaces();
252
        }
253
254 3
        if (!is_null($entry->eTag)) {
0 ignored issues
show
introduced by
The condition is_null($entry->eTag) is always false.
Loading history...
255 3
            $this->xmlWriter->startAttributeNs(
256 3
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
257 3
                ODataConstants::ATOM_ETAG_ATTRIBUTE_NAME,
258 3
                null
259 3
            );
260 3
            $this->xmlWriter->text($entry->eTag);
261 3
            $this->xmlWriter->endAttribute();
262
        }
263
264 3
        $this
265 3
            ->writeNodeValue(ODataConstants::ATOM_ID_ELEMENT_NAME, $entry->id)
266 3
            ->writeNodeAttributeValue(
267 3
                ODataConstants::ATOM_TITLE_ELELMET_NAME,
268 3
                ODataConstants::ATOM_TYPE_ATTRIBUTE_NAME,
269 3
                MimeTypes::MIME_TEXTTYPE,
270 3
                $entry->title
271 3
            )
272 3
            ->writeNodeValue(ODataConstants::ATOM_UPDATED_ELEMENT_NAME, date(DATE_ATOM));
273
274 3
        $this->xmlWriter->startElement(ODataConstants::ATOM_AUTHOR_ELEMENT_NAME);
275 3
        $this->xmlWriter->startElement(ODataConstants::ATOM_NAME_ELEMENT_NAME);
276 3
        $this->xmlWriter->endElement();
277 3
        $this->xmlWriter->endElement();
278 3
        if ($entry->isMediaLinkEntry) {
279
            $this->xmlWriter->startElement(ODataConstants::ATOM_LINK_ELEMENT_NAME);
280
            if ($entry->mediaLink->eTag != null) {
281
                $this->xmlWriter->startAttributeNs(
282
                    ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
283
                    ODataConstants::ATOM_ETAG_ATTRIBUTE_NAME,
284
                    null
285
                );
286
                $this->xmlWriter->text($entry->mediaLink->eTag);
287
                $this->xmlWriter->endAttribute();
288
            }
289
            $this->xmlWriter->startAttribute(
290
                ODataConstants::ATOM_LINK_RELATION_ATTRIBUTE_NAME
291
            );
292
            $this->xmlWriter->text(ODataConstants::ATOM_EDIT_MEDIA_RELATION_ATTRIBUTE_VALUE);
293
            $this->xmlWriter->endAttribute();
294
295
            $this->xmlWriter->startAttribute(ODataConstants::ATOM_TYPE_ATTRIBUTE_NAME);
296
            $this->xmlWriter->text($entry->mediaLink->contentType);
297
            $this->xmlWriter->endAttribute();
298
299
            $this->xmlWriter->startAttribute(ODataConstants::ATOM_TITLE_ELELMET_NAME);
300
            $this->xmlWriter->text($entry->mediaLink->name);
301
            $this->xmlWriter->endAttribute();
302
303
            $this->xmlWriter->startAttribute(ODataConstants::ATOM_HREF_ATTRIBUTE_NAME);
304
            $this->xmlWriter->text($entry->mediaLink->editLink);
305
            $this->xmlWriter->endAttribute();
306
            $this->xmlWriter->endElement();
307
308
            foreach ($entry->mediaLinks as $mediaLink) {
309
                $this->xmlWriter->startElement(ODataConstants::ATOM_LINK_ELEMENT_NAME);
310
                if ($mediaLink->eTag != null) {
311
                    $this->xmlWriter->startAttributeNs(
312
                        ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
313
                        ODataConstants::ATOM_ETAG_ATTRIBUTE_NAME,
314
                        null
315
                    );
316
                    $this->xmlWriter->text($mediaLink->eTag);
317
                    $this->xmlWriter->endAttribute();
318
                }
319
                $this->xmlWriter->startAttribute(ODataConstants::ATOM_LINK_RELATION_ATTRIBUTE_NAME);
320
                $this->xmlWriter->text(
321
                    "http://schemas.microsoft.com/ado/2007/08/dataservices/mediaresource/"
322
                    .$mediaLink->name
323
                );
324
                $this->xmlWriter->endAttribute();
325
326
                $this->xmlWriter->startAttribute(ODataConstants::ATOM_TYPE_ATTRIBUTE_NAME);
327
                $this->xmlWriter->text($mediaLink->contentType);
328
                $this->xmlWriter->endAttribute();
329
330
                $this->xmlWriter->startAttribute(ODataConstants::ATOM_TITLE_ELELMET_NAME);
331
                $this->xmlWriter->text($mediaLink->name);
332
                $this->xmlWriter->endAttribute();
333
334
                $this->xmlWriter->startAttribute(ODataConstants::ATOM_HREF_ATTRIBUTE_NAME);
335
                $this->xmlWriter->text($mediaLink->editLink);
336
                $this->xmlWriter->endAttribute();
337
                $this->xmlWriter->endElement();
338
            }
339
        }
340
341 3
        return $this;
342
    }
343
344
345
346
347
    /**
348
     *
349
     * @param ODataLink $link Link to write.
350
     *
351
     * @return AtomODataWriter
352
     */
353 1
    protected function writeLink(ODataLink $link)
354
    {
355 1
        $this->writeLinkNode($link, $link->isExpanded);
356
357 1
        if ($link->isExpanded) {
358 1
            $this->xmlWriter->startElementNS(
359 1
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
360 1
                ODataConstants::ATOM_INLINE_ELEMENT_NAME,
361 1
                null
362 1
            );
363
364
365 1
            if (!is_null($link->expandedResult)) {
366 1
                if ($link->isCollection) {
367
                    $this->writeFeed($link->expandedResult);
0 ignored issues
show
Bug introduced by
It seems like $link->expandedResult can also be of type POData\ObjectModel\ODataEntry; however, parameter $feed of POData\Writers\Atom\AtomODataWriter::writeFeed() does only seem to accept POData\ObjectModel\ODataFeed, 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

367
                    $this->writeFeed(/** @scrutinizer ignore-type */ $link->expandedResult);
Loading history...
368
                } else {
369 1
                    $this->writeEntry($link->expandedResult);
0 ignored issues
show
Bug introduced by
It seems like $link->expandedResult can also be of type POData\ObjectModel\ODataFeed; however, parameter $entry of POData\Writers\Atom\AtomODataWriter::writeEntry() does only seem to accept POData\ObjectModel\ODataEntry, 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

369
                    $this->writeEntry(/** @scrutinizer ignore-type */ $link->expandedResult);
Loading history...
370
                }
371
            }
372
373
374 1
            $this->xmlWriter->endElement();
375 1
            $this->xmlWriter->endElement();
376
        }
377
378 1
        return $this;
379
    }
380
381
382
383
384
    /**
385
     * Write the given collection of properties.
386
     * (properties of an entity or complex type)
387
     *
388
     * @param ODataPropertyContent $properties Collection of properties.
389
     * @param bool $topLevel indicates if this property content is the top level response to be written
390
     * @return AtomODataWriter
391
     */
392 6
    protected function writeProperties(ODataPropertyContent $properties, $topLevel = false)
393
    {
394 6
        foreach ($properties->properties as $property) {
395 6
            $this->beginWriteProperty($property, $topLevel);
396
397 6
            if (is_null($property->value)) {
398
                $this->writeNullValue($property);
399 6
            } elseif ($property->value instanceof ODataPropertyContent) {
400 3
                $this->writeProperties($property->value, false);
401 6
            } elseif ($property->value instanceof ODataBagContent) {
402 4
                $this->writeBagContent($property->value);
403
            } else {
404 5
                $value = $this->beforeWriteValue($property->value, $property->typeName);
405 5
                $this->xmlWriter->text($value);
406
            }
407
408 6
            $this->xmlWriter->endElement();
409
        }
410
411 6
        return $this;
412
    }
413
414
    /**
415
     * XML write a basic data type (string, number, boolean, null)
416
     *
417
     * @param string  $value value to be written
418
     * @param string $type  data type of the value
419
     *
420
     * @return string
421
     */
422 5
    protected function beforeWriteValue($value, $type = null)
423
    {
424
        switch ($type) {
425 5
            case 'Edm.Date':
426 5
            case 'Edm.DateTime':
427
                $dateTime = new \DateTime($value, new \DateTimeZone('UTC'));
428
                $result = $dateTime->format('Y-m-d\TH:i:s');
429
                break;
430
431
            default:
432 5
                $result = $value;
433
        }
434
435 5
        return $result;
436
    }
437
438
    /**
439
     * Write the node which hold the entity properties as child
440
     *
441
     * @param ODataEntry $entry ODataEntry object for pre writing properties.
442
     *
443
     * @return AtomODataWriter
444
     */
445 3
    public function preWriteProperties(ODataEntry $entry)
446
    {
447 3
        $this->xmlWriter->startElement(ODataConstants::ATOM_CATEGORY_ELEMENT_NAME);
448 3
        $this->xmlWriter->writeAttribute(
449 3
            ODataConstants::ATOM_CATEGORY_TERM_ATTRIBUTE_NAME,
450 3
            $entry->type
451 3
        );
452 3
        $this->xmlWriter->writeAttribute(
453 3
            ODataConstants::ATOM_CATEGORY_SCHEME_ATTRIBUTE_NAME,
454 3
            ODataConstants::ODATA_SCHEME_NAMESPACE
455 3
        );
456 3
        $this->xmlWriter->endElement();
457 3
        $this->xmlWriter->startElement(ODataConstants::ATOM_CONTENT_ELEMENT_NAME);
458 3
        if ($entry->isMediaLinkEntry) {
459
            $this->xmlWriter->writeAttribute(
460
                ODataConstants::ATOM_TYPE_ATTRIBUTE_NAME,
461
                $entry->mediaLink->contentType
462
            );
463
            $this->xmlWriter->writeAttribute(
464
                ODataConstants::ATOM_CONTENT_SRC_ATTRIBUTE_NAME,
465
                $entry->mediaLink->srcLink
466
            );
467
            $this->xmlWriter->endElement();
468
            $this->xmlWriter->startElementNS(
469
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
470
                ODataConstants::ATOM_PROPERTIES_ELEMENT_NAME, null
471
            );
472
        } else {
473 3
            $this->xmlWriter->writeAttribute(
474 3
                ODataConstants::ATOM_TYPE_ATTRIBUTE_NAME,
475 3
                MimeTypes::MIME_APPLICATION_XML
476 3
            );
477 3
            $this->xmlWriter->startElementNS(
478 3
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
479 3
                ODataConstants::ATOM_PROPERTIES_ELEMENT_NAME,
480 3
                null
481 3
            );
482
        }
483
484 3
        return $this;
485
    }
486
487
    /**
488
     * Write a property
489
     *
490
     * @param ODataProperty $property Property to be written
491
     * @param boolean       $isTopLevel     is link top level or not.
492
     *
493
     * @return AtomODataWriter
494
     */
495 6
    protected function beginWriteProperty(ODataProperty $property, $isTopLevel)
496
    {
497 6
        $this->xmlWriter->startElementNS(
498 6
            ODataConstants::ODATA_NAMESPACE_PREFIX,
499 6
            $property->name,
500 6
            null
501 6
        );
502 6
        if ($property->typeName != null) {
503 5
            $this->xmlWriter->startAttributeNs(
504 5
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
505 5
                ODataConstants::ATOM_TYPE_ATTRIBUTE_NAME,
506 5
                null
507 5
            );
508 5
            $this->xmlWriter->text($property->typeName);
509
        }
510 6
        if ($isTopLevel) {
511 3
            $this->xmlWriter->startAttribute(ODataConstants::XMLNS_NAMESPACE_PREFIX);
512 3
            $this->xmlWriter->text(ODataConstants::ODATA_METADATA_NAMESPACE);
513 3
            $this->xmlWriter->startAttributeNs(ODataConstants::XMLNS_NAMESPACE_PREFIX, ODataConstants::ODATA_NAMESPACE_PREFIX, null);
514 3
            $this->xmlWriter->text(ODataConstants::ODATA_NAMESPACE);
515 3
            $this->xmlWriter->startAttributeNs(ODataConstants::XMLNS_NAMESPACE_PREFIX, ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX, null);
516 3
            $this->xmlWriter->text(ODataConstants::ODATA_METADATA_NAMESPACE);
517
        }
518 6
        if ($property->typeName != null || $isTopLevel) {
519 6
            $this->xmlWriter->endAttribute();
520
        }
521
522 6
        return $this;
523
    }
524
525
526
527
    /**
528
     * Write after last property
529
     *
530
     * @param ODataEntry $entry Entry object to post writing properties.
531
     *
532
     * @return AtomODataWriter
533
     */
534 3
    public function postWriteProperties(ODataEntry $entry)
535
    {
536 3
        if (!$entry->isMediaLinkEntry) {
537 3
            $this->xmlWriter->endElement();
538
        }
539 3
        $this->xmlWriter->endElement();
540
541 3
        return $this;
542
    }
543
544
    /**
545
     * Begin an item in a collection
546
     *
547
     * @param ODataBagContent $bag Bag property object to begin write property
548
     *
549
     *
550
     * @return AtomODataWriter
551
     */
552 4
    protected function writeBagContent(ODataBagContent $bag)
553
    {
554 4
        foreach ($bag->propertyContents as $content) {
555 4
            if ($content instanceof ODataPropertyContent) {
556 3
                $this->xmlWriter->startElementNs(
557 3
                    ODataConstants::ODATA_NAMESPACE_PREFIX,
558 3
                    ODataConstants::COLLECTION_ELEMENT_NAME,
559 3
                    null
560 3
                );
561 3
                    $this->writeProperties($content);
562 3
                    $this->xmlWriter->endElement();
563
            } else {  //probably just a primitive string
564 2
                    $this->xmlWriter->startElementNs(
565 2
                        ODataConstants::ODATA_NAMESPACE_PREFIX,
566 2
                        ODataConstants::COLLECTION_ELEMENT_NAME,
567 2
                        null
568 2
                    );
569 2
                    $this->xmlWriter->text($content);
570 2
                    $this->xmlWriter->endElement();
571
            }
572
        }
573
574 4
        return $this;
575
    }
576
577
578
579
    /**
580
     * Write null value
581
     *
582
     * @param ODataProperty $property ODataProperty object to write null value
583
     * according to property type.
584
     *
585
     * @return AtomODataWriter
586
     */
587
    protected function writeNullValue(ODataProperty $property)
588
    {
589
        if (!(($property instanceof ODataBagContent) || ($property instanceof ODataPropertyContent))) {
0 ignored issues
show
introduced by
$property is never a sub-type of POData\ObjectModel\ODataPropertyContent.
Loading history...
590
            $this->xmlWriter->writeAttributeNs(
591
                ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
592
                ODataConstants::ATOM_NULL_ATTRIBUTE_NAME,
593
                null,
594
                ODataConstants::XML_TRUE_LITERAL
595
            );
596
        }
597
        return $this;
598
    }
599
600
601
602
    /**
603
     * Get the final result as string
604
     *
605
     * @return string output of requested data in Atom format.
606
     */
607 10
    public function getOutput()
608
    {
609 10
        $this->xmlWriter->endDocument();
610 10
        return $this->xmlWriter->outputMemory(true);
611
    }
612
613
    /**
614
     * Serialize the exception
615
     *
616
     * @param ODataException $exception              Exception to serialize
617
     * @param boolean        $serializeInnerException if set to true,
618
     * serialize the inner exception if $exception is an ODataException.
619
     *
620
     * @return string
621
     */
622
    public static function serializeException(ODataException $exception, $serializeInnerException)
0 ignored issues
show
Unused Code introduced by
The parameter $serializeInnerException is not used and could be removed. ( Ignorable by Annotation )

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

622
    public static function serializeException(ODataException $exception, /** @scrutinizer ignore-unused */ $serializeInnerException)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
623
    {
624
        $xmlWriter = new \XMLWriter();
625
        $xmlWriter->openMemory();
626
        $xmlWriter->startDocument('1.0', 'utf-8', 'yes');
627
        $xmlWriter->setIndent(true);
628
629
        $xmlWriter->startElement(ODataConstants::XML_ERROR_ELEMENT_NAME);
630
        //$xmlWriter->writeAttributeNs(
631
        //    ODataConstants::XMLNS_NAMESPACE_PREFIX,
632
        //    ODataConstants::XML_NAMESPACE_PREFIX,
633
        //    ODataConstants::XML_NAMESPACE,
634
        //    null
635
        //);
636
        $xmlWriter->writeAttribute(
637
            ODataConstants::XMLNS_NAMESPACE_PREFIX,
638
            ODataConstants::ODATA_METADATA_NAMESPACE
639
        );
640
        $xmlWriter->endAttribute();
641
        $xmlWriter->startElement(ODataConstants::XML_ERROR_CODE_ELEMENT_NAME);
642
        if ($exception->getCode() !== null) {
643
            $xmlWriter->text($exception->getCode());
644
        }
645
        $xmlWriter->endElement();
646
        $xmlWriter->startElement(ODataConstants::XML_ERROR_MESSAGE_ELEMENT_NAME);
647
        $xmlWriter->text($exception->getMessage());
648
        $xmlWriter->endElement();
649
        $xmlWriter->endElement();
650
        $xmlWriter->endDocument();
651
        return $xmlWriter->outputMemory(true);
652
    }
653
654
    /**
655
     * Function to create element only contain value without argument.
656
     *
657
     * @param String $node  Element name
658
     * @param String $value Element value
659
     *
660
     * @return AtomODataWriter
661
     */
662 4
    public function writeNodeValue($node, $value)
663
    {
664 4
        $this->xmlWriter->startElement($node);
665 4
        $this->xmlWriter->text($value);
666 4
        $this->xmlWriter->endElement();
667
668 4
        return $this;
669
    }
670
671
    /**
672
     * Function to create element with one attribute and value.
673
     *
674
     * @param string $node           Element name
675
     * @param string $attribute      Attribute name
676
     * @param string $attributeValue Attribute value
677
     * @param string $nodeValue      Element value
678
     *
679
     * @return AtomODataWriter
680
     */
681 3
    public function writeNodeAttributeValue(
682
        $node,
683
        $attribute,
684
        $attributeValue,
685
        $nodeValue
686
    ) {
687 3
        $this->xmlWriter->startElement($node);
688 3
        $this->xmlWriter->writeAttribute($attribute, $attributeValue);
689 3
        $this->xmlWriter->text($nodeValue);
690 3
        $this->xmlWriter->endElement();
691
692 3
        return $this;
693
    }
694
695
    /**
696
     * Function to create link element with arguments.
697
     *
698
     * @param ODataLink $link      Link object to make link element
699
     * @param Boolean   $isExpanded Is link expanded or not.
700
     *
701
     * @return AtomODataWriter
702
     */
703 3
    protected function writeLinkNode(ODataLink $link, $isExpanded)
704
    {
705 3
        $this->xmlWriter->startElement(ODataConstants::ATOM_LINK_ELEMENT_NAME);
706 3
        $this->xmlWriter->writeAttribute(
707 3
            ODataConstants::ATOM_LINK_RELATION_ATTRIBUTE_NAME,
708 3
            $link->name
709 3
        );
710 3
        if ($link->type != null) {
711
            $this->xmlWriter->writeAttribute(
712
                ODataConstants::ATOM_TYPE_ATTRIBUTE_NAME,
713
                $link->type
714
            );
715
        }
716 3
        if ($link->title != null) {
717 1
            $this->xmlWriter->writeAttribute(
718 1
                ODataConstants::ATOM_TITLE_ELELMET_NAME,
719 1
                $link->title
720 1
            );
721
        }
722 3
        $this->xmlWriter->writeAttribute(
723 3
            ODataConstants::ATOM_HREF_ATTRIBUTE_NAME,
724 3
            $link->url
725 3
        );
726 3
        if (!$isExpanded) {
727 2
            $this->xmlWriter->endElement();
728
        }
729
730 3
        return $this;
731
    }
732
733
    /**
734
     * Function to write base uri and default namespaces for top level elements.
735
     *
736
     * @return AtomODataWriter
737
     */
738 3
    public function writeBaseUriAndDefaultNamespaces()
739
    {
740 3
        $this->xmlWriter->writeAttribute(
741 3
            ODataConstants::XML_BASE_ATTRIBUTE_NAME_WITH_PREFIX,
742 3
            $this->baseUri
743 3
        );
744 3
        $this->xmlWriter->writeAttributeNs(
745 3
            ODataConstants::XMLNS_NAMESPACE_PREFIX,
746 3
            ODataConstants::ODATA_NAMESPACE_PREFIX,
747 3
            null,
748 3
            ODataConstants::ODATA_NAMESPACE
749 3
        );
750 3
        $this->xmlWriter->writeAttributeNs(
751 3
            ODataConstants::XMLNS_NAMESPACE_PREFIX,
752 3
            ODataConstants::ODATA_METADATA_NAMESPACE_PREFIX,
753 3
            null,
754 3
            ODataConstants::ODATA_METADATA_NAMESPACE
755 3
        );
756 3
        $this->xmlWriter->writeAttribute(
757 3
            ODataConstants::XMLNS_NAMESPACE_PREFIX,
758 3
            ODataConstants::ATOM_NAMESPACE
759 3
        );
760
761 3
        return $this;
762
    }
763
764
765
    /**
766
     * XML prefix for the Atom namespace.
767
     *
768
     * @var string
769
     */
770
    const ATOM_NAMESPACE_PREFIX = 'atom';
771
772
    /**
773
     * XML prefix for the Atom Publishing Protocol namespace
774
     *
775
     * @var string
776
     */
777
    const APP_NAMESPACE_PREFIX = 'app';
778
779
    /**
780
     * @param ProvidersWrapper $providers
781
     * @return IODataWriter
782
     */
783 2
    public function writeServiceDocument(ProvidersWrapper $providers) {
784 2
        $writer = $this->xmlWriter;
785 2
        $writer->startElementNs(null, ODataConstants::ATOM_PUBLISHING_SERVICE_ELEMENT_NAME, ODataConstants::APP_NAMESPACE);
786 2
        $writer->writeAttributeNs(ODataConstants::XML_NAMESPACE_PREFIX, ODataConstants::XML_BASE_ATTRIBUTE_NAME, null, $this->baseUri);
787 2
        $writer->writeAttributeNs(ODataConstants::XMLNS_NAMESPACE_PREFIX, self::ATOM_NAMESPACE_PREFIX, null, ODataConstants::ATOM_NAMESPACE);
788 2
        $writer->writeAttributeNs(ODataConstants::XMLNS_NAMESPACE_PREFIX, self::APP_NAMESPACE_PREFIX, null, ODataConstants::APP_NAMESPACE);
789
790 2
        $writer->startElement(ODataConstants::ATOM_PUBLISHING_WORKSPACE_ELEMNT_NAME);
791 2
        $writer->startElementNs(self::ATOM_NAMESPACE_PREFIX, ODataConstants::ATOM_TITLE_ELELMET_NAME, null);
792 2
        $writer->text(ODataConstants::ATOM_PUBLISHING_WORKSPACE_DEFAULT_VALUE);
793 2
        $writer->endElement();
794 2
        foreach ($providers->getResourceSets() as $resourceSetWrapper) {
795
            //start collection node
796 1
            $writer->startElement(ODataConstants::ATOM_PUBLISHING_COLLECTION_ELEMENT_NAME);
797 1
            $writer->writeAttribute(ODataConstants::ATOM_HREF_ATTRIBUTE_NAME, $resourceSetWrapper->getName());
798
            //start title node
799 1
            $writer->startElementNs(self::ATOM_NAMESPACE_PREFIX, ODataConstants::ATOM_TITLE_ELELMET_NAME, null);
800 1
            $writer->text($resourceSetWrapper->getName());
801
            //end title node
802 1
            $writer->endElement();
803
            //end collection node
804 1
            $writer->endElement();
805
        }
806
807
        //End workspace and service nodes
808 2
        $writer->endElement();
809 2
        $writer->endElement();
810
811 2
        return $this;
812
    }
813
814
    public function clear()
815
    {
816
        $this->xmlWriter = new \XMLWriter();
817
        $this->xmlWriter->openMemory();
818
        $this->xmlWriter->startDocument('1.0', 'utf-8', 'yes');
819
        $this->xmlWriter->setIndent(true);
820
    }
821
}
822