Completed
Push — master ( 9eea1d...6105f5 )
by Lucas
07:27
created

Schema::setSearchable()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
ccs 0
cts 0
cp 0
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 2
1
<?php
2
/**
3
 * Graviton Schema Document
4
 */
5
6
namespace Graviton\SchemaBundle\Document;
7
8
use \Doctrine\Common\Collections\ArrayCollection;
9
10
/**
11
 * Graviton\SchemaBundle\Document\Schema
12
 *
13
 * @author   List of contributors <https://github.com/libgraviton/graviton/graphs/contributors>
14
 * @license  http://opensource.org/licenses/gpl-license.php GNU Public License
15
 * @link     http://swisscom.ch
16
 */
17
class Schema
18
{
19
    /**
20
     * @var string
21
     */
22
    protected $title;
23
24
    /**
25
     * @var string
26
     */
27
    protected $description;
28
29
    /**
30
     * @var string
31
     */
32
    protected $type;
33
34
    /**
35
     * @var string
36
     */
37
    protected $format;
38
39
    /**
40
     * @var Schema
41
     */
42
    protected $items;
43
44
    /**
45
     * @var ArrayCollection
46
     */
47
    protected $properties;
48
49
    /**
50
     * @var Schema
51
     */
52
    protected $additionalProperties;
53
54
    /**
55
     * @var string[]
56
     */
57
    protected $required = array();
58
59
    /**
60
     * @var boolean
61
     */
62
    protected $translatable;
63
64
    /**
65
     * @var array
66
     */
67
    protected $refCollection = array();
68
69
    /**
70
     * possible event names this collection implements (queue events)
71
     *
72
     * @var array
73
     */
74
    protected $eventNames = array();
75
76
    /**
77
     * @var bool
78
     */
79
    protected $readOnly = false;
80
81
    /**
82
     * @var string[]
83
     */
84
    protected $searchable = array();
85
86
    /**
87
     * these are the BSON primitive types.
88
     * http://json-schema.org/latest/json-schema-core.html#anchor8
89
     * every type set *not* in this set will be carried over to 'format'
90
     *
91
     * @var string[]
92
     */
93
    protected $primitiveTypes = array(
94
        'array',
95
        'boolean',
96
        'integer',
97
        'number',
98
        'null',
99
        'object',
100
        'string'
101
    );
102
103
    /**
104
     * known non-primitive types we map to primitives here.
105
     * the type itself is set to the format.
106
     *
107
     * @var string[]
108
     */
109
    protected $specialTypeMapping = array(
110
        'extref' => 'string',
111
        'translatable' => 'object'
112
    );
113
114
    /**
115
     * Build properties
116
     */
117
    public function __construct()
118
    {
119
        $this->properties = new ArrayCollection();
120
    }
121
122
    /**
123
     * set title
124
     *
125
     * @param string $title title
126
     *
127
     * @return void
128
     */
129
    public function setTitle($title)
130
    {
131
        $this->title = $title;
132
    }
133
134
    /**
135
     * get title
136
     *
137
     * @return string
138
     */
139
    public function getTitle()
140
    {
141
        return $this->title;
142
    }
143
144
    /**
145
     * set description
146
     *
147
     * @param string $description description
148
     *
149
     * @return void
150
     */
151
    public function setDescription($description)
152
    {
153
        $this->description = $description;
154
    }
155
156
    /**
157
     * get description
158
     *
159
     * @return string
160
     */
161
    public function getDescription()
162
    {
163
        return $this->description;
164
    }
165
166
    /**
167
     * set type
168
     *
169
     * @param string $type type
170
     *
171
     * @return void
172
     */
173
    public function setType($type)
174
    {
175
        if ($type === 'int') {
176
            $type = 'integer';
177
        }
178
        if ($type === 'hash') {
179
            $type = 'object';
180
        }
181
182
        // handle non-primitive types
183
        if (!in_array($type, $this->primitiveTypes)) {
184
            $setType = 'string';
185
            if (isset($this->specialTypeMapping[$type])) {
186
                $setType = $this->specialTypeMapping[$type];
187
            }
188
            $this->type = $setType;
189
            $this->setFormat($type);
190
        } else {
191
            $this->type = $type;
192
        }
193
    }
194
195
    /**
196
     * get type
197
     *
198
     * @return string type
199
     */
200
    public function getType()
201
    {
202
        return $this->type;
203
    }
204
205
    /**
206
     * get format
207
     *
208
     * @return string format
209
     */
210
    public function getFormat()
211
    {
212
        return $this->format;
213
    }
214
215
    /**
216
     * sets format
217
     *
218
     * @param string $format format
219
     *
220
     * @return void
221
     */
222
    public function setFormat($format)
223
    {
224
        $this->format = $format;
225
    }
226
227
    /**
228
     * set items
229
     *
230
     * @param Schema $items items schema
231
     *
232
     * @return void
233
     */
234
    public function setItems($items)
235
    {
236
        $this->items = $items;
237
    }
238
239
    /**
240
     * get items
241
     *
242
     * @return Schema
243
     */
244
    public function getItems()
245
    {
246
        return $this->items;
247
    }
248
249
    /**
250
     * add a property
251
     *
252
     * @param string $name     property name
253
     * @param Schema $property property
254
     *
255
     * @return void
256
     */
257
    public function addProperty($name, $property)
258
    {
259
        $this->properties->set($name, $property);
260
    }
261
262
    /**
263
     * removes a property
264
     *
265
     * @param string $name property name
266
     *
267
     * @return void
268
     */
269
    public function removeProperty($name)
270
    {
271
        if (!$this->properties->containsKey($name)) {
272
            $this->properties->remove($this->properties->get($name));
273
        }
274
    }
275
276
    /**
277
     * returns a property
278
     *
279
     * @param string $name property name
280
     *
281
     * @return void|Schema property
282
     */
283
    public function getProperty($name)
284
    {
285
        return $this->properties->get($name);
286
    }
287
288
    /**
289
     * get properties
290
     *
291
     * @return ArrayCollection|null
292
     */
293
    public function getProperties()
294
    {
295
        if ($this->properties->isEmpty()) {
296
            return null;
297
        } else {
298
            return $this->properties;
299
        }
300
    }
301
302
    /**
303
     * set additionalProperties on schema
304
     *
305
     * @param Schema $schema schema to use for additionalProperties type
306
     *
307
     * @return void
308
     */
309
    public function setAdditionalProperties(Schema $schema)
310
    {
311
        $this->additionalProperties = $schema;
312
    }
313
314
    /**
315
     * get addtionalProperties for schema
316
     *
317
     * @return Schema
318
     */
319
    public function getAdditionalProperties()
320
    {
321
        return $this->additionalProperties;
322
    }
323
324
    /**
325
     * set required variables
326
     *
327
     * @param string[] $required arary of required fields
328
     *
329
     * @return void
330
     */
331
    public function setRequired($required)
332
    {
333
        $this->required = $required;
334
    }
335
336
    /**
337
     * get required fields
338
     *
339
     * @return string[]|null
340
     */
341
    public function getRequired()
342
    {
343
        $required = $this->required;
344
        if (empty($required)) {
345
            $required = null;
346
        }
347
348
        return $required;
349
    }
350
351
    /**
352
     * set translatable flag
353
     *
354
     * This flag is a local extension to json schema.
355
     *
356
     * @param boolean $translatable translatable flag
357
     *
358
     * @return void
359
     */
360
    public function setTranslatable($translatable)
361
    {
362
        if ($translatable === true) {
363
            $this->setType('translatable');
364
        } else {
365
            $this->setType('string');
366
        }
367
    }
368
369
    /**
370
     * get translatable flag
371
     *
372
     * @return boolean
373
     */
374
    public function isTranslatable()
375
    {
376
        $ret = false;
377
        if ($this->getFormat() == 'translatable') {
378
            $ret = true;
379
        }
380
381
        return $ret;
382
    }
383
384
    /**
385
     * set a array of urls that can extref refer to
386
     *
387
     * @param array $refCollection urls
388
     *
389
     * @return void
390
     */
391
    public function setRefCollection(array $refCollection)
392
    {
393
        $this->refCollection = $refCollection;
394
    }
395
396
    /**
397
     * get a collection of urls that can extref refer to
398
     *
399
     * @return array
400
     */
401
    public function getRefCollection()
402
    {
403
        $collection = $this->refCollection;
404
        if (empty($collection)) {
405
            $collection = null;
406
        }
407
408
        return $collection;
409
    }
410
411
    /**
412
     * set an array of possible event names
413
     *
414
     * @param array $eventNames event names
415
     *
416
     * @return void
417
     */
418
    public function setEventNames(array $eventNames)
419
    {
420
        $this->eventNames = array_values($eventNames);
421
    }
422
423
    /**
424
     * get a collection of possible event names
425
     *
426
     * @return array
427
     */
428
    public function getEventNames()
429
    {
430
        $collection = $this->eventNames;
431
        if (empty($collection)) {
432
            $collection = null;
433
        }
434
435
        return $collection;
436
    }
437
438
    /**
439
     * Set the readOnly flag
440
     *
441
     * @param bool $readOnly ReadOnly flag
442
     *
443
     * @return void
444
     */
445
    public function setReadOnly($readOnly)
446
    {
447
        $this->readOnly = (bool) $readOnly;
448
    }
449
450
    /**
451
     * Get the readOnly flag.
452
     * Returns null if the flag is set to false so the serializer will ignore it.
453
     *
454
     * @return bool|null true if readOnly isset to true or null if not
455
     */
456
    public function getReadOnly()
457
    {
458
        return $this->readOnly ? true : null;
459
    }
460
461
    /**
462
     * set searchable variables
463
     *
464
     * @param string[] $searchable arary of searchable fields
465
     *
466
     * @return void
467
     */
468
    public function setSearchable($searchable)
469
    {
470
        $this->searchable = $searchable;
471
    }
472
473
    /**
474
     * get searchable fields
475
     *
476
     * @return string[]|null
477
     */
478
    public function getSearchable()
479
    {
480
        $searchable = $this->searchable;
481
        if (empty($searchable)) {
482
            $searchable = null;
483
        }
484
485
        return $searchable;
486
    }
487
}
488