ContainerMapper   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Test Coverage

Coverage 42.86%

Importance

Changes 0
Metric Value
wmc 14
eloc 14
c 0
b 0
f 0
dl 0
loc 99
ccs 9
cts 21
cp 0.4286
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A contains() 0 10 5
A addMapper() 0 3 1
A addConfigured() 0 3 1
A setFrom() 0 2 1
A setTo() 0 2 1
A add() 0 7 4
A getMappers() 0 3 1
1
<?php
2
3
/**
4
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
5
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
6
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
7
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
8
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
10
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
11
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
12
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
13
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
14
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15
 *
16
 * This software consists of voluntary contributions made by many individuals
17
 * and is licensed under the LGPL. For more information please see
18
 * <http://phing.info>.
19
 */
20
21
namespace Phing\Mapper;
22
23
use ArrayIterator;
24
use BadMethodCallException;
25
use Phing\Type\Mapper;
26
27
/**
28
 * A <code>FileNameMapper</code> that contains
29
 * other <code>FileNameMapper</code>s.
30
 *
31
 * @see FileNameMapper
32
 */
33
abstract class ContainerMapper implements FileNameMapper
34
{
35
    /**
36
     * @var Mapper[]
37
     */
38
    private $mappers = [];
39
40
    /**
41
     * Add a <code>Mapper</code>.
42
     *
43
     * @param Mapper $mapper the <code>Mapper</code> to add
44
     */
45
    public function addMapper(Mapper $mapper)
46
    {
47
        $this->add($mapper->getImplementation());
0 ignored issues
show
Bug introduced by
It seems like $mapper->getImplementation() can also be of type Phing\Mapper\ContainerMapper and Phing\Mapper\FileNameMapper; however, parameter $fileNameMapper of Phing\Mapper\ContainerMapper::add() does only seem to accept Phing\Type\Mapper, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

47
        $this->add(/** @scrutinizer ignore-type */ $mapper->getImplementation());
Loading history...
48
    }
49
50
    /**
51
     * An add configured version of the add method.
52
     * This class used to contain an add method and an
53
     * addConfiguredMapper method. Dur to ordering,
54
     * the add method was always called first. This
55
     * addConfigured method has been added to allow
56
     * chaining to work correctly.
57
     *
58
     * @param FileNameMapper $fileNameMapper a <code>FileNameMapper</code>
59
     */
60
    public function addConfigured(FileNameMapper $fileNameMapper)
61
    {
62
        $this->add($fileNameMapper);
0 ignored issues
show
Bug introduced by
$fileNameMapper of type Phing\Mapper\FileNameMapper is incompatible with the type Phing\Type\Mapper expected by parameter $fileNameMapper of Phing\Mapper\ContainerMapper::add(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

62
        $this->add(/** @scrutinizer ignore-type */ $fileNameMapper);
Loading history...
63
    }
64
65
    /**
66
     * Add a <code>FileNameMapper</code>.
67
     *
68
     * @param FileNameMapper $fileNameMapper a <code>FileNameMapper</code>
69
     *
70
     * @throws BadMethodCallException if attempting to add this
71
     *                                <code>ContainerMapper</code> to itself, or if the specified
72
     *                                <code>FileNameMapper</code> is itself a <code>ContainerMapper</code>
73
     *                                that contains this <code>ContainerMapper</code>
74
     */
75 4
    public function add(Mapper $fileNameMapper)
76
    {
77 4
        if ($this == $fileNameMapper || ($fileNameMapper instanceof ContainerMapper && $fileNameMapper->contains($this))) {
78
            throw new BadMethodCallException('Circular mapper containment condition detected');
79
        }
80
81 4
        $this->mappers[] = $fileNameMapper;
82
    }
83
84
    /**
85
     * Get the <code>List</code> of <code>Mapper</code>s.
86
     *
87
     * @return Mapper[]
88
     */
89 4
    public function getMappers()
90
    {
91 4
        return $this->mappers;
92
    }
93
94
    /**
95
     * Empty implementation.
96
     *
97
     * @param string $ignore ignored
98
     */
99 4
    public function setFrom($ignore)
100
    {
101
        //Empty
102 4
    }
103
104
    /**
105
     * Empty implementation.
106
     *
107
     * @param string $ignore ignored
108
     */
109 4
    public function setTo($ignore)
110
    {
111
        //Empty
112 4
    }
113
114
    /**
115
     * Return <code>true</code> if this <code>ContainerMapper</code> or any of
116
     * its sub-elements contains the specified <code>FileNameMapper</code>.
117
     *
118
     * @param FileNameMapper $fileNameMapper the <code>FileNameMapper</code> to search for
119
     *
120
     * @return bool
121
     */
122
    protected function contains(FileNameMapper $fileNameMapper)
123
    {
124
        $foundit = false;
125
        for ($iter = new ArrayIterator($this->mappers); $iter->valid() && !$foundit;) {
126
            $iter->next();
127
            $next = $iter->current();
128
            $foundit = ($next == $fileNameMapper || ($next instanceof ContainerMapper && $next->contains($fileNameMapper)));
129
        }
130
131
        return $foundit;
132
    }
133
}
134