forked from mpoiriert/swagger
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Swagger.php
120 lines (102 loc) · 3.28 KB
/
Swagger.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
namespace Draw\Swagger;
use Doctrine\Common\Annotations\AnnotationReader;
use Draw\Swagger\Extraction\ExtractionContext;
use Draw\Swagger\Extraction\ExtractionContextInterface;
use Draw\Swagger\Extraction\ExtractorInterface;
use Draw\Swagger\Extraction\Extractor\SwaggerSchemaExtractor;
use JMS\Serializer\EventDispatcher\EventDispatcher;
use JMS\Serializer\SerializerBuilder;
use JMS\Serializer\SerializerInterface;
use Draw\Swagger\Schema\Swagger as Schema;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Validation;
/**
* Class Generator
*
* @author Martin Poirier Theoret <[email protected]>
*/
class Swagger
{
/**
* @var SerializerInterface
*/
private $serializer;
/**
* @var array
*/
private $extractors = array();
/**
* @var ExtractorInterface[]
*/
private $sortedExtractors;
public function __construct(SerializerInterface $serializer = null)
{
if (is_null($serializer)) {
$serializer = SerializerBuilder::create()->configureListeners(
function (EventDispatcher $dispatcher) {
$dispatcher->addSubscriber(new JMSSerializerListener());
}
)->build();
}
$this->serializer = $serializer;
$this->registerExtractor(new SwaggerSchemaExtractor($this->serializer), -1, 'swagger');
}
public function registerExtractor(ExtractorInterface $extractorInterface, $position = 0, $section = 'default')
{
$this->extractors[$section][$position][] = $extractorInterface;
}
public function validate(Schema $schema){
$validator = Validation::createValidatorBuilder()
->enableAnnotationMapping(new AnnotationReader())
->getValidator();
$result = $validator->validate($schema, null, true);
if(count($result)) {
throw new \InvalidArgumentException("" . $result);
}
}
/**
* @param Schema $schema
* @return string
*/
public function dump(Schema $schema)
{
$this->validate($schema);
return $this->serializer->serialize($schema, 'json');
}
/**
* @api
* @param string $jsonSchema
* @return mixed
*/
public function extract($source, $type = null, ExtractionContextInterface $extractionContext = null)
{
if (is_null($type)) {
$type = new Schema();
}
if (is_null($extractionContext)) {
$extractionContext = new ExtractionContext($this, $type);
}
$sortedExtractors = $this->getSortedExtractors();
foreach ($sortedExtractors as $extractor) {
if ($extractor->canExtract($source, $type, $extractionContext)) {
$extractor->extract($source, $type, $extractionContext);
}
}
return $type;
}
/**
* @return ExtractorInterface[]
*/
private function getSortedExtractors()
{
if (is_null($this->sortedExtractors)) {
$this->sortedExtractors = array();
foreach ($this->extractors as $section => $extractors) {
ksort($extractors);
$this->sortedExtractors = call_user_func_array('array_merge', $extractors);
}
}
return $this->sortedExtractors;
}
}