Passed
Push — main ( b7649a...398f47 )
by Michiel
06:32
created

StopwatchTask::lap()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 4
ccs 0
cts 3
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
/**
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the LGPL. For more information please see
17
 * <http://phing.info>.
18
 */
19
20
namespace Phing\Task\Optional;
21
22
use Phing\Dispatch\DispatchTask;
23
use Phing\Exception\BuildException;
24
use Phing\Project;
25
use Symfony\Component\Stopwatch\Stopwatch;
26
27
/**
28
 * Stopwatch.
29
 *
30
 * @author  Siad Ardroumli <[email protected]>
31
 * @package phing.tasks.ext.stopwatch
32
 */
33
class StopwatchTask extends DispatchTask
34
{
35
    /**
36
     * Name of the timer.
37
     *
38
     * @var string $name
39
     */
40
    private $name = '';
41
42
    /**
43
     * Category of the timer.
44
     *
45
     * @var string $category optional
46
     */
47
    private $category = '';
48
49
    /**
50
     * Holds an instance of Stopwatch.
51
     *
52
     * @var Stopwatch $timer
53
     */
54
    private static $timer = null;
55
56
    /**
57
     * Initialize Task.
58
     *
59
     * @return void
60
     */
61
    public function init()
62
    {
63
        if (!class_exists('\\Symfony\\Component\\Stopwatch\\Stopwatch')) {
64
            throw new BuildException("StopwatchTask requires symfony/stopwatch to be installed.");
65
        }
66
67
        $this->setAction('start');
68
    }
69
70
    /**
71
     * Get the stopwatch instance.
72
     *
73
     * @return Stopwatch
74
     */
75
    private function getStopwatchInstance()
76
    {
77
        if (self::$timer === null) {
78
            self::$timer = new Stopwatch();
79
        }
80
81
        return self::$timer;
82
    }
83
84
    /**
85
     * Start timer.
86
     *
87
     * @return void
88
     */
89
    public function start()
90
    {
91
        $timer = $this->getStopwatchInstance();
92
        $timer->start($this->name, $this->category);
93
    }
94
95
    /**
96
     * Stop timer.
97
     *
98
     * @return void
99
     */
100
    public function stop()
101
    {
102
        $timer = $this->getStopwatchInstance();
103
        $event = $timer->stop($this->name);
104
105
        foreach ($event->getPeriods() as $period) {
106
            $this->log(
107
                'Starttime: ' . $period->getStartTime() . ' - Endtime: ' . $period->getEndTime() . ' - Duration: ' . $period->getDuration() . ' - Memory: ' . $period->getMemory(),
108
                Project::MSG_INFO
109
            );
110
        }
111
112
        $this->log('Name:       ' . $this->name, Project::MSG_INFO);
113
        $this->log('Category:   ' . $event->getCategory(), Project::MSG_INFO);
114
        $this->log('Origin:     ' . $event->getOrigin(), Project::MSG_INFO);
115
        $this->log('Start time: ' . $event->getStartTime(), Project::MSG_INFO);
116
        $this->log('End time:   ' . $event->getEndTime(), Project::MSG_INFO);
117
        $this->log('Duration:   ' . $event->getDuration(), Project::MSG_INFO);
118
        $this->log('Memory:     ' . $event->getMemory(), Project::MSG_INFO);
119
    }
120
121
    /**
122
     * Measure lap time.
123
     *
124
     * @return void
125
     */
126
    public function lap()
127
    {
128
        $timer = $this->getStopwatchInstance();
129
        $timer->lap($this->name);
130
    }
131
132
    /**
133
     * Set the name of the stopwatch.
134
     *
135
     * @param string $name the name of the stopwatch timer
136
     *
137
     * @return void
138
     */
139
    public function setName($name)
140
    {
141
        $this->name = $name;
142
    }
143
144
    /**
145
     * Set the category of the stopwatch.
146
     *
147
     * @param string $category
148
     *
149
     * @return void
150
     */
151
    public function setCategory($category)
152
    {
153
        $this->category = $category;
154
    }
155
156
    /**
157
     * The main entry point
158
     *
159
     * @return void
160
     *
161
     * @throws BuildException
162
     */
163
    public function main()
164
    {
165
        switch ($this->getAction()) {
166
            case "start":
167
                $this->start();
168
                break;
169
            case "stop":
170
                $this->stop();
171
                break;
172
            case "lap":
173
                $this->lap();
174
                break;
175
            default:
176
                throw new BuildException('action should be one of start, stop, lap.');
177
        }
178
    }
179
}
180