Completed
Push — master ( 060bfa...009823 )
by Mikaël
50:16 queued 31:14
created

Generator   F

Complexity

Total Complexity 115

Size/Duplication

Total Lines 902
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 14

Test Coverage

Coverage 99.65%

Importance

Changes 0
Metric Value
wmc 115
lcom 1
cbo 14
dl 0
loc 902
ccs 284
cts 285
cp 0.9965
rs 1.5999
c 0
b 0
f 0

91 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A initialize() 0 8 1
A initSoapClient() 0 7 2
A initContainers() 0 7 2
A initParsers() 0 7 2
A getParsers() 0 4 1
A initFiles() 0 7 2
A getFiles() 0 4 1
A initDirectory() 0 8 2
A initWsdl() 0 5 1
A doSanityChecks() 0 12 4
A doParse() 0 5 1
A doGenerate() 0 5 1
A generatePackage() 0 8 1
A parse() 0 4 1
A getStruct() 0 4 1
A getService() 0 4 1
A getServiceMethod() 0 4 2
A getServices() 0 4 1
A getStructs() 0 4 1
A getOptionCategory() 0 4 1
A setOptionCategory() 0 5 1
A getOptionGatherMethods() 0 4 1
A setOptionGatherMethods() 0 5 1
A getOptionGenericConstantsNames() 0 4 1
A setOptionGenericConstantsNames() 0 5 1
A getOptionGenerateTutorialFile() 0 4 1
A setOptionGenerateTutorialFile() 0 5 1
A getOptionNamespacePrefix() 0 4 1
A setOptionNamespacePrefix() 0 5 1
A getOptionAddComments() 0 4 1
A setOptionAddComments() 0 5 1
A getOptionStandalone() 0 4 1
A setOptionStandalone() 0 5 1
A getOptionValidation() 0 4 1
A setOptionValidation() 0 5 1
A getOptionStructClass() 0 4 1
A setOptionStructClass() 0 5 1
A getOptionStructArrayClass() 0 4 1
A setOptionStructArrayClass() 0 5 1
A getOptionSoapClientClass() 0 4 1
A setOptionSoapClientClass() 0 5 1
A getOptionPrefix() 0 4 2
A setOptionPrefix() 0 5 1
A getOptionSuffix() 0 4 2
A setOptionSuffix() 0 5 1
A getOptionBasicLogin() 0 4 1
A setOptionBasicLogin() 0 5 1
A getOptionBasicPassword() 0 4 1
A setOptionBasicPassword() 0 5 1
A getOptionProxyHost() 0 4 1
A getOptionProxyPort() 0 4 1
A setOptionProxyPort() 0 5 1
A getOptionProxyLogin() 0 4 1
A setOptionProxyLogin() 0 5 1
A getOptionProxyPassword() 0 4 1
A setOptionProxyPassword() 0 5 1
A getOptionOrigin() 0 4 1
A setOptionOrigin() 0 6 1
A getOptionDestination() 0 8 2
A setOptionDestination() 0 9 2
A getOptionSrcDirname() 0 4 1
A setOptionSrcDirname() 0 5 1
A getOptionSoapOptions() 0 4 1
A setOptionSoapOptions() 0 8 2
A getOptionComposerName() 0 4 1
A setOptionComposerName() 0 9 2
A getOptionComposerSettings() 0 4 1
A setOptionComposerSettings() 0 5 1
A getOptionStructsFolder() 0 4 1
A setOptionStructsFolder() 0 5 1
A getOptionArraysFolder() 0 4 1
A setOptionArraysFolder() 0 5 1
A getOptionEnumsFolder() 0 4 1
A setOptionEnumsFolder() 0 5 1
A getOptionServicesFolder() 0 4 1
A setOptionServicesFolder() 0 5 1
A getWsdl() 0 4 1
A setWsdl() 0 5 1
A addSchemaToWsdl() 0 7 4
A getGather() 0 4 1
A setOptionProxyHost() 0 5 1
A getServiceName() 0 4 1
A setOptions() 0 5 1
A getOptions() 0 4 1
A getSoapClient() 0 4 1
A getUrlContent() 0 9 3
A getContainers() 0 4 1
A jsonSerialize() 0 7 1
B instanceFromSerializedJson() 0 24 5
A getModelInstanceFromJsonArrayEntry() 0 4 1

How to fix   Complexity   

Complex Class

Complex classes like Generator often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Generator, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace WsdlToPhp\PackageGenerator\Generator;
4
5
use WsdlToPhp\PackageGenerator\Model\Schema;
6
use WsdlToPhp\PackageGenerator\Model\Wsdl;
7
use WsdlToPhp\PackageGenerator\Model\AbstractModel;
8
use WsdlToPhp\PackageGenerator\Model\EmptyModel;
9
use WsdlToPhp\PackageGenerator\Model\Struct;
10
use WsdlToPhp\PackageGenerator\Model\Service;
11
use WsdlToPhp\PackageGenerator\Model\Method;
12
use WsdlToPhp\PackageGenerator\Container\Model\Service as ServiceContainer;
13
use WsdlToPhp\PackageGenerator\Container\Model\Struct as StructContainer;
14
use WsdlToPhp\PackageGenerator\ConfigurationReader\GeneratorOptions;
15
use WsdlToPhp\PackageGenerator\WsdlHandler\Wsdl as WsdlDocument;
16
17
class Generator implements \JsonSerializable
18
{
19
    /**
20
     * Wsdl
21
     * @var Wsdl
22
     */
23
    private $wsdl;
24
    /**
25
     * @var GeneratorOptions
26
     */
27
    private $options;
28
    /**
29
     * Used parsers
30
     * @var GeneratorParsers
31
     */
32
    private $parsers;
33
    /**
34
     * Used files
35
     * @var GeneratorFiles
36
     */
37
    private $files;
38
    /**
39
     * Used containers
40
     * @var GeneratorContainers
41
     */
42
    private $containers;
43
    /**
44
     * Used SoapClient
45
     * @var GeneratorSoapClient
46
     */
47
    private $soapClient;
48
    /**
49
     * Constructor
50
     * @param GeneratorOptions $options
51
     */
52 740
    public function __construct(GeneratorOptions $options)
53
    {
54 740
        $this->setOptions($options)->initialize();
55 730
    }
56
    /**
57
     * @return Generator
58
     */
59 740
    protected function initialize()
60
    {
61 740
        return $this->initContainers()
62 740
            ->initParsers()
63 740
            ->initFiles()
64 740
            ->initSoapClient()
65 735
            ->initWsdl();
66
    }
67
    /**
68
     * @throws \InvalidArgumentException
69
     * @return Generator
70
     */
71 740
    protected function initSoapClient()
72
    {
73 740
        if (!isset($this->soapClient)) {
74 740
            $this->soapClient = new GeneratorSoapClient($this);
75 441
        }
76 735
        return $this;
77
    }
78
    /**
79
     * @return Generator
80
     */
81 740
    protected function initContainers()
82
    {
83 740
        if (!isset($this->containers)) {
84 740
            $this->containers = new GeneratorContainers($this);
85 444
        }
86 740
        return $this;
87
    }
88
    /**
89
     * @return Generator
90
     */
91 740
    protected function initParsers()
92
    {
93 740
        if (!isset($this->parsers)) {
94 740
            $this->parsers = new GeneratorParsers($this);
95 444
        }
96 740
        return $this;
97
    }
98
    /**
99
     * @return GeneratorParsers
100
     */
101 150
    public function getParsers()
102
    {
103 150
        return $this->parsers;
104
    }
105
    /**
106
     * @return Generator
107
     */
108 740
    protected function initFiles()
109
    {
110 740
        if (!isset($this->files)) {
111 740
            $this->files = new GeneratorFiles($this);
112 444
        }
113 740
        return $this;
114
    }
115
    /**
116
     * @return GeneratorFiles
117
     */
118 60
    public function getFiles()
119
    {
120 60
        return $this->files;
121
    }
122
    /**
123
     * @throws \InvalidArgumentException
124
     * @return Generator
125
     */
126 35
    protected function initDirectory()
127
    {
128 35
        Utils::createDirectory($this->getOptions()->getDestination());
129 35
        if (!is_writable($this->getOptionDestination())) {
130 5
            throw new \InvalidArgumentException(sprintf('Unable to use dir "%s" as dir does not exists, its creation has been impossible or it\'s not writable', $this->getOptionDestination()), __LINE__);
131
        }
132 30
        return $this;
133
    }
134
    /**
135
     * @return Generator
136
     */
137 740
    protected function initWsdl()
138
    {
139 740
        $this->setWsdl(new Wsdl($this, $this->getOptionOrigin(), $this->getUrlContent($this->getOptionOrigin())));
140 735
        return $this;
141
    }
142
    /**
143
     * @return Generator
144
     */
145 45
    protected function doSanityChecks()
146
    {
147 45
        $destination = $this->getOptionDestination();
148 45
        if (empty($destination)) {
149 5
            throw new \InvalidArgumentException('Package\'s destination must be defined', __LINE__);
150
        }
151 40
        $composerName = $this->getOptionComposerName();
152 40
        if ($this->getOptionStandalone() && empty($composerName)) {
153 5
            throw new \InvalidArgumentException('Package\'s composer name must be defined', __LINE__);
154
        }
155 35
        return $this;
156
    }
157
    /**
158
     * @return Generator
159
     */
160 40
    protected function doParse()
161
    {
162 40
        $this->parsers->doParse();
163 40
        return $this;
164
    }
165
    /**
166
     * @return Generator
167
     */
168 30
    protected function doGenerate()
169
    {
170 30
        $this->files->doGenerate();
171 30
        return $this;
172
    }
173
    /**
174
     * Generates all classes based on options
175
     * @return Generator
176
     */
177 45
    public function generatePackage()
178
    {
179 27
        return $this
180 45
            ->doSanityChecks()
181 35
            ->parse()
182 35
            ->initDirectory()
183 30
            ->doGenerate();
184
    }
185
    /**
186
     * Only parses what has to be parsed, called before actually generating the package
187
     * @return Generator
188
     */
189 40
    public function parse()
190
    {
191 40
        return $this->doParse();
192
    }
193
    /**
194
     * Gets the struct by its name
195
     * @uses Generator::getStructs()
196
     * @param string $structName the original struct name
197
     * @return Struct|null
198
     */
199 540
    public function getStruct($structName)
200
    {
201 540
        return $this->getStructs()->getStructByName($structName);
202
    }
203
    /**
204
     * Gets a service by its name
205
     * @param string $serviceName the service name
206
     * @return Service|null
207
     */
208 185
    public function getService($serviceName)
209
    {
210 185
        return $this->getServices()->getServiceByName($serviceName);
211
    }
212
    /**
213
     * Returns the method
214
     * @uses Generator::getServiceName()
215
     * @uses Generator::getService()
216
     * @uses Service::getMethod()
217
     * @param string $methodName the original function name
218
     * @return Method|null
219
     */
220 175
    public function getServiceMethod($methodName)
221
    {
222 175
        return $this->getService($this->getServiceName($methodName)) instanceof Service ? $this->getService($this->getServiceName($methodName))->getMethod($methodName) : null;
223
    }
224
    /**
225
     * @return ServiceContainer
226
     */
227 390
    public function getServices()
228
    {
229 390
        return $this->containers->getServices();
230
    }
231
    /**
232
     * @return StructContainer
233
     */
234 630
    public function getStructs()
235
    {
236 630
        return $this->containers->getStructs();
237
    }
238
    /**
239
     * Sets the optionCategory value
240
     * @return string
241
     */
242 390
    public function getOptionCategory()
243
    {
244 390
        return $this->options->getCategory();
245
    }
246
    /**
247
     * Sets the optionCategory value
248
     * @param string $category
249
     * @return Generator
250
     */
251 10
    public function setOptionCategory($category)
252
    {
253 10
        $this->options->setCategory($category);
254 10
        return $this;
255
    }
256
    /**
257
     * Sets the optionGatherMethods value
258
     * @return string
259
     */
260 365
    public function getOptionGatherMethods()
261
    {
262 365
        return $this->options->getGatherMethods();
263
    }
264
    /**
265
     * Sets the optionGatherMethods value
266
     * @param string $gatherMethods
267
     * @return Generator
268
     */
269 5
    public function setOptionGatherMethods($gatherMethods)
270
    {
271 5
        $this->options->setGatherMethods($gatherMethods);
272 5
        return $this;
273
    }
274
    /**
275
     * Gets the optionGenericConstantsNames value
276
     * @return bool
277
     */
278 80
    public function getOptionGenericConstantsNames()
279
    {
280 80
        return $this->options->getGenericConstantsName();
281
    }
282
    /**
283
     * Sets the optionGenericConstantsNames value
284
     * @param bool $genericConstantsNames
285
     * @return Generator
286
     */
287 10
    public function setOptionGenericConstantsNames($genericConstantsNames)
288
    {
289 10
        $this->options->setGenericConstantsName($genericConstantsNames);
290 10
        return $this;
291
    }
292
    /**
293
     * Gets the optionGenerateTutorialFile value
294
     * @return bool
295
     */
296 40
    public function getOptionGenerateTutorialFile()
297
    {
298 40
        return $this->options->getGenerateTutorialFile();
299
    }
300
    /**
301
     * Sets the optionGenerateTutorialFile value
302
     * @param bool $generateTutorialFile
303
     * @return Generator
304
     */
305 5
    public function setOptionGenerateTutorialFile($generateTutorialFile)
306
    {
307 5
        $this->options->setGenerateTutorialFile($generateTutorialFile);
308 5
        return $this;
309
    }
310
    /**
311
     * Gets the optionNamespacePrefix value
312
     * @return string
313
     */
314 360
    public function getOptionNamespacePrefix()
315
    {
316 360
        return $this->options->getNamespace();
317
    }
318
    /**
319
     * Sets the optionGenerateTutorialFile value
320
     * @param string $namespace
321
     * @return Generator
322
     */
323 25
    public function setOptionNamespacePrefix($namespace)
324
    {
325 25
        $this->options->setNamespace($namespace);
326 25
        return $this;
327
    }
328
    /**
329
     * Gets the optionAddComments value
330
     * @return array
331
     */
332 285
    public function getOptionAddComments()
333
    {
334 285
        return $this->options->getAddComments();
335
    }
336
    /**
337
     * Sets the optionAddComments value
338
     * @param array $addComments
339
     * @return Generator
340
     */
341 5
    public function setOptionAddComments($addComments)
342
    {
343 5
        $this->options->setAddComments($addComments);
344 5
        return $this;
345
    }
346
    /**
347
     * Gets the optionStandalone value
348
     * @return bool
349
     */
350 80
    public function getOptionStandalone()
351
    {
352 80
        return $this->options->getStandalone();
353
    }
354
    /**
355
     * Sets the optionStandalone value
356
     * @param bool $standalone
357
     * @return Generator
358
     */
359 15
    public function setOptionStandalone($standalone)
360
    {
361 15
        $this->options->setStandalone($standalone);
362 15
        return $this;
363
    }
364
    /**
365
     * Gets the optionValidation value
366
     * @return bool
367
     */
368 165
    public function getOptionValidation()
369
    {
370 165
        return $this->options->getValidation();
371
    }
372
    /**
373
     * Sets the optionValidation value
374
     * @param bool $validation
375
     * @return Generator
376
     */
377 35
    public function setOptionValidation($validation)
378
    {
379 35
        $this->options->setValidation($validation);
380 35
        return $this;
381
    }
382
    /**
383
     * Gets the optionStructClass value
384
     * @return string
385
     */
386 140
    public function getOptionStructClass()
387
    {
388 140
        return $this->options->getStructClass();
389
    }
390
    /**
391
     * Sets the optionStructClass value
392
     * @param string $structClass
393
     * @return Generator
394
     */
395 15
    public function setOptionStructClass($structClass)
396
    {
397 15
        $this->options->setStructClass($structClass);
398 15
        return $this;
399
    }
400
    /**
401
     * Gets the optionStructArrayClass value
402
     * @return string
403
     */
404 50
    public function getOptionStructArrayClass()
405
    {
406 50
        return $this->options->getStructArrayClass();
407
    }
408
    /**
409
     * Sets the optionStructArrayClass value
410
     * @param string $structArrayClass
411
     * @return Generator
412
     */
413 5
    public function setOptionStructArrayClass($structArrayClass)
414
    {
415 5
        $this->options->setStructArrayClass($structArrayClass);
416 5
        return $this;
417
    }
418
    /**
419
     * Gets the optionSoapClientClass value
420
     * @return string
421
     */
422 125
    public function getOptionSoapClientClass()
423
    {
424 125
        return $this->options->getSoapClientClass();
425
    }
426
    /**
427
     * Sets the optionSoapClientClass value
428
     * @param string $soapClientClass
429
     * @return Generator
430
     */
431 5
    public function setOptionSoapClientClass($soapClientClass)
432
    {
433 5
        $this->options->setSoapClientClass($soapClientClass);
434 5
        return $this;
435
    }
436
    /**
437
     * Gets the package name prefix
438
     * @param bool $ucFirst ucfirst package name prefix or not
439
     * @return string
440
     */
441 745
    public function getOptionPrefix($ucFirst = true)
442
    {
443 745
        return $ucFirst ? ucfirst($this->getOptions()->getPrefix()) : $this->getOptions()->getPrefix();
444
    }
445
    /**
446
     * Sets the package name prefix
447
     * @param string $optionPrefix
448
     * @return Generator
449
     */
450 105
    public function setOptionPrefix($optionPrefix)
451
    {
452 105
        $this->options->setPrefix($optionPrefix);
453 105
        return $this;
454
    }
455
    /**
456
     * Gets the package name suffix
457
     * @param bool $ucFirst ucfirst package name suffix or not
458
     * @return string
459
     */
460 715
    public function getOptionSuffix($ucFirst = true)
461
    {
462 715
        return $ucFirst ? ucfirst($this->getOptions()->getSuffix()) : $this->getOptions()->getSuffix();
463
    }
464
    /**
465
     * Sets the package name suffix
466
     * @param string $optionSuffix
467
     * @return Generator
468
     */
469 35
    public function setOptionSuffix($optionSuffix)
470
    {
471 35
        $this->options->setSuffix($optionSuffix);
472 35
        return $this;
473
    }
474
    /**
475
     * Gets the optionBasicLogin value
476
     * @return string
477
     */
478 760
    public function getOptionBasicLogin()
479
    {
480 760
        return $this->options->getBasicLogin();
481
    }
482
    /**
483
     * Sets the optionBasicLogin value
484
     * @param string $optionBasicLogin
485
     * @return Generator
486
     */
487 5
    public function setOptionBasicLogin($optionBasicLogin)
488
    {
489 5
        $this->options->setBasicLogin($optionBasicLogin);
490 5
        return $this;
491
    }
492
    /**
493
     * Gets the optionBasicPassword value
494
     * @return string
495
     */
496 760
    public function getOptionBasicPassword()
497
    {
498 760
        return $this->options->getBasicPassword();
499
    }
500
    /**
501
     * Sets the optionBasicPassword value
502
     * @param string $optionBasicPassword
503
     * @return Generator
504
     */
505 5
    public function setOptionBasicPassword($optionBasicPassword)
506
    {
507 5
        $this->options->setBasicPassword($optionBasicPassword);
508 5
        return $this;
509
    }
510
    /**
511
     * Gets the optionProxyHost value
512
     * @return string
513
     */
514 760
    public function getOptionProxyHost()
515
    {
516 760
        return $this->options->getProxyHost();
517
    }
518
    /**
519
     * Sets the optionProxyHost value
520
     * @param string $optionProxyHost
521
     * @return Generator
522
     */
523 5
    public function setOptionProxyHost($optionProxyHost)
524
    {
525 5
        $this->options->setProxyHost($optionProxyHost);
526 5
        return $this;
527 1
    }
528
    /**
529
     * Gets the optionProxyPort value
530
     * @return string
531
     */
532 760
    public function getOptionProxyPort()
533
    {
534 760
        return $this->options->getProxyPort();
535
    }
536
    /**
537
     * Sets the optionProxyPort value
538
     * @param string $optionProxyPort
539
     * @return Generator
540
     */
541 5
    public function setOptionProxyPort($optionProxyPort)
542
    {
543 5
        $this->options->setProxyPort($optionProxyPort);
544 5
        return $this;
545
    }
546
    /**
547
     * Gets the optionProxyLogin value
548
     * @return string
549
     */
550 760
    public function getOptionProxyLogin()
551
    {
552 760
        return $this->options->getProxyLogin();
553
    }
554
    /**
555
     * Sets the optionProxyLogin value
556
     * @param string $optionProxyLogin
557
     * @return Generator
558
     */
559 5
    public function setOptionProxyLogin($optionProxyLogin)
560
    {
561 5
        $this->options->setProxyLogin($optionProxyLogin);
562 5
        return $this;
563
    }
564
    /**
565
     * Gets the optionProxyPassword value
566
     * @return string
567
     */
568 760
    public function getOptionProxyPassword()
569
    {
570 760
        return $this->options->getProxyPassword();
571
    }
572
    /**
573
     * Sets the optionProxyPassword value
574
     * @param string $optionProxyPassword
575
     * @return Generator
576
     */
577 5
    public function setOptionProxyPassword($optionProxyPassword)
578
    {
579 5
        $this->options->setProxyPassword($optionProxyPassword);
580 5
        return $this;
581
    }
582
    /**
583
     * Gets the optionOrigin value
584
     * @return string
585
     */
586 755
    public function getOptionOrigin()
587
    {
588 755
        return $this->options->getOrigin();
589
    }
590
    /**
591
     * Sets the optionOrigin value
592
     * @param string $optionOrigin
593
     * @return Generator
594
     */
595 5
    public function setOptionOrigin($optionOrigin)
596
    {
597 5
        $this->options->setOrigin($optionOrigin);
598 5
        $this->initWsdl();
599 5
        return $this;
600
    }
601
    /**
602
     * Gets the optionDestination value
603
     * @return string
604
     */
605 415
    public function getOptionDestination()
606
    {
607 415
        $destination = $this->options->getDestination();
608 415
        if (!empty($destination)) {
609 410
            $destination = rtrim($destination, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
610 246
        }
611 415
        return $destination;
612
    }
613
    /**
614
     * Sets the optionDestination value
615
     * @param string $optionDestination
616
     * @return Generator
617
     */
618 15
    public function setOptionDestination($optionDestination)
619
    {
620 15
        if (!empty($optionDestination)) {
621 10
            $this->options->setDestination(rtrim($optionDestination, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR);
622 6
        } else {
623 5
            throw new \InvalidArgumentException('Package\'s destination can\'t be empty', __LINE__);
624
        }
625 10
        return $this;
626
    }
627
    /**
628
     * Gets the optionSrcDiname value
629
     * @return string
630
     */
631 360
    public function getOptionSrcDirname()
632
    {
633 360
        return $this->options->getSrcDirname();
634
    }
635
    /**
636
     * Sets the optionSrcDirname value
637
     * @param string $optionSrcDirname
638
     * @return Generator
639
     */
640 15
    public function setOptionSrcDirname($optionSrcDirname)
641
    {
642 15
        $this->options->setSrcDirname($optionSrcDirname);
643 15
        return $this;
644
    }
645
    /**
646
     * Gets the optionSoapOptions value
647
     * @return string
648
     */
649 750
    public function getOptionSoapOptions()
650
    {
651 750
        return $this->options->getSoapOptions();
652
    }
653
    /**
654
     * Sets the optionSoapOptions value
655
     * @param array $optionSoapOptions
656
     * @return Generator
657
     */
658 5
    public function setOptionSoapOptions($optionSoapOptions)
659
    {
660 5
        $this->options->setSoapOptions($optionSoapOptions);
661 5
        if ($this->getSoapClient() instanceof GeneratorSoapClient) {
662 5
            $this->getSoapClient()->initSoapClient();
663 3
        }
664 5
        return $this;
665
    }
666
    /**
667
     * Gets the optionComposerName value
668
     * @return string
669
     */
670 65
    public function getOptionComposerName()
671
    {
672 65
        return $this->options->getComposerName();
673
    }
674
    /**
675
     * Sets the optionComposerName value
676
     * @param string $optionComposerName
677
     * @return Generator
678
     */
679 35
    public function setOptionComposerName($optionComposerName)
680
    {
681 35
        if (!empty($optionComposerName)) {
682 30
            $this->options->setComposerName($optionComposerName);
683 18
        } else {
684 5
            throw new \InvalidArgumentException('Package\'s composer name can\'t be empty', __LINE__);
685
        }
686 30
        return $this;
687
    }
688
    /**
689
     * Gets the optionComposerSettings value
690
     * @return array
691
     */
692 50
    public function getOptionComposerSettings()
693
    {
694 50
        return $this->options->getComposerSettings();
695
    }
696
    /**
697
     * Sets the optionComposerSettings value
698
     * @param array $optionComposerSettings
699
     * @return Generator
700
     */
701 10
    public function setOptionComposerSettings(array $optionComposerSettings = array())
702
    {
703 10
        $this->options->setComposerSettings($optionComposerSettings);
704 10
        return $this;
705
    }
706
    /**
707
     * Gets the optionStructsFolder value
708
     * @return string
709
     */
710 360
    public function getOptionStructsFolder()
711
    {
712 360
        return $this->options->getStructsFolder();
713
    }
714
    /**
715
     * Sets the optionStructsFolder value
716
     * @param string $optionStructsFolder
717
     * @return Generator
718
     */
719 5
    public function setOptionStructsFolder($optionStructsFolder)
720
    {
721 5
        $this->options->setStructsFolder($optionStructsFolder);
722 5
        return $this;
723
    }
724
    /**
725
     * Gets the optionArraysFolder value
726
     * @return string
727
     */
728 70
    public function getOptionArraysFolder()
729
    {
730 70
        return $this->options->getArraysFolder();
731
    }
732
    /**
733
     * Sets the optionArraysFolder value
734
     * @param string $optionArraysFolder
735
     * @return Generator
736
     */
737 5
    public function setOptionArraysFolder($optionArraysFolder)
738
    {
739 5
        $this->options->setArraysFolder($optionArraysFolder);
740 5
        return $this;
741
    }
742
    /**
743
     * Gets the optionEnumsFolder value
744
     * @return string
745
     */
746 140
    public function getOptionEnumsFolder()
747
    {
748 140
        return $this->options->getEnumsFolder();
749
    }
750
    /**
751
     * Sets the optionEnumsFolder value
752
     * @param string $optionEnumsFolder
753
     * @return Generator
754
     */
755 5
    public function setOptionEnumsFolder($optionEnumsFolder)
756
    {
757 5
        $this->options->setEnumsFolder($optionEnumsFolder);
758 5
        return $this;
759
    }
760
    /**
761
     * Gets the optionServicesFolder value
762
     * @return string
763
     */
764 710
    public function getOptionServicesFolder()
765
    {
766 710
        return $this->options->getServicesFolder();
767
    }
768
    /**
769
     * Sets the optionServicesFolder value
770
     * @param string $optionServicesFolder
771
     * @return Generator
772
     */
773 5
    public function setOptionServicesFolder($optionServicesFolder)
774
    {
775 5
        $this->options->setServicesFolder($optionServicesFolder);
776 5
        return $this;
777
    }
778
    /**
779
     * Gets the WSDL
780
     * @return Wsdl|null
781
     */
782 570
    public function getWsdl()
783
    {
784 570
        return $this->wsdl;
785
    }
786
    /**
787
     * Sets the WSDLs
788
     * @param Wsdl $wsdl
789
     * @return Generator
790
     */
791 735
    protected function setWsdl(Wsdl $wsdl)
792
    {
793 735
        $this->wsdl = $wsdl;
794 735
        return $this;
795
    }
796
    /**
797
     * Adds Wsdl location
798
     * @param Wsdl $wsdl
799
     * @param string $schemaLocation
800
     * @return Generator
801
     */
802 150
    public function addSchemaToWsdl(Wsdl $wsdl, $schemaLocation)
803
    {
804 150
        if (!empty($schemaLocation) && $wsdl->getContent() instanceof WsdlDocument && $wsdl->getContent()->getExternalSchema($schemaLocation) === null) {
805 150
            $wsdl->getContent()->addExternalSchema(new Schema($wsdl->getGenerator(), $schemaLocation, $this->getUrlContent($schemaLocation)));
806 90
        }
807 150
        return $this;
808
    }
809
    /**
810
     * Gets gather name class
811
     * @param AbstractModel $model the model for which we generate the folder
812
     * @return string
813
     */
814 355
    private function getGather(AbstractModel $model)
815
    {
816 355
        return Utils::getPart($this->getOptionGatherMethods(), $model->getCleanName());
817
    }
818
    /**
819
     * Returns the service name associated to the method/operation name in order to gather them in one service class
820
     * @param string $methodName original operation/method name
821
     * @return string
822
     */
823 355
    public function getServiceName($methodName)
824
    {
825 355
        return ucfirst($this->getGather(new EmptyModel($this, $methodName)));
826
    }
827
    /**
828
     * @param GeneratorOptions $options
829
     * @return Generator
830
     */
831 740
    protected function setOptions(GeneratorOptions $options = null)
832
    {
833 740
        $this->options = $options;
834 740
        return $this;
835
    }
836
    /**
837
     * @return GeneratorOptions
838
     */
839 755
    public function getOptions()
840
    {
841 755
        return $this->options;
842
    }
843
    /**
844
     * @return GeneratorSoapClient
845
     */
846 300
    public function getSoapClient()
847
    {
848 300
        return $this->soapClient;
849
    }
850
    /**
851
     * @param string $url
852
     * @return string
853
     */
854 745
    public function getUrlContent($url)
855
    {
856 745
        if (strpos($url, '://') !== false) {
857 10
            return Utils::getContentFromUrl($url, $this->getOptionBasicLogin(), $this->getOptionBasicPassword(), $this->getOptionProxyHost(), $this->getOptionProxyPort(), $this->getOptionProxyLogin(), $this->getOptionProxyPassword(), $this->getSoapClient()->getSoapClientStreamContextOptions());
858 735
        } elseif (is_file($url)) {
859 730
            return file_get_contents($url);
860
        }
861 5
        return null;
862
    }
863
    /**
864
     * @return GeneratorContainers
865
     */
866 365
    public function getContainers()
867
    {
868 365
        return $this->containers;
869
    }
870
    /**
871
     * @return array
872
     */
873 5
    public function jsonSerialize()
874
    {
875
        return array(
876 5
            'containers' => $this->containers,
877 5
            'options' => $this->options,
878 3
        );
879
    }
880
    /**
881
     * @param string $json
882
     * @throws \InvalidArgumentException
883
     * @return Generator
884
     */
885 365
    public static function instanceFromSerializedJson($json)
886
    {
887 365
        $decodedJson = json_decode($json, true);
888 365
        if (json_last_error() === JSON_ERROR_NONE) {
889
            // load options first
890 365
            $options = GeneratorOptions::instance();
891 365
            foreach ($decodedJson['options']as $name => $value) {
892 365
                $options->setOptionValue($name, $value);
893 219
            }
894
            // create generator instance with options
895 365
            $instance = new static($options);
896
            // load services
897 365
            foreach ($decodedJson['containers']['services'] as $service) {
898 365
                $instance->getContainers()->getServices()->add(self::getModelInstanceFromJsonArrayEntry($instance, $service));
899 219
            }
900
            // load sructs
901 365
            foreach ($decodedJson['containers']['structs'] as $struct) {
902 365
                $instance->getContainers()->getStructs()->add(self::getModelInstanceFromJsonArrayEntry($instance, $struct));
903 219
            }
904 219
        } else {
905
            throw new \InvalidArgumentException(sprintf('Json is invalid, please check error %s', json_last_error()));
906
        }
907 365
        return $instance;
908
    }
909
    /**
910
     * @param Generator $generator
911
     * @param array $jsonArrayEntry
912
     * @return AbstractModel
913
     */
914 365
    private static function getModelInstanceFromJsonArrayEntry(Generator $generator, array $jsonArrayEntry)
915
    {
916 365
        return AbstractModel::instanceFromSerializedJson($generator, $jsonArrayEntry);
917
    }
918
}
919