Completed
Pull Request — master (#137)
by Kristof
15:23 queued 10:42
created

EventItemFactory   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 70
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Importance

Changes 5
Bugs 0 Features 1
Metric Value
wmc 7
c 5
b 0
f 1
lcom 0
cbo 2
dl 0
loc 70
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A createEventFromCdbXml() 0 17 2
B splitKeywordTagOnSemiColon() 0 28 4
A isEventOlderThanSplitKeywordFix() 0 5 1
1
<?php
2
/**
3
 * @file
4
 */
5
6
namespace CultuurNet\UDB3\Cdb;
7
8
use CultureFeed_Cdb_Data_Keyword;
9
use CultureFeed_Cdb_Item_Event;
10
use CultureFeed_Cdb_ParseException;
11
use SimpleXMLElement;
12
13
class EventItemFactory
14
{
15
    /**
16
     * @param string $namespaceUri
17
     * @param string $cdbXml
18
     * @throws CultureFeed_Cdb_ParseException
19
     * @return CultureFeed_Cdb_Item_Event
20
     */
21
    public static function createEventFromCdbXml($namespaceUri, $cdbXml)
22
    {
23
        $udb2SimpleXml = new SimpleXMLElement(
24
            $cdbXml,
25
            0,
26
            false,
27
            $namespaceUri
28
        );
29
30
        $event = CultureFeed_Cdb_Item_Event::parseFromCdbXml($udb2SimpleXml);
31
32
        if (self::isEventOlderThanSplitKeywordFix($event)) {
33
            $event = self::splitKeywordTagOnSemiColon($event);
34
        }
35
36
        return $event;
37
    }
38
39
    /**
40
     * UDB2 contained a bug that allowed for a keyword to have a semicolon.
41
     * @param CultureFeed_Cdb_Item_Event $event
42
     * @return CultureFeed_Cdb_Item_Event
43
     */
44
    private static function splitKeywordTagOnSemiColon(
45
        CultureFeed_Cdb_Item_Event $event
46
    ) {
47
        $event = clone $event;
48
49
        /**
50
         * @var CultureFeed_Cdb_Data_Keyword[] $keywords
51
         */
52
        $keywords = $event->getKeywords(true);
53
54
        foreach ($keywords as $keyword) {
55
            $individualKeywords = explode(';', $keyword->getValue());
56
57
            if (count($individualKeywords) > 1) {
58
                $event->deleteKeyword($keyword);
59
60
                foreach ($individualKeywords as $individualKeyword) {
61
                    $newKeyword = new CultureFeed_Cdb_Data_Keyword(
62
                        trim($individualKeyword),
63
                        $keyword->isVisible()
64
                    );
65
                    $event->addKeyword($newKeyword);
66
                }
67
            }
68
        }
69
70
        return $event;
71
    }
72
73
    /**
74
     * @param CultureFeed_Cdb_Item_Event $event
75
     * @return bool
76
     */
77
    private static function isEventOlderThanSplitKeywordFix(
78
        CultureFeed_Cdb_Item_Event $event
79
    ) {
80
        return $event->getLastUpdated() < '2016-03-10T00:00:00';
81
    }
82
}
83