Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
88.24% covered (warning)
88.24%
30 / 34
80.00% covered (warning)
80.00%
12 / 15
54.55% covered (warning)
54.55%
6 / 11
40.00% covered (danger)
40.00%
2 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
ThematicEffect
88.24% covered (warning)
88.24%
30 / 34
80.00% covered (warning)
80.00%
12 / 15
54.55% covered (warning)
54.55%
6 / 11
40.00% covered (danger)
40.00%
2 / 5
19.39
0.00% covered (danger)
0.00%
0 / 1
 __construct
88.89% covered (warning)
88.89%
8 / 9
88.89% covered (warning)
88.89%
8 / 9
50.00% covered (danger)
50.00%
3 / 6
0.00% covered (danger)
0.00%
0 / 1
8.12
 getIterator
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 fetch
n/a
0 / 0
n/a
0 / 0
n/a
0 / 0
n/a
0 / 0
0
 fetchFromLocalPath
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 fetchFromUrl
90.91% covered (success)
90.91%
20 / 22
66.67% covered (warning)
66.67%
2 / 3
50.00% covered (danger)
50.00%
1 / 2
0.00% covered (danger)
0.00%
0 / 1
2.50
 isValidType
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Hsit\Webservice\Event;
3
4use ArrayIterator;
5use IteratorAggregate;
6use Traversable;
7
8use Fdsn\DataStructure\Id as DS_Id;
9use Fdsn\DataStructure\LatLon as DS_LatLon;
10
11/**
12 * Fetch ThematicEffect data from HSIT portal
13 * 
14 * @param Fdsn\DataStructure\Id $fdsnQuakeId Id quake to scan for data
15 * @param string $thematicEffect study (now only ????? are supported)
16 * @param string $localFileFullPath path to fetch local file  (if exists AND is readable)
17 */
18abstract class ThematicEffect implements IteratorAggregate {
19    protected const templateUrl = 'https://e.hsit.it/%d/%d_%s.%s';
20
21    protected DS_Id $idQuake;
22    protected string $thematicEffectStudyName;
23    protected ?string $localFileFullPath = null;
24
25    protected array $places = array();
26
27    public function __construct(DS_Id $fdsnQuakeId, string $thematicEffectStudyName, ?string $localFileFullPath = null){
28        if( ! $this->isValidType(strtolower($thematicEffectStudyName)) )
29            throw new \RuntimeException(sprintf("[%s] Type %s not valid", __METHOD__, $thematicEffectStudyName));
30
31        $this->idQuake = $fdsnQuakeId;
32        $this->thematicEffectStudyName = strtolower($thematicEffectStudyName);
33
34        if( is_null($localFileFullPath) )
35            return;
36
37        if ( ! file_exists($localFileFullPath) || ! is_readable($localFileFullPath) )
38            throw new \RuntimeException(sprintf("[%s] file %s not exists or is not readable", __METHOD__, $localFileFullPath));
39
40        $this->localFileFullPath = $localFileFullPath;
41    }
42
43    /**
44     * get all places percentage
45     * 
46     * @return array locality percentage (array of associative arrays[lat, lon, percentage, reports, placeName] )
47     */
48    public function getIterator():Traversable{ return new ArrayIterator($this->places); }
49    
50    /**
51     * fetch data from url  (remote or local - if $localFileFullPath is set in __construct)
52     * 
53     * @return int number of data found
54     */
55    abstract public function fetch():int;
56
57    /**
58     * fetch data from local path - if $localFileFullPath is set in __construct)
59     * 
60     * @return array data from file, splitted in array of lines
61     */
62    protected function fetchFromLocalPath():string { return file_get_contents( $this->localFileFullPath); }
63
64    /**
65     * fetch data from remote url path - if $localFileFullPath is set NOT in __construct)
66     * 
67     * @return array data from file, splitted in array of lines
68     */
69    protected function fetchFromUrl():string{
70        $callingClass = get_called_class();
71
72        $curlSession = curl_init();
73        curl_setopt_array($curlSession, array(
74            CURLOPT_URL         => sprintf(self::templateUrl, 
75                            $this->idQuake->value(), 
76                            $this->idQuake->value(), 
77                            $this->thematicEffectStudyName,
78                            $callingClass::fileExtension),
79            CURLOPT_HEADER         => false,
80            CURLOPT_CUSTOMREQUEST    => 'GET',
81            CURLOPT_RETURNTRANSFER    => true,
82            CURLOPT_FAILONERROR     => true
83            )
84        );
85        $downloadedData = curl_exec($curlSession);
86        $this->curlErrNum = curl_errno($curlSession);
87        $this->curlErrInfo = curl_error($curlSession);
88        curl_close($curlSession);
89
90        if(CURLE_OK != $this->curlErrNum){
91            error_log(sprintf("[%s] [CurlErr: %d] %s", __METHOD__, $this->curlErrNum, $this->curlErrInfo));
92            return -1;
93        }
94
95        return $downloadedData;
96    }
97
98    /**
99     * check if thematic effect study is supported
100     * 
101     * @param string $thematicEffectStudyName name of the thematic effect study
102     * 
103     * @return bool TRUE if is supported, FALSE otherwise
104     */
105    private function isValidType(string $thematicEffectStudyName):bool{ return preg_match("(acousticeffect|animals|china|doors|fear|forniture|hangingobjects|liquids|locality|pictures|smallobjects)", $thematicEffectStudyName); }
106
107}
108?>

Branches

Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

ThematicEffect->__construct
27    public function __construct(DS_Id $fdsnQuakeId, string $thematicEffectStudyName, ?string $localFileFullPath = null){
28        if( ! $this->isValidType(strtolower($thematicEffectStudyName)) )
29            throw new \RuntimeException(sprintf("[%s] Type %s not valid", __METHOD__, $thematicEffectStudyName));
31        $this->idQuake = $fdsnQuakeId;
32        $this->thematicEffectStudyName = strtolower($thematicEffectStudyName);
33
34        if( is_null($localFileFullPath) )
35            return;
37        if ( ! file_exists($localFileFullPath) || ! is_readable($localFileFullPath) )
37        if ( ! file_exists($localFileFullPath) || ! is_readable($localFileFullPath) )
37        if ( ! file_exists($localFileFullPath) || ! is_readable($localFileFullPath) )
38            throw new \RuntimeException(sprintf("[%s] file %s not exists or is not readable", __METHOD__, $localFileFullPath));
40        $this->localFileFullPath = $localFileFullPath;
41    }
ThematicEffect->fetchFromLocalPath
62    protected function fetchFromLocalPath():string { return file_get_contents( $this->localFileFullPath); }
ThematicEffect->fetchFromUrl
70        $callingClass = get_called_class();
71
72        $curlSession = curl_init();
73        curl_setopt_array($curlSession, array(
74            CURLOPT_URL         => sprintf(self::templateUrl, 
75                            $this->idQuake->value(), 
76                            $this->idQuake->value(), 
77                            $this->thematicEffectStudyName,
78                            $callingClass::fileExtension),
79            CURLOPT_HEADER         => false,
80            CURLOPT_CUSTOMREQUEST    => 'GET',
81            CURLOPT_RETURNTRANSFER    => true,
82            CURLOPT_FAILONERROR     => true
83            )
84        );
85        $downloadedData = curl_exec($curlSession);
86        $this->curlErrNum = curl_errno($curlSession);
87        $this->curlErrInfo = curl_error($curlSession);
88        curl_close($curlSession);
89
90        if(CURLE_OK != $this->curlErrNum){
91            error_log(sprintf("[%s] [CurlErr: %d] %s", __METHOD__, $this->curlErrNum, $this->curlErrInfo));
92            return -1;
95        return $downloadedData;
96    }
ThematicEffect->getIterator
48    public function getIterator():Traversable{ return new ArrayIterator($this->places); }
ThematicEffect->isValidType
105    private function isValidType(string $thematicEffectStudyName):bool{ return preg_match("(acousticeffect|animals|china|doors|fear|forniture|hangingobjects|liquids|locality|pictures|smallobjects)", $thematicEffectStudyName); }