Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
32 / 32
100.00% covered (success)
100.00%
19 / 19
36.84% covered (danger)
36.84%
7 / 19
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
Event
100.00% covered (success)
100.00%
32 / 32
100.00% covered (success)
100.00%
19 / 19
36.84% covered (danger)
36.84%
7 / 19
100.00% covered (success)
100.00%
4 / 4
41.48
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
5 / 5
75.00% covered (warning)
75.00%
3 / 4
100.00% covered (success)
100.00%
1 / 1
3.14
 fetch
100.00% covered (success)
100.00%
4 / 4
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
 formatIsValid
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
 parse
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
12 / 12
15.38% covered (danger)
15.38%
2 / 13
100.00% covered (success)
100.00%
1 / 1
27.81
1<?php
2namespace Fdsn\Webservices\Event;
3
4use ArrayIterator;
5use IteratorAggregate;
6use Traversable;
7
8use Fdsn\Webservices\Webservice as Fdsnws_Webservice;
9
10use Fdsn\Webservices\Event\Structs\Author as DS_Author;
11use Fdsn\Webservices\Event\Structs\DateTimeRange as DS_DateTimeRange;
12use Fdsn\Webservices\Event\Structs\Depth as DS_Depth;
13use Fdsn\Webservices\Event\Structs\DepthRange as DS_DepthRange;
14use Fdsn\Webservices\Event\Structs\Epicenter as DS_Epicenter;
15use Fdsn\Webservices\Event\Structs\EventType as DS_EventType;
16use Fdsn\Webservices\Event\Structs\Id as DS_Id;
17use Fdsn\Webservices\Event\Structs\LatLon as DS_LatLon;
18use Fdsn\Webservices\Event\Structs\LatLonRange as DS_LatLonRange;
19use Fdsn\Webservices\Event\Structs\Location as DS_Location;
20use Fdsn\Webservices\Event\Structs\Magnitude as DS_Magnitude;
21use Fdsn\Webservices\Event\Structs\MagnitudeRange as DS_MagnitudeRange;
22use Fdsn\Webservices\Event\Structs\Quake as DS_Quake;
23use Fdsn\Webservices\Event\Structs\Radius as DS_Radius;
24use Fdsn\Webservices\Event\Structs\RadiusRange as DS_RadiusRange;
25
26/**
27 * PHP library to access FDSN Webservices and request Event (earthquake) information in text format
28 * @see    https://www.fdsn.org/webservices/fdsnws-event-1.2.pdf FDSN official documentation
29 *
30 * @param string     $format     Accepted output kind format
31 * @param string     $user        Set your app name
32 * @param string     $fdns_server    Fdns webservice domain name (default: webservices.ms.ingv.it)
33 */
34class Event extends Fdsnws_Webservice implements IteratorAggregate {
35    private string $format = 'text';
36    private string $user;
37
38    protected string $url;
39    protected string $eventList;
40    protected int $counter = 0;
41    protected array $parameters = array();
42
43    function __construct( string $format, ?string $user, string $fdns_server = Fdsnws_Webservice::defaultFdsnServer){
44
45        if( $this->formatIsValid($format) )
46            $this->format = $format; //otherwise it has default value
47
48        $this->user = $user;
49        
50        $this->parameters['format'] = sprintf("format=%s", $this->format);
51        if ( ! empty($user) ) //not implemented/accepted on every service
52            $this->parameters['user'] = sprintf("user=%s", $this->user);
53
54
55        parent::__construct($fdns_server);
56    }
57    
58    /**
59     * Apply all filter and DO the request to the Official ONT Webservice
60     * @return int         Return the number of elems found
61     */
62    public function fetch():int{
63        $this->url = sprintf('%s/query?%s', $this->webserviceFullPath, implode('&', $this->parameters));
64        $response = $this->getFetch( $this->url );
65
66        $this->parse($response);
67
68        return $this->counter;
69    }
70    
71    /**
72     * Check if format set is valid
73     * @return bool        format is valid?
74     */
75    protected function formatIsValid(string $format):bool{ 
76        return preg_match('/text/', $format); 
77
78        //TODO: 2024-08-13: xml format is still not supported, but i'll fix
79        //return preg_match('/(text|xml)/', $format);  
80    }
81
82//    /**
83//     * Compose URL before do the request
84//     * 
85//     * @return string composed URL
86//     */
87//    protected function composeURL():string{
88//        return sprintf('%s/query?%s', $this->webserviceFullPath, implode('&', $this->parameters));
89//    }
90    
91    /**
92     * Loop over found elems found (in text format) and convert the to \Fdsn\DataStructure\Quake obj
93     */
94    protected function parse(string $response):int {
95        date_default_timezone_set('UTC');
96
97        if( preg_match('/^Error/', $response) )
98            throw new \RuntimeException( sprintf("Error fetching url: %s\nError reported is:\n%s", $this->url, $response) );
99
100        $events = preg_split('/\R/',  $response);
101
102        foreach($events as $details){
103            if(empty($details) || '#' == $details[0]){
104                //error_log('[INF] no data in this event line');
105                continue;
106            }
107
108            list($adsIdEvent, $utcTime, $lat, $lon, $depth, $author, $catalog, $contributor, $contributorID, $magPrefType, $magPrefValue, $magAuthor, $locationName, $eventType) = preg_split('/\|/', $details);
109            $this->arrayOfResults[] = new DS_Quake(
110                new DS_Id($adsIdEvent),
111                new \DateTime($utcTime),
112                new DS_Location($locationName),
113                new DS_Magnitude($magPrefType, $magPrefValue),
114                new DS_Epicenter(new DS_LatLon($lat, $lon), new DS_Depth($depth)),
115                new DS_Author($author),
116                new DS_EventType($eventType)
117            );
118        }
119
120        if( 1 == count($this->arrayOfResults) )
121            $this->event = $this->arrayOfResults[0];
122        
123        return $this->numRows();
124    }
125}

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.

Event->__construct
43    function __construct( string $format, ?string $user, string $fdns_server = Fdsnws_Webservice::defaultFdsnServer){
44
45        if( $this->formatIsValid($format) )
46            $this->format = $format; //otherwise it has default value
47
48        $this->user = $user;
48        $this->user = $user;
49        
50        $this->parameters['format'] = sprintf("format=%s", $this->format);
51        if ( ! empty($user) ) //not implemented/accepted on every service
52            $this->parameters['user'] = sprintf("user=%s", $this->user);
53
54
55        parent::__construct($fdns_server);
55        parent::__construct($fdns_server);
56    }
Event->fetch
63        $this->url = sprintf('%s/query?%s', $this->webserviceFullPath, implode('&', $this->parameters));
64        $response = $this->getFetch( $this->url );
65
66        $this->parse($response);
67
68        return $this->counter;
69    }
Event->formatIsValid
75    protected function formatIsValid(string $format):bool{ 
76        return preg_match('/text/', $format); 
77
78        //TODO: 2024-08-13: xml format is still not supported, but i'll fix
79        //return preg_match('/(text|xml)/', $format);  
80    }
Event->parse
94    protected function parse(string $response):int {
95        date_default_timezone_set('UTC');
96
97        if( preg_match('/^Error/', $response) )
98            throw new \RuntimeException( sprintf("Error fetching url: %s\nError reported is:\n%s", $this->url, $response) );
100        $events = preg_split('/\R/',  $response);
101
102        foreach($events as $details){
102        foreach($events as $details){
103            if(empty($details) || '#' == $details[0]){
103            if(empty($details) || '#' == $details[0]){
103            if(empty($details) || '#' == $details[0]){
105                continue;
102        foreach($events as $details){
103            if(empty($details) || '#' == $details[0]){
104                //error_log('[INF] no data in this event line');
105                continue;
106            }
107
108            list($adsIdEvent, $utcTime, $lat, $lon, $depth, $author, $catalog, $contributor, $contributorID, $magPrefType, $magPrefValue, $magAuthor, $locationName, $eventType) = preg_split('/\|/', $details);
102        foreach($events as $details){
103            if(empty($details) || '#' == $details[0]){
104                //error_log('[INF] no data in this event line');
105                continue;
106            }
107
108            list($adsIdEvent, $utcTime, $lat, $lon, $depth, $author, $catalog, $contributor, $contributorID, $magPrefType, $magPrefValue, $magAuthor, $locationName, $eventType) = preg_split('/\|/', $details);
109            $this->arrayOfResults[] = new DS_Quake(
110                new DS_Id($adsIdEvent),
111                new \DateTime($utcTime),
112                new DS_Location($locationName),
113                new DS_Magnitude($magPrefType, $magPrefValue),
114                new DS_Epicenter(new DS_LatLon($lat, $lon), new DS_Depth($depth)),
115                new DS_Author($author),
116                new DS_EventType($eventType)
117            );
118        }
119
120        if( 1 == count($this->arrayOfResults) )
121            $this->event = $this->arrayOfResults[0];
122        
123        return $this->numRows();
123        return $this->numRows();
124    }