HeaderFieldsAggregator   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 80
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 5
dl 0
loc 80
ccs 24
cts 24
cp 1
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A getHeaderFields() 0 9 2
A getHeaderField() 0 6 2
A createMappingHeaderField() 0 12 3
A createGenericHeaderField() 0 3 1
1
<?php
2
3
/*
4
 * Copyright (c) 2011-2015, Celestino Diaz <[email protected]>
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
25
namespace Brickoo\Component\Http\Header\Aggregator;
26
27
use Brickoo\Component\Http\Header\GenericHeaderField;
28
use Brickoo\Component\Http\HttpHeaderFieldNameNormalizer;
29
use Brickoo\Component\Http\Header\Aggregator\Exception\HeaderFieldClassNotFoundException;
30
use Brickoo\Component\Http\Header\Aggregator\Strategy\HeaderFieldsAggregatorStrategy;
31
32
/**
33
 * HeaderFieldsAggregator
34
 *
35
 * Implements a http header fields aggregator.
36
 * @author Celestino Diaz <[email protected]>
37
 */
38
class HeaderFieldsAggregator {
39
40
    use HttpHeaderFieldNameNormalizer;
41
42
    /** @var \Brickoo\Component\Http\Header\Aggregator\HeaderFieldClassMap */
43
    private $headerFieldClassMap;
44
45
    /** @var \Brickoo\Component\Http\Header\Aggregator\Strategy\HeaderFieldsAggregatorStrategy */
46
    private $resolverStrategy;
47
48
    /**
49
     * Class constructor.
50
     * @param \Brickoo\Component\Http\Header\Aggregator\HeaderFieldClassMap $headerFieldClassMap
51
     * @param \Brickoo\Component\Http\Header\Aggregator\Strategy\HeaderFieldsAggregatorStrategy $resolverStrategy
52
     */
53 2
    public function __construct(HeaderFieldClassMap $headerFieldClassMap, HeaderFieldsAggregatorStrategy $resolverStrategy) {
54 2
        $this->headerFieldClassMap = $headerFieldClassMap;
55 2
        $this->resolverStrategy = $resolverStrategy;
56 2
    }
57
58
    /**
59
     * Return a collection of http headers.
60
     * Duplicate header fields will be overridden.
61
     * @throws \Brickoo\Component\Http\Header\Aggregator\Exception\HeaderFieldClassNotFoundException
62
     * @return array
63
     */
64 2
    public function getHeaderFields() {
65 2
        $aggregatedHeaderFields = $this->normalize($this->resolverStrategy->getHeaderFields());
66
67 2
        $headerFields = [];
68 2
        foreach ($aggregatedHeaderFields as $headerFieldName => $headerFieldValue) {
69 2
            $headerFields[] = $this->getHeaderField($headerFieldName, $headerFieldValue);
70 1
        }
71 1
        return $headerFields;
72
    }
73
74
    /**
75
     * Return the corresponding header field instance.
76
     * @param string $headerFieldName
77
     * @param string $headerFieldValue
78
     * @return \Brickoo\Component\Http\HttpHeaderField
79
     */
80 2
    private function getHeaderField($headerFieldName, $headerFieldValue) {
81 2
        if ($this->headerFieldClassMap->hasClass($headerFieldName)) {
82 2
            return $this->createMappingHeaderField($headerFieldName, $headerFieldValue);
83
        }
84 1
        return $this->createGenericHeaderField($headerFieldName, $headerFieldValue);
85
    }
86
87
    /**
88
     * Create a header field instance from a mapping class.
89
     * @param string $headerFieldName
90
     * @param string $headerFieldValue
91
     * @throws \Brickoo\Component\Http\Header\Aggregator\Exception\HeaderFieldClassNotFoundException
92
     * @return \Brickoo\Component\Http\HttpHeaderField
93
     */
94 2
    private function createMappingHeaderField($headerFieldName, $headerFieldValue) {
95
        try {
96 2
            $headerFieldClass = $this->headerFieldClassMap->getClass($headerFieldName);
97 2
            if (!class_exists($headerFieldClass)) {
98 1
                throw new \Exception("Unable to load mapping header class.");
99
            }
100
        }
101 2
        catch (\Exception $exception) {
102 1
            throw new HeaderFieldClassNotFoundException($headerFieldName, $exception);
103
        }
104 1
        return new $headerFieldClass($headerFieldValue);
105
    }
106
107
    /**
108
     * Create a generic header field.
109
     * @param string $headerFieldName
110
     * @param string $headerFieldValue
111
     * @return \Brickoo\Component\Http\Header\GenericHeaderField
112
     */
113 1
    private function createGenericHeaderField($headerFieldName, $headerFieldValue) {
114 1
        return new GenericHeaderField($headerFieldName, $headerFieldValue);
115
    }
116
117
}
118