Completed
Branch feature/goaop-parser (08838c)
by Alexander
03:32
created

GoAspectContainer   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 199
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 13

Test Coverage

Coverage 88.14%

Importance

Changes 8
Bugs 4 Features 0
Metric Value
c 8
b 4
f 0
dl 0
loc 199
wmc 13
lcom 2
cbo 13
ccs 52
cts 59
cp 0.8814
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 72 2
A getPointcut() 0 4 1
A registerPointcut() 0 4 1
A getAdvisor() 0 4 1
A registerAdvisor() 0 4 1
A getAspect() 0 4 1
A registerAspect() 0 6 1
A addResource() 0 5 1
A getResources() 0 4 1
A isFresh() 0 8 3
1
<?php
2
/*
3
 * Go! AOP framework
4
 *
5
 * @copyright Copyright 2012, Lisachenko Alexander <[email protected]>
6
 *
7
 * This source file is subject to the license that is bundled
8
 * with this source code in the file LICENSE.
9
 */
10
11
namespace Go\Core;
12
13
use Doctrine\Common\Annotations\FileCacheReader;
14
use ReflectionClass;
15
use Go\Aop;
16
use Go\Aop\Pointcut\PointcutLexer;
17
use Go\Aop\Pointcut\PointcutGrammar;
18
use Go\Aop\Pointcut\PointcutParser;
19
use Go\Instrument\ClassLoading\CachePathManager;
20
use Doctrine\Common\Annotations\AnnotationReader;
21
22
/**
23
 * Aspect container contains list of all pointcuts and advisors
24
 */
25
class GoAspectContainer extends Container implements AspectContainer
26
{
27
    /**
28
     * List of resources for application
29
     *
30
     * @var array
31
     */
32
    protected $resources = [];
33
34
    /**
35
     * Cached timestamp for resources
36
     *
37
     * @var integer
38
     */
39
    protected $maxTimestamp = 0;
40
41
    /**
42
     * Constructor for container
43
     */
44 10
    public function __construct()
45
    {
46
        // Register all services in the container
47
        $this->share('aspect.loader', function(Container $container) {
48 2
            $aspectLoader = new AspectLoader(
49
                $container,
0 ignored issues
show
Documentation introduced by
$container is of type object<Go\Core\Container>, but the function expects a object<Go\Core\AspectContainer>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
50 2
                $container->get('aspect.annotation.reader')
51
            );
52 2
            $lexer  = $container->get('aspect.pointcut.lexer');
53 2
            $parser = $container->get('aspect.pointcut.parser');
54
55
            // Register general aspect loader extension
56 2
            $aspectLoader->registerLoaderExtension(new GeneralAspectLoaderExtension($lexer, $parser));
57 2
            $aspectLoader->registerLoaderExtension(new IntroductionAspectExtension($lexer, $parser));
58
59 2
            return $aspectLoader;
60 10
        });
61
62
        $this->share('aspect.cached.loader', function(Container $container) {
63
            $cachedAspectLoader = new CachedAspectLoader(
64
                $container,
0 ignored issues
show
Documentation introduced by
$container is of type object<Go\Core\Container>, but the function expects a object<Go\Core\AspectContainer>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
65
                'aspect.loader',
66
                $container->get('kernel.options')
67
            );
68
69
            return $cachedAspectLoader;
70 10
        });
71
72
        $this->share('aspect.advisor.accessor', function(Container $container) {
73
            return new LazyAdvisorAccessor(
74
                $container,
0 ignored issues
show
Documentation introduced by
$container is of type object<Go\Core\Container>, but the function expects a object<Go\Core\AspectContainer>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
75
                $container->get('aspect.cached.loader')
76
            );
77 10
        });
78
79
        $this->share('aspect.advice_matcher', function(Container $container) {
80 1
            return new AdviceMatcher(
81 1
                $container->get('aspect.loader'),
82 1
                $container->get('kernel.interceptFunctions')
83
            );
84 10
        });
85
86
        $this->share('aspect.annotation.reader', function(Container $container) {
87 4
            $options = $container->get('kernel.options');
88 4
            $reader  = new AnnotationReader();
89 4
            if (!empty($options['cacheDir'])) {
90
                $reader = new FileCacheReader(
0 ignored issues
show
Deprecated Code introduced by
The class Doctrine\Common\Annotations\FileCacheReader has been deprecated with message: the FileCacheReader is deprecated and will be removed in version 2.0.0 of doctrine/annotations. Please use the {@see \Doctrine\Common\Annotations\CachedReader} instead.

This class, trait or interface has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the type will be removed from the class and what other constant to use instead.

Loading history...
91
                    $reader,
92
                    $options['cacheDir'] . DIRECTORY_SEPARATOR . '_annotations' . DIRECTORY_SEPARATOR,
93
                    $options['debug']
94
                );
95
            }
96
97 4
            return $reader;
98 10
        });
99
        $this->share('aspect.cache.path.manager', function(Container $container) {
100
            return new CachePathManager($container->get('kernel'));
101 10
        });
102
103
        // Pointcut services
104
        $this->share('aspect.pointcut.lexer', function() {
105 3
            return new PointcutLexer();
106 10
        });
107 10
        $this->share('aspect.pointcut.parser', function(Container $container) {
108 3
            return new PointcutParser(
109 3
                new PointcutGrammar(
110
                    $container,
0 ignored issues
show
Documentation introduced by
$container is of type object<Go\Core\Container>, but the function expects a object<Go\Core\AspectContainer>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
111 3
                    $container->get('aspect.annotation.reader')
112
                )
113
            );
114 10
        });
115 10
    }
116
117
    /**
118
     * Returns a pointcut by identifier
119
     *
120
     * @param string $id Pointcut identifier
121
     *
122
     * @return Aop\Pointcut
123
     */
124 1
    public function getPointcut($id)
125
    {
126 1
        return $this->get("pointcut.{$id}");
127
    }
128
129
    /**
130
     * Store the pointcut in the container
131
     *
132
     * @param Aop\Pointcut $pointcut Instance
133
     * @param string $id Key for pointcut
134
     */
135 1
    public function registerPointcut(Aop\Pointcut $pointcut, $id)
136
    {
137 1
        $this->set("pointcut.{$id}", $pointcut, array('pointcut'));
138 1
    }
139
140
    /**
141
     * Returns an advisor by identifier
142
     *
143
     * @param string $id Advisor identifier
144
     *
145
     * @return Aop\Advisor
146
     */
147
    public function getAdvisor($id)
148
    {
149
        return $this->get("advisor.{$id}");
150
    }
151
152
    /**
153
     * Store the advisor in the container
154
     *
155
     * @param Aop\Advisor $advisor Instance
156
     * @param string $id Key for advisor
157
     */
158 1
    public function registerAdvisor(Aop\Advisor $advisor, $id)
159
    {
160 1
        $this->set("advisor.{$id}", $advisor, array('advisor'));
161 1
    }
162
163
    /**
164
     * Returns an aspect by id or class name
165
     *
166
     * @param string $aspectName Aspect name
167
     *
168
     * @return Aop\Aspect
169
     */
170 1
    public function getAspect($aspectName)
171
    {
172 1
        return $this->get("aspect.{$aspectName}");
173
    }
174
175
    /**
176
     * Register an aspect in the container
177
     *
178
     * @param Aop\Aspect $aspect Instance of concrete aspect
179
     */
180 1
    public function registerAspect(Aop\Aspect $aspect)
181
    {
182 1
        $refAspect = new ReflectionClass($aspect);
183 1
        $this->set("aspect.{$refAspect->name}", $aspect, array('aspect'));
184 1
        $this->addResource($refAspect->getFileName());
185 1
    }
186
187
    /**
188
     * Add an AOP resource to the container
189
     *
190
     * Resources is used to check the freshness of AOP cache
191
     */
192 2
    public function addResource($resource)
193
    {
194 2
        $this->resources[]  = $resource;
195 2
        $this->maxTimestamp = 0;
196 2
    }
197
198
    /**
199
     * Returns list of AOP resources
200
     *
201
     * @return array
202
     */
203
    public function getResources()
204
    {
205
        return $this->resources;
206
    }
207
208
    /**
209
     * Checks the freshness of AOP cache
210
     *
211
     * @param integer $timestamp
212
     *
213
     * @return bool Whether or not concrete file is fresh
214
     */
215 1
    public function isFresh($timestamp)
216
    {
217 1
        if (!$this->maxTimestamp && !empty($this->resources)) {
218 1
            $this->maxTimestamp = max(array_map('filemtime', $this->resources));
219
        }
220
221 1
        return $this->maxTimestamp <= $timestamp;
222
    }
223
}
224