Completed
Push — master ( e3e862...b1f297 )
by Andreas
25s queued 10s
created

EntryParser::parse()   C

Complexity

Conditions 6
Paths 281

Size

Total Lines 75

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 75
rs 6.4465
c 0
b 0
f 0
cc 6
nc 281
nop 1

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types = 1);
4
5
/**
6
 * Copyright Andrea Heigl <[email protected]>
7
 *
8
 * Licenses under the MIT-license. For details see the included file LICENSE.md
9
 */
10
namespace Callingallpapers\Subcommands\Sessionize\Parser;
11
12
use Callingallpapers\Entity\Cfp;
13
use Callingallpapers\Service\ServiceContainer;
14
use Callingallpapers\Service\TimezoneService;
15
use DateTimeZone;
16
use DOMDocument;
17
use DOMXPath;
18
use Exception;
19
use GuzzleHttp\Client;
20
use InvalidArgumentException;
21
use Throwable;
22
23
class EntryParser
24
{
25
    private $cfp;
26
    
27
    private $timezoneService;
28
29
    private $geolocationService;
30
31
    public function __construct(Cfp $cfp, ServiceContainer $container)
32
    {
33
        $this->cfp = $cfp;
34
        $this->timezoneService = $container->getTimezoneService();
35
        $this->geolocationService = $container->getGeolocationService();
36
    }
37
38
    public function parse($uri): Cfp
39
    {
40
        $cfp = clone($this->cfp);
41
        try {
42
            $dom = new DOMDocument('1.0', 'UTF-8');
43
44
            $content = file_get_contents($uri);
45
            $content = mb_convert_encoding($content, 'UTF-8');
46
            $content = preg_replace('/\<!DOCTYPE[^\>]*?\>/im', '', $content);
47
48
            $dom->loadHTML(
49
                '<?xml version="1.0" encoding="UTF-8" ?>' . $content,
50
                LIBXML_NOBLANKS ^ LIBXML_NOERROR ^ LIBXML_NOENT
51
            );
52
            $dom->preserveWhiteSpace = false;
53
54
            $xpath = new DOMXPath($dom);
55
56
            $eventLocation = new Location();
57
            $cfp->location = $eventLocation->parse($dom, $xpath);
58
59
            try {
60
                $location = $this->geolocationService->getLocationForAddress($cfp->location);
61
                $cfp->latitude = $location->getLatitude();
62
                $cfp->longitude = $location->getLongitude();
63
                $timezone = $this->timezoneService->getTimezoneForLocation($location->getLatitude(), $location->getLongitude());
64
            } catch (\UnexpectedValueException $e) {
65
                error_log($e->getMessage());
66
            }
67
            $cfp->timezone = $timezone;
0 ignored issues
show
Bug introduced by
The variable $timezone does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
68
69
            $timezone = new DateTimeZone($cfp->timezone);
70
71
            $closingDateParser = new ClosingDate($timezone);
72
            $cfp->dateEnd = $closingDateParser->parse($dom, $xpath);
73
74
            $descriptionParser = new Description();
75
            $cfp->description = $descriptionParser->parse($dom, $xpath);
76
77
            $openingDateParser = new OpeningDate($timezone);
78
            try {
79
                $cfp->dateStart = $openingDateParser->parse($dom, $xpath);
80
            } catch (Exception $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
81
            }
82
83
            $cfp->uri = $uri;
84
85
            $confNameParser = new EventName();
86
            $cfp->conferenceName = $confNameParser->parse($dom, $xpath);
87
88
            $confUriParser = new EventUri();
89
            $cfp->conferenceUri  = $confUriParser->parse($dom, $xpath);
90
91
            $eventStartDate = new EventStartDate($timezone);
92
            $cfp->eventStartDate = $eventStartDate->parse($dom, $xpath);
93
94
            try {
95
                $eventEndDate      = new EventEndDate($timezone);
96
                $cfp->eventEndDate = $eventEndDate->parse($dom, $xpath);
97
            } catch (InvalidArgumentException $e) {
98
                $cfp->eventEndDate = $cfp->eventStartDate;
99
            }
100
101
            try {
102
                $iconUri = new IconUri($uri);
103
                $cfp->iconUri = $iconUri->parse($dom, $xpath);
104
            } catch (Throwable $e) {
105
                $cfp->iconUri = '';
106
            }
107
108
            return $cfp;
109
        } catch (Exception $e) {
110
            throw $e;
111
        }
112
    }
113
}
114