Completed
Pull Request — master (#12)
by
unknown
03:59
created

Dereferencer   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 179
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Test Coverage

Coverage 80.38%

Importance

Changes 0
Metric Value
dl 0
loc 179
ccs 41
cts 51
cp 0.8038
rs 10
c 0
b 0
f 0
wmc 18
lcom 1
cbo 7

13 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 3
A draft4() 0 4 1
A draft6() 0 4 1
A dereference() 0 11 2
A prepareArguments() 0 10 2
A getLoaderManager() 0 4 1
A setLoaderManager() 0 6 1
A getScopeResolver() 0 4 1
A setScopeResolver() 0 6 1
A getReferenceSerializer() 0 4 1
A setReferenceSerializer() 0 6 1
A crawl() 0 12 2
A loadExternalRef() 0 5 1
1
<?php
2
3
namespace League\JsonReference;
4
5
use League\JsonReference\ReferenceSerializer\SafeReferenceSerializer;
6
use League\JsonReference\ScopeResolver\JsonSchemaScopeResolver;
7
use League\JsonReference\ScopeResolver\NullScopeResolver;
8
9
final class Dereferencer implements DereferencerInterface
10
{
11
    /**
12
     * @var LoaderManager
13
     */
14
    private $loaderManager;
15
16
    /**
17
     * @var ScopeResolverInterface
18
     */
19
    private $scopeResolver;
20
21
    /**
22
     * @var ReferenceSerializerInterface
23
     */
24
    private $referenceSerializer;
25
26
    /**
27
     * Create a new Dereferencer.
28
     *
29
     * @param ScopeResolverInterface                             $scopeResolver
30
     * @param \League\JsonReference\ReferenceSerializerInterface $referenceSerializer
31
     */
32 58
    public function __construct(
33
        ScopeResolverInterface $scopeResolver = null,
34
        ReferenceSerializerInterface $referenceSerializer = null
35
    ) {
36 58
        $this->scopeResolver       = $scopeResolver ?: new NullScopeResolver();
37 58
        $this->referenceSerializer = $referenceSerializer ?: new SafeReferenceSerializer();
38 58
        $this->loaderManager       = new LoaderManager();
39
40 58
        Reference::setDereferencerInstance($this);
41 58
    }
42
43
    /**
44
     * Create a new dereferencer configured for dereferencing JSON Schema Draft4 schemas.
45
     *
46
     * @return \League\JsonReference\Dereferencer
47
     */
48 2
    public static function draft4()
49
    {
50 2
        return new self(new JsonSchemaScopeResolver(JsonSchemaScopeResolver::KEYWORD_DRAFT_4));
51
    }
52
53
    /**
54
     * Create a new dereferencer configured for dereferencing JSON Schema Draft6 schemas.
55
     *
56
     * @return \League\JsonReference\Dereferencer
57
     */
58
    public static function draft6()
59
    {
60
        return new self(new JsonSchemaScopeResolver(JsonSchemaScopeResolver::KEYWORD_DRAFT_6));
61
    }
62
63
    /**
64
     * {@inheritdoc}
65
     */
66 54
    public function dereference($schema, $uri = '')
67
    {
68 54
        return $this->crawl(
69 54
            $schema,
70 54
            $uri,
71 52
            function ($schema, $pointer, $ref, $scope) {
72 50
                $resolved = new Reference($ref, $scope, is_internal_ref($ref) ? $schema : null);
73 50
                return merge_ref($schema, $resolved, $pointer);
74 27
            }
75 27
        );
76
    }
77
78
    /**
79
     * @param object|string $schema
80
     * @param string        $uri
81
     *
82
     * @return array
83
     */
84 54
    private function prepareArguments($schema, $uri)
85
    {
86 54
        if (is_string($schema)) {
87 50
            $uri    = $schema;
88 50
            $schema = resolve_fragment($uri, $this->loadExternalRef($uri));
89 46
            $uri    = strip_fragment($uri);
90 23
        }
91
92 52
        return [$schema, $uri];
93
    }
94
95
    /**
96
     * @return LoaderManager
97
     */
98 12
    public function getLoaderManager()
99
    {
100 12
        return $this->loaderManager;
101
    }
102
103
    /**
104
     * @param \League\JsonReference\LoaderManager $loaderManager
105
     *
106
     * @return \League\JsonReference\Dereferencer
107
     */
108
    public function setLoaderManager(LoaderManager $loaderManager)
109
    {
110
        $this->loaderManager = $loaderManager;
111
112
        return $this;
113
    }
114
115
    /**
116
     * @return \League\JsonReference\ScopeResolverInterface
117
     */
118
    public function getScopeResolver()
119
    {
120
        return $this->scopeResolver;
121
    }
122
123
    /**
124
     * @param \League\JsonReference\ScopeResolverInterface $scopeResolver
125
     *
126
     * @return \League\JsonReference\Dereferencer
127
     */
128
    public function setScopeResolver(ScopeResolverInterface $scopeResolver)
129
    {
130
        $this->scopeResolver = $scopeResolver;
131
132
        return $this;
133
    }
134
135
    /**
136
     * @return \League\JsonReference\ReferenceSerializerInterface
137
     */
138 16
    public function getReferenceSerializer()
139
    {
140 16
        return $this->referenceSerializer;
141
    }
142
143
    /**
144
     * @param \League\JsonReference\ReferenceSerializerInterface $referenceSerializer
145
     *
146
     * @return \League\JsonReference\Dereferencer
147
     */
148 8
    public function setReferenceSerializer(ReferenceSerializerInterface $referenceSerializer)
149
    {
150 8
        $this->referenceSerializer = $referenceSerializer;
151
152 8
        return $this;
153
    }
154
155
    /**
156
     * @param string|object $schema
157
     * @param string        $uri
158
     * @param callable      $resolver
159
     *
160
     * @return object
161
     */
162 54
    private function crawl($schema, $uri, callable $resolver)
163
    {
164 54
        list($schema, $uri) = $this->prepareArguments($schema, $uri);
165
166 52
        foreach (schema_extract($schema, 'League\JsonReference\is_ref') as $pointer => $ref) {
167 50
            $scope = $this->scopeResolver->resolve($schema, $pointer, $uri);
168
169 50
            $schema = $resolver($schema, $pointer, $ref, $scope);
170 25
        }
171
172 50
        return $schema;
173
    }
174
175
    /**
176
     * Load an external ref and return the JSON object.
177
     *
178
     * @param string $reference
179
     *
180
     * @return object
181
     */
182 50
    private function loadExternalRef($reference)
183
    {
184 50
        list($prefix, $path) = parse_external_ref($reference);
185 48
        return $this->loaderManager->getLoader($prefix)->load($path);
186
    }
187
}
188