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

Cerbere::run()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 2
Metric Value
c 4
b 0
f 2
dl 0
loc 26
rs 8.8571
cc 1
eloc 12
nc 1
nop 3
1
<?php
2
3
namespace Cerbere;
4
5
use Cerbere\Action\ActionInterface;
6
use Cerbere\Event\CerbereEvents;
7
use Cerbere\Event\CerbereFileDiscoverEvent;
8
use Cerbere\Event\CerbereLoggerListener;
9
use Cerbere\Event\CerberePostActionEvent;
10
use Cerbere\Event\CerberePreActionEvent;
11
use Cerbere\Event\DispatcherAwareInterface;
12
use Cerbere\Model\Job;
13
use Cerbere\Model\Project;
14
use Cerbere\Parser\ParserInterface;
15
use Symfony\Component\EventDispatcher\EventDispatcher;
16
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
17
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
18
19
/**
20
 * Class Cerbere
21
 *
22
 * @package Cerbere
23
 */
24
class Cerbere implements DispatcherAwareInterface
25
{
26
    /**
27
     * @var ParserInterface[]
28
     */
29
    protected $parsers = array();
30
31
    /**
32
     * @var EventDispatcherInterface
33
     */
34
    protected $dispatcher;
35
36
    /**
37
     */
38
    public function __construct()
39
    {
40
    }
41
42
    /**
43
     * @param EventSubscriberInterface $listener
44
     */
45
    public function addLoggerListener(EventSubscriberInterface $listener)
46
    {
47
        $this->getDispatcher()->addSubscriber($listener);
48
    }
49
50
    /**
51
     * Gets the dispatcher used by this library to dispatch events.
52
     *
53
     * @return EventDispatcherInterface
54
     */
55
    public function getDispatcher()
56
    {
57
        if (!isset($this->dispatcher)) {
58
            $this->dispatcher = new EventDispatcher();
59
        }
60
61
        return $this->dispatcher;
62
    }
63
64
    /**
65
     * Sets the dispatcher used by this library to dispatch events.
66
     *
67
     * @param EventDispatcherInterface $dispatcher
68
     *   The Symfony event dispatcher object.
69
     *
70
     * @return $this
71
     */
72
    public function setDispatcher(EventDispatcherInterface $dispatcher)
73
    {
74
        $this->dispatcher = $dispatcher;
75
    }
76
77
    /**
78
     * @param ParserInterface $parser
79
     *
80
     * @return $this
81
     */
82
    public function addParser(ParserInterface $parser)
83
    {
84
        $this->parsers[$parser->getCode()] = $parser;
85
86
        return $this;
87
    }
88
89
    /**
90
     * @param string $code
91
     *
92
     * @return ParserInterface|null
93
     */
94
    public function getParser($code)
95
    {
96
        if (isset($this->parsers[$code])) {
97
            return $this->parsers[$code];
98
        }
99
100
        return null;
101
    }
102
103
    /**
104
     * @param Job             $job
105
     * @param ActionInterface $action
106
     * @param array           $options
107
     *
108
     * @return array
109
     */
110
    public function run(Job $job, ActionInterface $action, $options = array())
111
    {
112
        // Download remote project if remote.
113
        $dir = $job->checkoutRepository();
114
115
        // Move to project folder.
116
        $currentDirectory = getcwd();
117
        chdir($dir);
118
119
        // Load projects from repository.
120
        $projects = $this->getProjectsFromPatterns($job->getPatterns(), $job->isPatternNested());
121
122
        $event = new CerberePreActionEvent($this, $job, $action, $projects);
123
        $this->getDispatcher()->dispatch(CerbereEvents::CERBERE_PRE_ACTION, $event);
124
125
        // Do cerbere action.
126
        $report = $action->process($projects, $options);
127
128
        $event = new CerberePostActionEvent($this, $job, $action, $projects);
129
        $this->getDispatcher()->dispatch(CerbereEvents::CERBERE_POST_ACTION, $event);
130
131
        // Restore initial directory.
132
        chdir($currentDirectory);
133
134
        return $report;
135
    }
136
137
    /**
138
     * @param array      $patterns
139
     * @param bool|false $nested
140
     *
141
     * @return Project[]
142
     */
143
    public function getProjectsFromPatterns($patterns, $nested = false)
144
    {
145
        $projects = array();
146
147
        foreach ($patterns as $pattern) {
148
            $projects = array_merge($projects, $this->getProjectsFromPattern($pattern, $nested));
149
        }
150
151
        return $projects;
152
    }
153
154
    /**
155
     * @param string     $pattern
156
     * @param bool|false $nested
157
     *
158
     * @return Project[]
159
     */
160
    public function getProjectsFromPattern($pattern, $nested = false)
161
    {
162
        $projects   = array();
163
        $dispatcher = $this->getDispatcher();
164
        $files      = $this->getFilesFromPattern($pattern, $nested);
165
166
        foreach ($files as $file) {
167
            foreach ($this->getParsers() as $parser) {
168
                if ($parser->supportedFile($file)) {
169
                    $event = new CerbereFileDiscoverEvent($this, $file, $parser);
170
                    $dispatcher->dispatch(CerbereEvents::CERBERE_FILE_DISCOVERED, $event);
171
                    $parser->processFile($file);
172
                    $projects = array_merge($projects, $parser->getProjects());
173
                }
174
            }
175
        }
176
177
        return $projects;
178
    }
179
180
    /**
181
     * @param string $pattern
182
     * @param bool|false $nested
183
     * @param int $flags
184
     *
185
     * @return array
186
     */
187
    public function getFilesFromPattern($pattern, $nested = false, $flags = 0)
188
    {
189
        $files = glob($pattern, $flags);
190
191
        if ($nested) {
192
            foreach (glob(dirname($pattern) . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR | GLOB_NOSORT) as $dir) {
193
                $files = array_merge($files, $this->getFilesFromPattern($dir . DIRECTORY_SEPARATOR . basename($pattern), $nested, $flags));
194
            }
195
        }
196
197
        return $files;
198
    }
199
200
    /**
201
     * @return ParserInterface[]
202
     */
203
    public function getParsers()
204
    {
205
        return $this->parsers;
206
    }
207
}
208