Completed
Push — master ( 5cd7db...4c6168 )
by Sebastien
02:32
created

Update::getDispatcher()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 8
rs 9.4286
cc 2
eloc 4
nc 2
nop 0
1
<?php
2
3
namespace Cerbere\Action;
4
5
use Cerbere\Event\CerbereDoActionEvent;
6
use Cerbere\Event\CerbereEvents;
7
use Cerbere\Model\Project;
8
use Cerbere\Model\Release;
9
use Cerbere\Model\ReleaseHistory;
10
use Doctrine\Common\Cache\CacheProvider;
11
use Symfony\Component\EventDispatcher\EventDispatcher;
12
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
13
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
14
15
/**
16
 * Class Update
17
 *
18
 * @package Cerbere\Action
19
 */
20
class Update implements ActionInterface
21
{
22
    /**
23
     * @var CacheProvider
24
     */
25
    protected $cache;
26
27
    /**
28
     * @var EventDispatcherInterface
29
     */
30
    protected $dispatcher;
31
32
    /**
33
     * Update constructor.
34
     */
35
    public function __construct()
36
    {
37
38
    }
39
40
    /**
41
     * @param EventSubscriberInterface $listener
42
     */
43
    public function addLoggerListener(EventSubscriberInterface $listener)
44
    {
45
        $this->getDispatcher()->addSubscriber($listener);
46
    }
47
48
    /**
49
     * Gets the dispatcher used by this library to dispatch events.
50
     *
51
     * @return EventDispatcherInterface
52
     */
53
    public function getDispatcher()
54
    {
55
        if (!isset($this->dispatcher)) {
56
            $this->dispatcher = new EventDispatcher();
57
        }
58
59
        return $this->dispatcher;
60
    }
61
62
    /**
63
     * Sets the dispatcher used by this library to dispatch events.
64
     *
65
     * @param EventDispatcherInterface $dispatcher
66
     *   The Symfony event dispatcher object.
67
     */
68
    public function setDispatcher(EventDispatcherInterface $dispatcher)
69
    {
70
        $this->dispatcher = $dispatcher;
71
    }
72
73
    /**
74
     * @return void
75
     */
76
    public function prepare()
77
    {
78
    }
79
80
    /**
81
     * @param array $projects
82
     * @param array $options
83
     *
84
     * @return array
85
     */
86
    public function process(array $projects, $options = array())
87
    {
88
        $options += array('cache' => true, 'level' => 'all', 'flat' => false);
89
        $reports = array();
90
91
        $release_history = new ReleaseHistory($this->cache);
92
93
        /** @var Project $project */
94
        foreach ($projects as $project) {
95
            $event = new CerbereDoActionEvent($this, $project);
96
            $this->getDispatcher()->dispatch(CerbereEvents::CERBERE_DO_ACTION, $event);
97
98
            $release_history->prepare($project, $options['cache']);
99
            $release_history->compare($project);
100
101
            switch ($options['level']) {
102
                case 'security':
103
                    $level = ReleaseHistory::UPDATE_NOT_SECURE;
104
                    break;
105
                case 'unsupported':
106
                    $level = ReleaseHistory::UPDATE_NOT_SUPPORTED;
107
                    break;
108
                case 'update':
109
                    $level = ReleaseHistory::UPDATE_NOT_CURRENT;
110
                    break;
111
                default:
112
                    $level = ReleaseHistory::UPDATE_CURRENT;
113
            }
114
115
            if ($project->getStatus() <= $level) {
116
                $reports[$project->getProject()] = $this->generateReport($project, $release_history, $options['flat']);
117
            }
118
        }
119
120
        return $reports;
121
    }
122
123
    /**
124
     * @param \Cerbere\Model\Project $project
125
     * @param \Cerbere\Model\ReleaseHistory $release_history
126
     * @param boolean $flat
127
     * @return array
128
     */
129
    protected function generateReport(Project $project, ReleaseHistory $release_history, $flat = false)
130
    {
131
        $report = array(
132
          'project'      => $project->getProject(),
133
          'version'      => $project->getVersion(),
134
          'version_date' => $project->getDatestamp(),
135
          'recommended'  => null,
136
          'dev'          => null,
137
          'status'       => $project->getStatus(),
138
          'status_label' => ReleaseHistory::getStatusLabel($project->getStatus()),
139
          'reason'       => '',
140
        );
141
142
        if ($flat) {
143
            $report['recommended'] = $project->getRecommended();
144
            $report['dev'] = $project->getDevVersion();
145
        } else {
146
            if ($release = $release_history->getRelease($project->getRecommended())) {
147
                $report['recommended'] = $this->getReportFromRelease($release);
148
            }
149
150
            if ($release = $release_history->getRelease($project->getDevVersion())) {
151
                $report['dev'] = $this->getReportFromRelease($release);
152
            }
153
        }
154
155
        if ($reason = $project->getReason()) {
156
            $report['reason'] = $reason;
157
        }
158
159
        return $report;
160
    }
161
162
    /**
163
     * @param \Cerbere\Model\Release $release
164
     * @return array
165
     */
166
    protected function getReportFromRelease(Release $release)
167
    {
168
        return array(
169
          'version'       => $release->getVersion(),
170
          'datestamp'     => $release->getDatestamp(),
171
          'release_link'  => $release->getReleaseLink(),
172
          'download_link' => $release->getDownloadLink(),
173
          'filesize'      => $release->getFilesize(),
174
        );
175
    }
176
177
    /**
178
     * @return CacheProvider
179
     */
180
    public function getCache()
181
    {
182
        return $this->cache;
183
    }
184
185
    /**
186
     * @param CacheProvider $cache
187
     */
188
    public function setCache($cache)
189
    {
190
        $this->cache = $cache;
191
    }
192
193
    /**
194
     * @return string
195
     */
196
    public function getCode()
197
    {
198
        return 'update';
199
    }
200
}
201