Completed
Push — master ( aeb3a4...04afb5 )
by brian
01:57
created

Negotiation   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 193
Duplicated Lines 0 %

Coupling/Cohesion

Dependencies 6

Test Coverage

Coverage 100%
Metric Value
wmc 12
cbo 6
dl 0
loc 193
ccs 35
cts 35
cp 1
rs 10

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A charsetBest() 0 4 1
A charsetAll() 0 4 1
A encodingBest() 0 4 1
A encodingAll() 0 4 1
A languageBest() 0 4 1
A languageAll() 0 4 1
A mimeBest() 0 4 1
A mimeAll() 0 4 1
A genericBest() 0 7 1
A genericAll() 0 7 1
A parsePreferences() 0 6 1
1
<?php
2
3
/**
4
 * @copyright   (c) 2006-present brian ridley
5
 * @author      brian ridley <[email protected]>
6
 * @license     http://opensource.org/licenses/MIT MIT
7
 */
8
9
namespace ptlis\ConNeg;
10
11
use ptlis\ConNeg\Negotiator\Negotiator;
12
use ptlis\ConNeg\Parser\FieldParser;
13
use ptlis\ConNeg\Parser\FieldTokenizer;
14
use ptlis\ConNeg\Preference\Builder\MimePreferenceBuilder;
15
use ptlis\ConNeg\Preference\Builder\PreferenceBuilder;
16
use ptlis\ConNeg\Preference\Matched\MatchedPreference;
17
use ptlis\ConNeg\Preference\Matched\MatchedPreferenceInterface;
18
use ptlis\ConNeg\Preference\PreferenceInterface;
19
20
/**
21
 * Class providing a simple API through which content negotiation is performed.
22
 */
23
class Negotiation
24
{
25
    /**
26
     * @var FieldTokenizer
27
     */
28
    private $tokenizer;
29
30
    /**
31
     * @var FieldParser
32
     */
33
    private $parser;
34
35
    /**
36
     * @var Negotiator
37
     */
38
    private $negotiator;
39
40
41
    /**
42
     * Constructor, initialise factories.
43
     */
44 76
    public function __construct()
45
    {
46 76
        $prefBuilder = new PreferenceBuilder();
47 76
        $mimePrefBuilder = new MimePreferenceBuilder();
48
49 76
        $this->tokenizer = new FieldTokenizer();
50 76
        $this->parser = new FieldParser($prefBuilder, $mimePrefBuilder);
51 76
        $this->negotiator = new Negotiator($prefBuilder, $mimePrefBuilder);
52 76
    }
53
54
    /**
55
     * Parse the Accept-Charset field & negotiate against server preferences, returns the preferred variant.
56
     *
57
     * @param string $clientField
58
     * @param string $serverField
59
     *
60
     * @return string
61
     */
62 8
    public function charsetBest($clientField, $serverField)
63
    {
64 8
        return $this->genericBest($clientField, $serverField, MatchedPreferenceInterface::CHARSET);
65 1
    }
66
67
    /**
68
     * Parse the Accept-Charset field & negotiate against server preferences, returns a sorted array of preferences.
69
     *
70
     * @param string $clientField
71
     * @param string $serverField
72
     *
73
     * @throws \LogicException
74
     *
75
     * @return MatchedPreferenceInterface[]
76
     */
77 7
    public function charsetAll($clientField, $serverField)
78
    {
79 7
        return $this->genericAll($clientField, $serverField, MatchedPreferenceInterface::CHARSET);
80
    }
81
82
    /**
83
     * Parse the Accept-Encoding field & negotiate against server preferences, returns the preferred variant.
84
     *
85
     * @param string $clientField
86
     * @param string $serverField
87
     *
88
     * @return string
89
     */
90 7
    public function encodingBest($clientField, $serverField)
91
    {
92 7
        return $this->genericBest($clientField, $serverField, MatchedPreferenceInterface::ENCODING);
93
    }
94
95
    /**
96
     * Parse the Accept-Encoding field & negotiate against server preferences, returns a sorted array of preferences.
97
     *
98
     * @param string $clientField
99
     * @param string $serverField
100
     *
101
     * @throws \LogicException
102
     *
103
     * @return MatchedPreferenceInterface[]
104
     */
105 7
    public function encodingAll($clientField, $serverField)
106
    {
107 7
        return $this->genericAll($clientField, $serverField, MatchedPreferenceInterface::ENCODING);
108
    }
109
110
    /**
111
     * Parse the Accept-Language field & negotiate against server preferences, returns the preferred variant.
112
     *
113
     * @param string $clientField
114
     * @param string $serverField
115
     *
116
     * @return string
117
     */
118 10
    public function languageBest($clientField, $serverField)
119
    {
120 10
        return $this->genericBest($clientField, $serverField, MatchedPreferenceInterface::LANGUAGE);
121
    }
122
123
    /**
124
     * Parse the Accept-Language field & negotiate against server preferences, returns a sorted array of preferences.
125
     *
126
     * @param string $clientField
127
     * @param string $serverField
128
     *
129
     * @throws \LogicException
130
     *
131
     * @return MatchedPreferenceInterface[]
132
     */
133 10
    public function languageAll($clientField, $serverField)
134
    {
135 10
        return $this->genericAll($clientField, $serverField, MatchedPreferenceInterface::LANGUAGE);
136
    }
137
138
    /**
139
     * Parse the Accept field & negotiate against server preferences, returns the preferred variant.
140
     *
141
     * @param string $clientField
142
     * @param string $serverField
143
     *
144
     * @return string
145
     */
146 12
    public function mimeBest($clientField, $serverField)
147
    {
148 12
        return $this->genericBest($clientField, $serverField, MatchedPreferenceInterface::MIME);
149
    }
150
151
    /**
152
     * Parse the Accept field & negotiate against server preferences, returns a sorted array of preferences.
153
     *
154
     * @param string $clientField
155
     * @param string $serverField
156
     *
157
     * @throws \LogicException
158
     *
159
     * @return MatchedPreferenceInterface[]
160
     */
161 16
    public function mimeAll($clientField, $serverField)
162
    {
163 16
        return $this->genericAll($clientField, $serverField, MatchedPreferenceInterface::MIME);
164
    }
165
166
    /**
167
     * Shared code to parse an Accept* field & negotiate against server preferences, returns the preferred variant.
168
     *
169
     * @param string $clientField
170
     * @param string $serverField
171
     * @param string $fromField
172
     *
173
     * @return string
174
     */
175 36
    private function genericBest($clientField, $serverField, $fromField)
176
    {
177 36
        $clientPrefList = $this->parsePreferences(false, $clientField, $fromField);
178 36
        $serverPrefList = $this->parsePreferences(true, $serverField, $fromField);
179
180 36
        return $this->negotiator->negotiateBest($clientPrefList, $serverPrefList, $fromField)->getVariant();
181
    }
182
183
    /**
184
     * Shared code to parse an Accept* field & negotiate against server preferences, returns an array of preferences.
185
     *
186
     * @param string $clientField
187
     * @param string $serverField
188
     * @param string $fromField
189
     *
190
     * @return MatchedPreferenceInterface[]
191
     */
192 40
    private function genericAll($clientField, $serverField, $fromField)
193
    {
194 40
        $clientPrefList = $this->parsePreferences(false, $clientField, $fromField);
195 40
        $serverPrefList = $this->parsePreferences(true, $serverField, $fromField);
196
197 40
        return $this->negotiator->negotiateAll($clientPrefList, $serverPrefList, $fromField);
198
    }
199
200
    /**
201
     * Parse client preferences and return an array of Preference instances
202
     *
203
     * @param bool $serverField
204
     * @param string $field
205
     * @param string $fromField
206
     *
207
     * @return PreferenceInterface[]
208
     */
209 76
    private function parsePreferences($serverField, $field, $fromField)
210
    {
211 76
        $tokenList = $this->tokenizer->tokenize($field, $fromField);
212
213 76
        return $this->parser->parse($tokenList, $serverField, $fromField);
214
    }
215
}
216